何謂Java heap, Native memory and Process Size
一般在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 讯号。