一般在3-tier 架構下的應用系統,最常見的問題就是Out of Memory(記憶體不足),或Memory leak(記憶體洩漏)的狀況,最後往往導致Application
Server失效與系統Crash,讓管理人員必需常常守候在Server 旁邊,注意它關心它系統狀況與運作情形避免它Crash。而本專題報導則是針對此類型問題
的發生,從JVM 其基本架構開始說明,並採用問答與實例的方式進行說明解釋,並且提供檢查的項目說明,可藉由這些項目自我檢測,以避免發生Memory
leak 有效掌握Resource。
何謂Out of Memory?Memory leak?
Out of Memory 定義
記憶體不論Java heap 或Native Memory 是不足以提供給元件使用。
Memory leak 定義
元件的記憶體使用不論在Java heap 或Native Memory 中持續成長,
最後導致發生Out of memory 的情況。
何謂Java heap, Native memory and Process Size
要了解Memory leak 問題的發生,首先先了解幾個JVM 的記憶體管理重要的名稱:
Java heap
這是JVM 用來配置Java objects 的記憶體,Java heap 記憶體大小是透過命令執行列中下的參數-Xmx 設定的。假如最大的heap size 沒有定義,那麼它的
大小限制將由JVM 視當時情況如機器的實體記憶體與剩下可用的記憶體決定。因此一般都建議要設定最大的Java heap 的值。
Native Memory
這是JVM 用來它內部運作的記憶體,Native Memory Heap 將是會被JVM使用,而它的大小取決於產生的程式碼、產生的thread、GC
時用於保存javaobject 資訊與產生或最佳化程式碼時的暫存空間假如它是Third party 的native module,它將可能使用Native Memory.例如:native
JDBC driver 就是配置Native Memory。
Native Memory 的最大值是會受限於任何一OS 的virtual process size 與已經被參數-Xmx 指定給Java Heap 的記憶體大小。例如:假如應用系統能夠
總共配置3GB,並且假如最大的Java Heap 大小為1G,那麼Native Memory 最大值可能接近2GB。
Process Size
Process Size 將會是Java Heap、Native Memory 與被用於已載入執行與函式庫的記憶體的加總,在32 位元的作業系統,一個處理程序虛擬定址空間能
夠到4GB;若超過4GB,作業系統的核心將會預留一部份給它自己使用(一般是1~2GB)。那麼剩下的就是給應用系統。Windows:假設有4GB 的記憶體,預
設給應用系統使用最大2GB 與而另外的2GB
是給核心使用。僅管如此,在一些不同版本的Windows,可以用/3GB參數切換這個比例值,讓應用系統可以得到3GB 的記憶體。詳細可參考Microsoft網站,
址址:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/bootini_1fcj.asp
Red Hat AS 2.1:應用系統可以使用到最大記憶體大小為3GB其他的作業系統,請參考該作業系統文件做設定。
Process 定址空間與實體記憶體的不同
每一個Process 都擁有自己的定址空間,在32 位元作業系統,這個定址空間是介於0 到4GB 之間。這是機器上獨立的RAM 或Swap Space,機器上全部
的實體記憶體是同一台機器上的RAM 與Swap Space 的加總,所有執行中的Process 分享這個實體記憶體。Process 的記憶體定址是虛擬的。作業系統
核心對應這虛擬位址到實體位址。實體位址指到實體記憶體中的某一個位置。在一台機器上任何特定時間所有被正在執行的Process 的虛擬記憶體,其
加總不能超出在同一台機器上全部實體記憶體大小。
為何會Out of Memory 問題發生?在這個狀況發生
JVM 會做什麼處置?
Out of Memory in java heap
假如JVM 無法在java heap 取得記憶體來配置更多的java objects,JVM 會丟出java out of memory 錯誤,JVM 無法配置更多的java objects 假如heap
是塞滿了正在使用的objects 與java heap 無法再擴展。在這個狀況下,在丟出java.lang.OutOfMemoryError 錯誤訊息後,JVM 會讓應用系統決定要做什
麼。例如:應用系統自行監控這個錯誤並且決定在那一個的模式下停止執行,或者不管這個錯誤。假如應用系統不處理這個錯誤,那麼thread 會丟出這個錯
誤訊息並且停止執行離開JVM(假如使用java threaddump,你將不會看到這個thread)。
WebLogic Server 在這個狀況,假如它是由一個execute thread 丟出,這個錯誤將會被監控並且會做記錄。假如這是連續不斷被丟出來,那麼core
healthmonitor thread 會停止WebLogic Server 運作。
Out of Memory in native heap
假如無法native memory 配置到記憶體空間,則JVM 丟出native out ofmemory,這通常發生在Process 達到作業系統Process size 的限制或是機器
執行超出RAM 與Swap Space 加總.當這個發生時,JVM 會處理native out memory 情況,記錄訊息說明它執行到 out of native memory 或無法取得記憶體
並且離開。假如JVM 或任何被載入的module(像是libc 或是一個Third party 的module)無法處理這個native out ofmemory 狀況,然後作業系統將會傳
送一個sigabort 訊息給JVM,這樣將會使JVM 停止離開。通當JVM 將會產生程式碼檔當它取得sigabort 訊號。
處理此問題步驟
Java Out of Memory
1. 收集與分析verbose gc 的錯誤訊息輸出
分享到:
相关推荐
"Java.lang.OutOfMemoryError: Java heap space 解决方法" Java.lang.OutOfMemoryError: Java heap space 是 Java 中的一个常见错误,它发生时,Java 虚拟机 (JVM) 无法分配对象,因为堆空间不足。下面是解决该问题...
### Java Heap Space 异常详解及解决方案 #### 标题:Java 抛出 Java Heap Space 错误 在 Java 应用程序运行过程中,如果出现内存不足的情况,JVM(Java虚拟机)会抛出 `java.lang.OutOfMemoryError: Java heap ...
- 分析堆转储文件(heap dump),使用MAT(Memory Analyzer Tool)、Eclipse Memory Analyzer等工具找出内存泄漏的源头。 4. **优化垃圾回收策略** - 根据应用特性选择合适的垃圾回收器(如G1、CMS、Parallel等)...
### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....
在Java编程中,"java heap space"内存溢出是一个常见的问题,它通常发生在应用程序尝试分配超过JVM堆内存限制的对象时。这个问题对于任何Java开发者来说都至关重要,因为如果不妥善处理,可能会导致程序崩溃。以下是...
### 编译时出现java.lang.OutOfMemoryError Java heap space异常 #### 一、问题概述 在进行Java项目编译的过程中,可能会遇到`java.lang.OutOfMemoryError: Java heap space`这种异常。这类异常通常表明Java虚拟机...
### Myeclipse下java.lang.OutOfMemoryError: Java heap space的解决方案 在使用Myeclipse进行Java开发时,可能会遇到`java.lang.OutOfMemoryError: Java heap space`这个错误提示。这种异常通常发生在应用程序占用...
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
在Java应用程序运行过程中,经常会遇到“Out of Memory Error: Java Heap Space”的错误提示。这种错误通常发生在Java虚拟机(JVM)的堆内存不足时,导致程序无法继续运行。为了解决这一问题,本文将详细介绍如何...
这种错误通常表现为"Java heap space",意味着Java虚拟机(JVM)分配的内存不足以执行任务。 **Java堆空间的原理** Java堆是Java虚拟机中最大的一块内存区域,用于存储对象实例。当程序创建新的对象并分配给堆时,...
标题中的“tomcat 解决Java heap space问题”指的是在运行Apache Tomcat服务器时,由于Java应用程序内存分配不当或资源消耗过大导致的“Java heap space”错误。这个问题通常出现在Java虚拟机(JVM)试图为对象分配...
### Java Heap Space 解决方法详解 #### 一、概述 在Java应用程序运行过程中,经常会遇到一个常见的错误提示:`java.lang.OutOfMemoryError: Java heap space`。这通常意味着Java虚拟机(JVM)的堆内存空间不足,...
JAVA HeapAnalyzer
Java heap space" 描述的是一个常见的Eclipse集成开发环境(IDE)中的问题,当用户尝试构建工作区时遇到内存不足的情况。这个错误表明Eclipse在执行任务时耗尽了Java虚拟机(JVM)分配的堆内存。以下是关于这个问题...
java虚拟机OutOfMemoryError:Java heap space堆dump文件,可以直接用来分析。
使用方法如下: ...python native_heapdump_viewer.py --symbols symbols 00.txt >00.log python native_heapdump_viewer.py --symbols symbols 01.txt >01.log 对比00.log和01.log,查看内存增长的点
### Java.lang.OutOfMemoryError:Java Heap Space 错误及处理办法 在Java应用程序开发与维护过程中,经常会遇到`java.lang.OutOfMemoryError: Java heap space`这一异常情况。该异常通常表明Java虚拟机(JVM)的堆...
IBM最新java heapdump分析工具 java -jar ha.jar -Xmx4096m ha.jar