我的服务器信息:
我使用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
。但是,我有另一台服务器,它具有相同的硬件和软件,其中MaxNewSize
是392560640
,而其他堆参数是相同的。
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());
答案 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允许的整数倍更精细的粒度调整年轻一代非常有用。
如果您需要有关此主题的更多信息,请参阅以下几个有用的链接: