Trace跟踪参数
- -verbose:gc (打开gc)
- -XX:+ printGC
- 可以打印GC的简要信息
GC之前用了4790k,GC之后用了374k,正大GC的大小为(15872k),运行时间为0.0001606 secs
- -XX:+PrintGCDetails(打印GC详细信息)
- -XX:+PrintGTimeStamps(打印GC发生的时间戳)
下面一段是:程序运行后的一段描述,会把整个程序堆的基本状况打印出来,
- Xloggc:log/gc.log(如何重定向GC的log)
指定GC log的位置,以文件输出
gc的log日志可以帮助开发人员分析问题。 - -XX: + TraceClassLoading
监控类的加载(做跟踪调试的时候,可以看到哪些类是被加载进来了) - -XX:+PrintClassHistogram(打印类的直方图)
- 在控制台按下 Ctrl + Break后,打印在这个系统当中所有类的使用情况:
分别显示:序号、实例数量、总大小、类型
- -Xmx -Xms
-指定最大堆和最小堆 - -Xmx和-Xms应该保持一个什么关系,可以让系统的性能尽可能的好呢?
- 如果你要做一个Java的桌面产品,需要绑定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?
堆的分配参数
-
-Xmn
-设置新生代大小 -
-XX:NewRatio
-
新生代(eden+2*s)和老年代(不包含永久区)的比值
-
4代表 新生代:老年代=1:4,即年轻代占堆的1/5
-
-
-XX: SurvivorRatio
- 设置两个Survivor区和eden的比
- 8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
Xmn1m:新生代1m指的是一等区和幸存区加起来一共1M.新生代内存空间小,所以所有的都被分配到了老年代。
新生代空间调为15m
GC越多一般来说,对系统是越不好的。幸存代用大之后,多空间的浪费是比较严重的,所以这里合理的减小了幸存代的大小,把幸存代减到了2M,eden区扩展到了6M,因为空间得到了合理的利用,因为GC的数量下降之后很多进程就没有机会晋升到老年代,所以来年代所使用的空间就为0。
- -XX:+HeapDumpOnOutOfMemoryError
- OOM时导出堆到文件
- -XX:+HeapDumpPath
- 导出OOM的路径
-
- 导出OOM的路径
- -XX:OnOutOfMemoryError
- 在OOM时,执行一个脚本
堆的分配参数—总结
- 根据实际事情调整新生代和幸存代的大小。(没有固定的值)
- 官方推荐新生代占堆的3/8
- 幸存代占新生代的1/10
- 在OOM时,记得Dump出堆,确保可以排查现场问题。
永久区分参数
- 设置永久区的初始空间和最大空间
- 它们表示,一个系统可以容纳多少个类型。
栈的分配参数
-Xss
- 通常只有几百k
- 决定了函数调用的深度
- 每个线程都有独立的栈空间
- 局部变量、参数、分配在栈上。
第二个错:适量的增大栈空间,调用的次数也会增加,因为这个一个没有出口的函数,必然导致栈空间的溢出。
如果想让程序多调用几次,那么就适当的减小局部标量的个数,可以减少每一次函数调用消耗的空间,这样也可以让这个函数多调用几次。
总结
温故而知新,可以为师也。