何謂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 訊號。
 
處理此問題步驟
Java Out of Memory
 
1. 收集與分析verbose gc 的錯誤訊息輸出

你可能感兴趣的:(java,jvm,thread,weblogic,asp)