1. 巨型對象 1.1. humongous object 1.2. 大於等於區域一半大小的對象 1.3. 巨型對象被直接分配在老年代,所以它在新生代回收期間不會被釋放 1.4. G1區域的大小是2的冪,最小值是1 MB 1.5. 如果堆的最大值和初始值差別很大,就會有過多的G1區域,這種情況下應該 ...
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線程在運行,並且堆非常大時,這樣做才有意義