堆的分配参数
-XX:+PrintGCDetails
打印GC详细信息
-XX:+PrintHeapAtGC
每次一次GC后,都打印堆信息
-Xmx –Xms
指定最大堆和最小堆
-Xmx20m -Xms5m
System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
System.out.print("free mem=");
System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
System.out.print("total mem=");
System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
-Xmn
设置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
-XX:SurvivorRatio
设置两个Survivor区和eden的比
8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
-XX:+HeapDumpOnOutOfMemoryError
OOM时导出堆到文件
-XX:+HeapDumpPath
导出OOM的路径
-XX:OnOutOfMemoryError
在OOM时,执行一个脚本
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat%p“
当程序OOM时,在D:/a.txt中将会生成线程的dump
可以在OOM时,发送邮件,甚至是重启程序
堆的分配参数– 总结
根据实际事情调整新生代和幸存代的大小
官方推荐新生代占堆的3/8
幸存代占新生代的1/10
在OOM时,记得Dump出堆,确保可以排查现场问题
-XX:PermSize -XX:MaxPermSize
设置永久区的初始空间和最大空间
他们表示,一个系统可以容纳多少个类型
栈大小分配
-Xss
通常只有几百K
决定了函数调用的深度
每个线程都有独立的栈空间
局部变量、参数分配在栈上
GC打印说明
-XX:+PrintGC
[GC 4790K->374K(15872K), 0.0001606 secs] GC之前用了4790K之后用了374K堆总共大小15872K
-XX:+PrintGCDetails的输出
Heap
新生代状况
defnew generation total 13824K, used11223K [0x27e80000, 0x28d80000, 0x28d80000)
对象出生的地方eden
eden space 12288K, 91% used[0x27e80000, 0x28975f20, 0x28a80000)
幸存代
from space 1536K, 0% used[0x28a80000, 0x28a80000, 0x28c00000)
幸存代
to space 1536K, 0% used [0x28c00000, 0x28c00000, 0x28d80000)
老年代
tenured generation total 5120K, used 0K [0x28d80000,0x29280000, 0x34680000)
the space 5120K, 0% used[0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
永久区
compacting perm gen total 12288K, used 142K [0x34680000, 0x35280000,0x38680000)
the space 12288K, 1% used[0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
ro space 10240K, 44% used[0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
rw space 12288K, 52% used[0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)