JVM內部體系結構
Sun JDK在實現時遵照JVM規范,將內存空間劃分為方法區、堆、本地方法棧、PC寄存器、jvm方法棧。
方法區
方法區主要存放要加載的類的信息,比如類的名稱、類的修飾符、類中的靜態變量、final類型的常量、field、method等信息。方法區是線程共享的,在一定條件下也會被GC,當方法區要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。
方法區的存儲區域對應Permanet Generation(又稱,持久代),其默認值為{16MB-64MB},它的大小可以通過如下選項進行調整:
最小值
:-XX:PermSize 最大值
:-XX:MaxPermSize堆
堆用于存儲新創建的對象和數組。其大小可以通過如下選項進行調整:
最小值
:-Xms 最大值
:-Xmx 為了讓內存回收更有效率,Sun JDK從1.2開始對堆采用分代管理的方式。
heap = New Generation (新生代)+ Old Generation(舊生代)
其中,New Generation又可以分為
Eden Space和
Survivor Space,而Survivor Space由兩塊大小相同的區域組成(通常稱為S0、S1)。那么,Eden Space、S0、S1用途上有什么區別嗎?先來說說Eden Space,由于堆是線程共享的,因此在堆上分配內存是需要加鎖的,這就導致創建對象開銷增大,Sun JDK為了提升內存分配的效率,會為每個線程在新生代的Eden Space上分配一塊獨立的空間,這塊空間叫做TLAB(Thread Local Allocation Buffer),因此Eden Space是多個線程獨享的連續的內存區域,在一個線程內創建對象,JVM首先考慮在Eden Space的TLAB上分配,如果對象過大或者TLAB空間已用完,那么將在堆上分配。S0、S1也用于新創建對象的存儲,他們的另外一個用途是在GC時的臨時復制空間。
新生代大小值
:-Xmn Survivor Space大小
:-XX:SurvivorRatio 舊生代主要存放多次GC后仍然存活的對象,不過,新建的對象也有可能在舊生代上分配。一種是大對象(-XX:PretenureSizeThreshold來確定),另一種是大數組,且數組未引用外部對象。舊生代大?。?br /> 舊生代大小值=-
Xmx 減去 -XmnJVM方法棧
JVM方法棧是線程私有的,其在內存分配上非常高效。當JVM方法??臻g不足時,會拋出StackOverflowError的錯誤。JVM方法??赏ㄟ^如下選項進行調整:
JVM方法棧大小
:-Xss
posted on 2011-06-22 16:17
zhangxl 閱讀(988)
評論(0) 編輯 收藏 所屬分類:
優化