基礎知識
JVM兩大功能
- 軟件層面,將.java文件轉譯成.class文件(字節碼文件),讓后在機器上運行
- 內存管理
JVM內結構圖
程序計數器
指向當前線程橫在執行的字節碼指令地址(行號)
虛擬機棧
存儲當前線程運行方法時所需要的數據,指令,返回地址
image
本地方法棧
native方法,機器底層的方法,結構和虛擬機棧類似
方法區
存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據存放在永久代
image
堆內存
存放對象
方法區和堆內存的結構圖
image
什么對象會被GC回收
image
image
- 數據共享邏輯圖,每條數據內都有一個程序計數器,虛擬機棧,本地方法棧,也就是說每個線程的數據都是獨享的,線程安全的
- Eden區內存不足時,觸發MinerGc(young GC)
- 觸發一次youngGC ,from區和to區會發生調換,from區變成to區,檢查的順序依然是先檢查from區再去檢查to區
- 參數含義
xms: staring(初始堆內存)
xmx:max(最大堆內存)
xmn:new(新生代大小) - 新生代的GC算法為:復制回收算法
- 判斷對象需要被回收的算法:引用計數法,可達性分析
- 成為GC Root條件
- 虛擬機棧中本地變量表引用的對象
- 方法區中類靜態變量引用對象和常量引用對象
- 本地方法棧中的JNI引用對象
- major GC在永久代發生,速度比miner GC慢10倍
垃圾回收
- 長期存活的對象,判定是否應該進入老年代
- XX:MaxTenurningThreshold=15(默認是15次)
- GC 算法:標記清除算法,復制回收算法(新生代使用),標記整理算法
- 垃圾回收器類型
image
ParNew:多線程回收,-XX:ParallelGCThreads=5,指定并行線程數;
Paraller Scavenge:在意的是吞吐量,吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間);
- 老年代內存不足時,觸發full gc(serial old)