我的服务器信息:
- 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)
以下是我定义运行应用程序的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参数,并发现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());