
1. 巨型物件
1.1. humongous object
1.2. 大于等于區域一半大小的物件
1.3. 巨型物件被直接分配在老年代,所以它在新生代回收期間不會被釋放
1.4. G1區域的大小是2的冪,最小值是1 MB
1.5. 如果堆的最大值和初始值差別很大,就會有過多的G1區域,這種情況下應該增加G1區域的大小
1.6. -XX:G1HeapRegionSize=N
-
1.6.1. G1的區域大小
-
1.6.2. 默認值名義上是0
2. 完全掌控堆的大小
2.1. 堆的默認值取決于機器的記憶體量
- 2.1.1. XX:MaxRAM=N標志
2.2. 堆的最大值是MaxRAM的四分之一
2.3. 將32位Windows服務器的MaxRAM值限制為4 GB
2.4. 64位JVM的MaxRAM值限制為128 GB
2.5. 如果機器的物理記憶體小于MaxRAM的值,堆的默認值就是物理記憶體的四分之一
2.6. 即使有數百GB的RAM可用,JVM默認使用的記憶體最大也只有32 GB,即128 GB的四分之一
2.7. Default Xmx = MaxRAM / MaxRAMFraction
2.8. -XX:MaxRAMFraction=N標志
-
2.8.1. 堆大小的默認最大值
-
2.8.2. 默認是4
2.9. -XX:ErgoHeapSizeLimit=N標志
-
2.9.1. 設定JVM應該使用的默認最大值
-
2.9.2. 默認為0
- 2.9.2.1. 意思是忽略它
-
2.9.3. 如果它小于MaxRAM / MaxRAMFraction的值,則將它作為默認最大值
2.10. -XX:MinRAMFraction=N標志
-
2.10.1. 默認為2
-
2.10.2. if ((96 MB * MinRAMFraction) > Physical Memory) {
Default Xmx = Physical Memory / MinRAMFraction;
} -
2.10.3. 只有192 MB記憶體的機器上,JVM會將堆的最大值限制為96 MB或者更少
2.11. 堆的初始值
-
2.11.1. Default Xms = MaxRAM / InitialRAMFraction
-
2.11.2. InitialRAMFraction標志的默認值是64
-
2.11.3. 小于-XX:OldSize=N的值(默認是4 MB)與-XX:NewSize=N的值(默認是1 MB)之和,那么新生代和老年代的大小之和將作為堆的初始大小
2.12. 在大多數機器上,堆大小的初始值和最大值的計算相當簡單
2.13. 在邊界情況下,這些計算可能會相當復雜
3. AggressiveHeap標志
3.1. 默認是false
3.2. 已經不再被推薦了
3.3. 隱藏了實際采用的優化方式,這讓我們很難弄清楚JVM到底設定了什么
3.4. 為了更容易設定各種命令列引數
-
3.4.1. 針對運行單個JVM的、非常大的機器,它會嘗試給堆的引數設定合理的值
-
3.4.2. 在Java的早期版本中引入
3.5. 晉升本地分配緩沖區
-
3.5.1. promotion-local allocation buffer,PLAB
-
3.5.2. 每個執行緒都有這樣的區域,在GC 清理分代的程序中會用到
-
3.5.3. 每個執行緒都可以將物件晉升到特定的PLAB中,而無須同步
3.6. 在Full GC之前禁用Young GC
3.7. 將GC執行緒系結CPU
- 3.7.1. 在受限的情況下,即當機器上只有GC執行緒在運行,并且堆非常大時,這樣做才有意義
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547284.html
標籤:其他
