文章目录
Trace跟踪参数
1、打印GC的日志信息,命令如下
-verbose:gc
XX:+printGC
- 打印GC的简要信息如下:
GC前用了4M,GC之后用374K,整个推占用15872K,耗时0.00016.6secs
2、打印GC详细信息
- -XX: +PrintGCDetails
3、打印GC发生的时间戳
- -XX: +PrintGCTimeStamps
示例:
-XX:+PrintGCDetails程序执行后,输出以下堆信息:
4、指定GC log的位置,以文件输出。
- -XLoggc:log/gc.log
5、每次GC前后,都打印堆信息
- -XX:+PrintHeapAtGC
6、监控类的加载
- -XX:+TraceClassLoading
7、打印类信息
- XX:+PrintClassHistogram
[B:表示bytes数组。
[C:表示char数组。
堆的分配参数
1、指定最大堆和最小堆
- -Xmx -Xms
示例:
-Xmx20M -Xms5M 运行代码:
System.out.print("Xmx=");
System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024.0+"M");
System.out.print(" free mem=");
System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024.0+"M");
System.out.print("total mem=");
System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024.0+"M");
Xmx=19.375M
free mem=4.342750549316406M
total mem=4.875M
在分配了1M空间给byte数组,这时指定空间不变,可用空间少了1M,总空间不变。只要堆内存够用就不会进行扩展,java会尽可能维持在最小堆。
分配空间超出之后,总空间变多。
2、设置新生代大小
- -Xmn
- (新生代主要保存一些生命周期短,对象内存小,垃圾回收比较频繁;老年代主要存放JVM认为生命周期长,内存相对较大,垃圾回收没那么频繁)
3、设置新生代和老年代的比值
- -XX:NewRatio 值(2)
4、设置两个Survivor区和eden的比值
- -XX:SurvivorRatio 值(2)
- 年轻代分成1个Eden Space和2个Suvivor Space(命名为A和B)。当对象在堆创建时,将进入年轻代的Eden Space。
示例:
参数新生代设置1M,全部分配在老年代。
新生代设置15M,全部分配在新生代
设置新生代内存7寸,这时触发了两次GC
增大survivor内存空间
5、内存溢出(OOM)时导出堆到文件
- -XX:+HeapDumpOnOutOfMemoryError
6、导出OOM的路径
- -XX:+HeapDumpPath
7、在内存溢出时(OOM),执行一个脚本
- -XX:OnOutOfMemoryError
8、总结
- 官方推荐新生代占堆的3/8
- 幸存代占新生代的1/10
- 在OOM时,记得Dump出堆,确保可以排查现场问题。
永久区分配参数
1、设置永久区的初始空间和最大空间
- -XX:PermSize -XX:MaxPermSize
- 他们表示,一个系统可以容纳多少个类型
栈的分配参数
1、栈大小的分配
- Xss
- 通常只有几百K
- 决定了函数调用的深度
- 每个线程都有独立的栈空间
- 局部变量、参数、分配在栈上
Eclipse中参数设置
1、Run–》Run Configuration --》Java Application中进行参数设置。