1.巨型对象1.1.humongous object1.2.大于等于区域一半大小的对象1.3.巨型对象被直接分配在老年代,所以它在新生代回收期间不会被释放1.4.G1区域的大小是2的幂,最小值是1 MB1.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 GB2.4.64位JVM的MaxRAM值限制为128 GB2.5.如果机器的物理内存小于MaxRAM的值,堆的默认值就是物理内存的四分之一2.6.即使有数百GB的RAM可用,JVM默认使用的内存最大也只有32 GB,即128 GB的四分之一2.7.Default Xmx = MaxRAM / MaxRAMFraction2.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.默认是false3.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 GC3.7.将GC线程绑定CPU

  • 3.7.1.在受限的情况下,即当机器上只有GC线程在运行,并且堆非常大时,这样做才有意义