OOM2的知识介绍
一般在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 時用於保存java
object 資訊與產生或最佳化程式碼時的暫存空間
假如它是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/ddt
ools/bootini_1fcj.asp
Red
其他的作業系統,請?考該作業系統文件做設定。
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 thread
dump,你將?會看到這個thread)。
WebLogic Server 在這個?況,假如它是由一個execute thread 丟出,這個
錯誤將會被監控並且會做記?。假如這是?續?斷被丟出?,那麼core health
monitor thread 會停止WebLogic Server 運作。
Out of Memory in native heap
假如無法native memory 配置到記憶體空間,則JVM 丟出native out of
memory,這通常發生在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 的錯誤訊息輸出
本文地址:http://www.45fan.com/dnjc/71445.html