Trace跟踪参数
verbose:gc
-XX:+printGC 可以打印GC的简要信息
-XX:+PrintGCDetails 打印GC详细信息
-XX:+PrintGCTimeStamps 打印CG发生的时间戳
-Xloggc:log/gc.log 指定GC的log的位置,以文件输出
-XX:+TraceClassLoading 监控类的加载
-XX:+PrintClassHistogram 在控制台按下Ctrl+Break后,打印类的信息
堆的跟配参数
-Xmx –Xms 指定最大堆和最小堆(-Xmx20m -Xms5m),在eclipse中示例:
1. 配置参数
2. 运行
3. 附代码
package jvm;
/**
* 堆参数设置Demo
* @author Administrator
*
*/
public class JvmTest {
public static void main(String[] args) {
printMemory();
}
/**
* 打印堆内存
*/
public static void printMemory(){
//最大堆内存
System.out.println("max memory:"+Runtime.getRuntime().maxMemory()/1024.0/1024.0+"M");
//空闲堆内存
System.out.println("free memory:"+Runtime.getRuntime().freeMemory()/1024.0/1024.0+"M");
//总堆内存
System.out.println("total memory:"+Runtime.getRuntime().totalMemory()/1024.0/1024.0+"M");
}
}
当我们在printMemory()前new一个byte数组(占用堆内存),byte[] by = new byte[1024*1024],会发现max memory不变,free memory 减少1M,total memory不变;当占用的堆内存内存即将大于free memory并小于total memory时,total memory就会进行扩容;当占用的堆内存内存即将大于total memory时,会报错误信息“ java.lang.OutOfMemoryError”。System.gc()可以回收内存,增大free memory。
-Xmn 设置新生代大小。
-XX:NewRatio 新生代(eden+2*s)和老年代(不包含永久区)的比值 (4 表示 新生代:老年代=1:4)。
-XX:SurvivorRatio 设置两个Survivor区和eden的比 (8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10)。
-XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件。
-XX:+HeapDumpPath 导出OOM的路径(-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/abc.dump)
-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,决定了函数调用的深度,每个线程都有独立的栈空间,局部变量、参数 分配在栈上。通常递归调用会引起栈溢出。
package jvm;
/**
* 堆参数设置Demo
* @author Administrator
*
*/
public class JvmTest {
public static void main(String[] args) {
test(1);
}
public static void test(int a){
System.out.println(a);
a++;
test(a);
}
配置栈内存Xss1m,发现在count=11410时抛出java.lang.StackOverflowError异常,配置栈内存Xss2m,发现在count=22959时抛出java.lang.StackOverflowError异常,大约为2倍。
如果大家觉得目前的JVM配置参数过于简单或者不够用的话,最后再推荐一篇比较全面的JVM参数设置、分析文章:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html