7

我的服务器信息:

  • CPU:英特尔至强 E5-2630
  • 内存:65970676K
  • 操作系统:Centos 6.4
  • 内核:3.8.0
  • jdk:热点 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 参数:

 -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 args,发现MaxNewSize是一个非常非常大的数字:18446744073709486080. 我认为人体工程学可能已经MaxNewSize174456832我准备好了。但是,我有另一台服务器,它具有相同的硬件和软件,MaxNewSize392560640其他堆参数相同。

人机工程学设定 的值的依据是MaxNewSize什么?我可以在 Ergonomics 的源代码中看到这一点吗?

我想我找到了 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());
4

1 回答 1

8

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

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

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

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

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

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

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

如果您需要有关此主题的更多信息,这里有几个有用的链接:

于 2014-03-17T16:03:39.207 回答