2.1、Trace跟踪参数
n -verbose:gc -XX:+printGC 在运行的时候打印gc的简单信息
如:
[GC 4790K->374K(15872K), 0.0001606 secs]
[GC 4790K->374K(15872K), 0.0001474 secs]
[GC 4790K->374K(15872K), 0.0001563 secs]
[GC 4790K->374K(15872K), 0.0001682 secs]
n -XX:+PrintGCDetails 打印gc详细信息
n -XX:+PrintGCTimeStamps 打印gc运行的时间戳
如:
打印详细信息
def newgeneration total 13824K, used 11223K[0x27e80000, 0x28d80000, 0x28d80000)
新生代使用的内存大小。最小内存0x27e80000,当前使用的0x28d80000,最大边界0x28d80000。
n -Xloggc:log/gc.log 制定文件路径输出gc日志
n -XX:+TraceClassLoading 监控类的加载
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objectsfile]
[Loaded java.lang.reflect.Type from shared objects file]
2.2、堆的分配参数
n -Xmx –Xms 制定最大、最小堆内存。
下面代码运行默认下的堆内存
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");
n -Xmn 设置新生代大小
n -XX:NewRatio 新生代和老年代的比值通常为1:4
新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%
官方推荐新生代占堆的3/8
n -XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件
n -XX:+HeapDumpPath 导出OOM的路径
n -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=d:/a.dump
代码:
Vector v=newVector();
for(int i=0;i<25;i++)
v.add(new byte[1*1024*1024]);
n -XX:OnOutOfMemoryError 在OOM时,执行一个脚本
如:
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat%p”
当程序OOM时,在D:/a.txt中将会生成线程的dump. 可以在OOM时,发送邮件,甚至是重启程序
2.3、永久分配参数
n -XX:PermSize -XX:MaxPermSize 设置永久区的初始空间和最大空间
代码测试:
for(inti=0;i<100000;i++){
CglibBean bean = newCglibBean("geym.jvm.ch3.perm.bean"+i,new HashMap());
}
2.3、栈大小分配
n -Xss
每个线程都有独立的栈空间,局部变量、参数都分配在栈上
测试代码:
public class TestStackDeep {
private static intcount=0;
public static voidrecursion(long a,long b,long c){
longe=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=10;
count++;
recursion(a,b,c);
}
public static voidmain(String args[]){
try{
recursion(0L,0L,0L);
}catch(Throwablee){
System.out.println("deepof calling = "+count);
e.printStackTrace();
}
}
}
递归调用
-Xss128K
deep of calling = 701
java.lang.StackOverflowError