读Java性能权威指南(第2版)笔记21_垃圾回收H
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线程在运行,并且堆非常大时,这样做才有意义