设置JVM参数MaxNewSize的值是什么?人体工程学?

use*_*131 6 java ergonomics jvm centos6

我的服务器信息:

  • CPU:Intel Xeon E5-2630
  • 内存:65970676K
  • 操作系统:Centos 6.4
  • 内核:3.8.0
  • jdk:HotSpot JDK 1.6.0.27

jmap -heap pid用来打印堆信息:

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize      = 21474836480 (20480.0MB)
NewSize          = 21757952 (20.75MB)
MaxNewSize       = 174456832 
OldSize          = 65404928 (62.375MB)
NewRatio         = 7
 SurvivorRatio    = 8
PermSize         = 268435456 (256.0MB)
MaxPermSize      = 268435456 (256.0MB)
Run Code Online (Sandbox Code Playgroud)

以下是我为运行我的应用程序定义的JVM args:

 -verbose:gc  -XX:+UseMembar -XX:+PrintGCDetails - 
 XX:+PrintGCTimeStamps  -XX:+DisableExplicitGC - 
 XX:+CMSClassUnloadingEnabled
-XX:-OmitStackTraceInFastThrow  -Xloggc:/export/logs/gc.log 
-XX:PermSize=256m -XX:MaxPermSize=256m -Xms6G  -Xmx12G
Run Code Online (Sandbox Code Playgroud)

我没有设置MaxNewSize,我试图用来java -XX:+PrintFlagsFinal打印所有的JVM args,发现MaxNewSize是一个非常大的数字:18446744073709486080.我认为,人体工程学可能设置MaxNewSize174456832我.不过,我还有一个服务器,它具有相同的硬件和软件,其中MaxNewSize392560640而其他堆参数是相同的.

人体工程学设定价值的基础是MaxNewSize什么?我可以在人体工程学的源代码中看到这个吗?

我想我找到了MaxNewSize的值设置:Arguments.cpp(hotspot\src\share\vm\runtime)

if (CMSUseOldDefaults) {  // old defaults: "old" as of 6.0
  if FLAG_IS_DEFAULT(CMSYoungGenPerWorker) {
    FLAG_SET_ERGO(intx, CMSYoungGenPerWorker, 4*M);
  }
  young_gen_per_worker = 4*M;
  new_ratio = (intx)15;
  min_new_default = 4*M;
  tenuring_default = (intx)0;
} else { 
  // new defaults: "new" as of 6.0
  young_gen_per_worker = CMSYoungGenPerWorker;
  new_ratio = (intx)7;
  min_new_default = 16*M;
  tenuring_default = (intx)4;
}

// Preferred young gen size for "short" pauses
const uintx parallel_gc_threads =
(ParallelGCThreads == 0 ? 1 : ParallelGCThreads);

 const size_t preferred_max_new_size_unaligned =
    ScaleForWordSize(young_gen_per_worker * parallel_gc_threads);
  const size_t preferred_max_new_size =
align_size_up(preferred_max_new_size_unaligned, os::vm_page_size());
Run Code Online (Sandbox Code Playgroud)

AR5*_*HAM 7

在JDK 5中,添加了一个用于JVM自我调整的新性能功能,称为JVM Ergonomics.这也是在JDK 6中.这个想法是,当java进程启动时,它可以检查底层系统资源,并在未设置某些选项的情况下自动确定一些调整参数.换句话说,它试图通过最少的命令行调整从JVM提供良好的性能.

生成: 从J2SE平台版本1.2开始,虚拟机包含许多不同的垃圾收集算法,这些算法使用世代集合进行组合.虽然天真的垃圾收集检查堆中的每个活动对象,但是分代收集利用了大多数应用程序的几个经验观察的属性以避免额外的工作.

调整生成 大量参数会影响生成大小.在初始化虚拟机时,将保留堆的整个空间.可以使用-Xmx选项指定保留空间的大小.如果-Xms参数的值小于-Xmx参数的值,则不会立即将所有保留的空间提交给​​虚拟机.未提交的空间标记为"虚拟".堆的不同部分(永久生成,终身生成和年轻生成)可以根据需要增长到虚拟空间的限制.

一些参数是堆的一部分与另一部分的比率.例如,参数NewRatio表示终生代与年轻代的相对大小.

Young Generation 第二个最有影响力的旋钮是专用于年轻一代的堆的比例.年轻一代越大,次要收藏品就越少.然而,对于有限的堆大小,较大的年轻一代意味着较小的终生代,这将增加主要集合的频率.最佳选择取决于应用程序分配的对象的生命周期分布.

默认情况下,年轻一代的大小由NewRatio控制.例如,设置-XX:NewRatio = 3意味着年轻和终生代之间的比例是1:3.换句话说,伊甸园和幸存者空间的组合大小将是总堆大小的四分之一.

NewSizeMaxNewSize参数限制了年轻一代的大小.将这些设置为彼此相等可以修复年轻代,就像设置-Xms和-Xmx等于修复总堆大小一样.这对于以比NewRatio允许的整数倍更精细的粒度调整年轻代有用.

如果您需要有关此主题的更多信息,请参阅以下几个有用的链接: