程式計數器
用于標識執行緒執行到了位元組碼檔案(class檔案)的哪一行,當執行native方法時,值為undefined,各個執行緒私有
Java虛擬機堆疊
每個執行緒獨有,每個方法執行時會創建一個堆疊幀,用于存盤區域變數表等方法資訊,即方法的執行會伴隨著一個堆疊幀的入堆疊出堆疊,
堆疊幀的組成

如果執行緒請求的堆疊深度大于虛擬機允許的最大深度,將拋出StackoverflowError例外
堆疊最大深度由堆疊記憶體大小和區域變數表大小確定,即堆疊大小固定,區域變數表越大,堆疊深度越小,堆疊大小可通過-Xss引數設定,默認為1m
如果堆疊動態擴展失敗,會拋出OutOfMemoryError例外,不過hotspot虛擬機不支持堆疊動態擴展,申請時失敗了,會拋出OOM例外
本地方法堆疊
虛擬機執行native方法時使用,與Java虛擬機堆疊類似,hotspot將二者合在一起
Java堆
用于存盤Java實體物件,垃圾收集器管理的記憶體區域,也稱為GC堆(Garbage Collected Heap),垃圾收集就發生在該區域,一般分為eden,servivor1,servivor2,old,
另外在Java8之前還有一個永久代,不過永久代實際上不屬于堆記憶體,屬于虛擬機記憶體,同時受垃圾收集器管理(fullgc時觸發垃圾回收),Java8之后洗掉了永久代,將方法區移動至元空間(Metaspace),使用native記憶體,移除虛擬機,防止OOM例外,元空間大小可以通過 -XX:MaxMetaspaceSize引數控制,fullgc時會對元空間進行垃圾回收;將字串常量遷移到Java堆中,
Java堆所有執行緒共享,不過可以通過設定TLAB(ThreadLocalAllocationBuffer)給各執行緒預留記憶體,提高記憶體分配時的效率,
Java堆可以通過-Xms和-Xmx設定初始大小和最大大小(雖然現在的專案一般將兩個值設為相同以減少GC次數),當動態申請記憶體不足時,會拋出OOM例外,
方法區
用于存盤已經被Java虛擬機加載的型別資訊,常量,靜態變數和即時編譯器編譯后的代碼快取等資料,Java8之前通過永久代實作,Java8之后通過元空間實作,實際為一個邏輯記憶體區域,多執行緒共享,Java的元空間會在fullgc時進行垃圾回收,主要進行類的卸載時方法區的垃圾回收,當記憶體分配出現不足時,會拋出OOM例外,
運行時常量池
屬于方法區的一部分,用于存盤類的版本,方法,欄位,介面等描述資訊,同時接受新的常量,例如String.intern()方法將字串放入常量池中,實際將char[]存盤到堆中的字串常量池中,將參考存盤到運行時常量池中,當記憶體不足時,拋出OOM例外,
注意,運行時常量池不等于字串常量池,上面說了,字符傳常量池在堆(老年代)中,
直接記憶體
直接記憶體不屬于JVM虛機記憶體的一部分,屬于native記憶體,JDK1.4后推出的NIO即可以直接操作Native記憶體,通過在Java堆中創建DirectByteBuffer物件控制Native記憶體,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544808.html
標籤:Java
下一篇:檔案監控利器-Jnotify
