读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线程在运行,并且堆非常大时,这样做才有意义
posted @ 2023-03-19 07:03  躺柒  阅读(59)  评论(0编辑  收藏  举报