天天看點

關于JVM點點滴滴(一)

1、方法區、堆——>線程共享;虛拟機棧、本地方法棧、程式計數器->線程隔離;

2、棧中的異常:如果線程請求的棧深度大于虛拟機所允許的深度,将抛出StackOverFlowError;

3、會抛出OOM:

如果虛拟機棧可以動态擴充,但是擴充時無法申請到足夠的記憶體,會抛出OOM;

如果在堆中沒有記憶體完成執行個體配置設定,并且堆也無法再擴充時,會抛出OOM;

當方法區無法滿足記憶體配置設定需求時,會抛出OOM;

當常量池無法在申請到記憶體時,會抛出OOM;

當各個記憶體區域大于實體記憶體限制時,進而導緻動态擴充時,抛出OOM;

4、對象在記憶體中可分為三個區域:對象頭、執行個體資料、對齊填充

     對象頭包括:hashcode(25bit)、GC分代年齡(4bit)、鎖狀态辨別(2bit)、線程持有的鎖、偏向鎖線程ID、偏向時間戳等

    另外一部分是類型指針、即對象指向他的類中繼資料的指針;

5、方法區是如何判斷“無用的類”:

該類所有的執行個體都已經被回收;加載該類的ClassLoader已經被回收;該類對應的java.lang.Class對象沒有在任何地方被應用

6、新生代GC(Minor GC):發生在新生代的垃圾收集做法,非常頻繁,因為大多數java對象都是朝生熄滅,速度較快;

老年代GC(Major GC/Full GC):發生在老年的GC。Major GC速度比Minor GC慢10倍以上。老年代的連續空間小于新生代對象總大小會發生Full GC;

7、類加載的時機:

加載——驗證——準備——解析——初始化——使用——解除安裝

jvm