现在的位置: 首页 > 综合 > 正文

关于OOM 2

2013年12月05日 ⁄ 综合 ⁄ 共 2509字 ⁄ 字号 评论关闭

一般在3-tier 架構下的應用系統,最常見的問題就是Out of Memory(記憶體

不足),或Memory leak(記憶體洩漏)的狀況,最後往往導致Application Server

失效與系統Crash,讓管理人員必需常常守候在Server 旁邊,注意它關心它系

統狀況與運作情形避免它Crash

而本專題報導則是針對此類型問題的發生,從JVM 其基本架構開始說明,

並採用問答與實例的方式進行說明解釋,並且提供檢查的項目說明,可藉由這些

項目自我檢測,以避免發生Memory leak 有效掌握Resource

何謂Out of MemoryMemory 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

使用,而它的大小取決於產生的程式碼、產生的threadGC 時用於保存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 HeapNative 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 HatAS 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 objectsJVM

丟出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 的錯誤訊息輸出


抱歉!评论已关闭.