我的服务器信息:
- 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
. 我认为人体工程学可能已经MaxNewSize
为174456832
我准备好了。但是,我有另一台服务器,它具有相同的硬件和软件,MaxNewSize
而392560640
其他堆参数相同。
人机工程学设定 的值的依据是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());