
1. Survivor空間
1.1. 新生代被劃分為兩個Survivor空間和一個Eden空間的原因
-
1.1.1. 剛剛被創建并且還在使用中,所以不能被回收,但它們的壽命并沒有長到足以進入老年代
-
1.1.2. 仍在新生代中的物件有額外的機會被回收,而不是晉升到(并填滿)老年代
1.2. 首次新生代回收期間,物件從Eden空間移動到Survivor空間0
1.3. 下次回收時,活躍物件會從Survivor空間0和Eden空間移動到Survivor空間1
- 1.3.1. 此時Eden空間和Survivor空間0完全是空的
1.4. 被移入老年代場景
-
1.4.1. Survivor空間非常小,當目標Survivor空間在新生代回收程序中被填滿時,Eden空間中剩余的任何活躍物件都會被直接移入老年代
-
1.4.2. 對于停留在Survivor空間中的物件,其經歷的GC周期數量有限制,超過這個限制的物件會被直接移入老年代
- 1.4.2.1. 晉升閾值(tenuring threshold)
1.5. -XX:InitialSurvivorRatio=N
-
1.5.1. 初始大小
-
1.5.2. 默認值為8
- 1.5.2.1. 新生代的10%
-
1.5.3. survivor_space_size = new_size / (initial_survivor_ratio + 2)
1.6. -XX:MinSurvivorRatio=N
-
1.6.1. 最大值
-
1.6.2. 默認情況為3
- 1.6.2.1. 新生代的20%
-
1.6.3. maximum_survivor_space_size = new_size / (min_survivor_ratio + 2)
-
1.6.4. 最小的比例可以得到最大的Survivor空間
1.7. 要讓Survivor空間保持固定大小
-
1.7.1. 將SurvivorRatio設定為期望的值
-
1.7.2. 禁用UseAdaptiveSizePolicy標志
1.8. XX:TargetSurvivorRatio=N
- 1.8.1. GC之后Survivor空間的占用率
1.9. -XX:InitialTenuringThreshold=N
-
1.9.1. Throughput回收器和G1 GC回收器默認是7
-
1.9.2. CMS默認是6
1.10. -XX:MaxTenuringThreshold=N
-
1.10.1. 最大閾值
-
1.10.2. Throughput回收器和G1 GC回收器的默認最大閾值是15
-
1.10.3. CMS的是6
1.11. -XX:+AlwaysTenure標志
-
1.11.1. 永遠晉升
-
1.11.2. 相當于把MaxTenuringThreshold設為0
-
1.11.3. 物件總是會晉升到老年代,而不是存盤在Survivor空間中
-
1.11.4. 默認是false
1.12. -XX:+NeverTenure
-
1.12.1. 永不晉升
-
1.12.2. 將初始晉升閾值和最大晉升閾值認為是無窮大
-
1.12.3. 只要Survivor空間仍有空閑,任何物件都不會晉升到老年代
-
1.12.4. 默認也是false
-
1.12.5. 防止JVM降低晉升閾值
1.13. -XX:+PrintTenuringDistribution標志
-
1.13.1. 在JDK 8中
-
1.13.2. 將物件年齡分布添加到GC日志中
-
1.13.3. 默認是false
1.14. Xlog引數加上age=debug或age=trace命令
-
1.14.1. 在JDK11中
-
1.14.2. 將物件年齡分布添加到GC日志中
-
1.14.3. 默認是false
2. 分配大物件
2.1. 執行緒本地分配緩沖區
-
2.1.1. thread-local allocation buffer,TLAB
-
2.1.2. 默認是開啟的
-
2.1.3. 所有的GC演算法都要考慮TLAB的大小
-
2.1.4. 它們很小,所以TLAB內不能分配大物件
2.2. TLAB的大小取決于3個因素
-
2.2.1. 應用程式中的執行緒數量
-
2.2.2. Eden空間的大小
-
2.2.3. 執行緒的分配速率
2.3. 從TLAB的引數優化中受益場景
-
2.3.1. 分配很多大物件的應用程式
-
2.3.2. 和Eden空間的大小相比,執行緒數量相對較多的應用程式
2.4. -XX:-UseTLAB禁用
- 2.4.1. 可以提升性能,禁用它們永遠是個壞主意
2.5. 大量的分配發生在TLAB之外
-
2.5.1. 減小分配物件的大小
-
2.5.2. 調整與TLAB大小相關的引數
2.6. JFR工具
2.7. -XX:+PrintTLAB標志
- 2.7.1. 在JDK 8
2.8. tlab*=trace
- 2.8.1. 在JDK 11
2.9. 調整TLAB的大小
-
2.9.1. -XX:TLABSize=N標志
-
2.9.1.1. 默認值為0
-
2.9.1.2. 顯式地設定TLAB的大小
-
2.9.1.3. 只能設定TLAB的初始大小
-
-
2.9.2. -XX:-ResizeTLAB標志
-
2.9.2.1. 默認是true
-
2.9.2.2. 防止每次GC時都調整大小
-
-
2.9.3. 調整TLAB以提升性能的最簡單的方法,也是唯一有用的方法
2.10. -XX:TLABWasteTargetPercent
-
2.10.1. 閾值
-
2.10.2. 默認是TLAB大小的1%
-
2.10.3. 動態的
2.11. -XX:TLABWasteIncrement=N
-
2.11.1. 增幅
-
2.11.2. 默認是4
2.12. -XX:MinTLABSize=N
-
2.12.1. TLAB的最小值
-
2.12.2. 默認為2 KB
2.13. TLAB的最大值略小于1 GB
-
2.13.1. 可以容納一個整數陣列的最大空間,陣列大小向下取整以對齊物件
-
2.13.2. 不能修改
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547254.html
標籤:Java
上一篇:【java筆記】cn.hutool.core.io.IORuntimeException Not a file。。。
下一篇:java基礎_基本資料型別
