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

时间:2014-03-17 13:25:25

标签: java jvm centos6 ergonomics

我的服务器信息:

  • CPU:Intel Xeon E5-2630
  • 内存:65970676K
  • OS: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)

以下是我为运行应用程序而定义的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

我没有设置MaxNewSize,我尝试使用java -XX:+PrintFlagsFinal打印所有JVM参数,发现MaxNewSize是一个非常大的数字:18446744073709486080。我认为人体工程学可能已经为我MaxNewSize设置了174456832。但是,我有另一台服务器,它具有相同的硬件和软件,其中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());

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

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

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