https://www.fastthread.io/ 分析堆栈
https://blog.gceasy.io/ 分析内存 gc
虚拟机调试参数:
1.设置堆的最大和最小值
-Xmx 堆中可以申请的最大内存 -Xms 堆中可以申请的最小内存 将两个值调成一样可以避免堆自动扩展。
2.可以让虚拟机出现内存异常时Dump出当前内存堆转储快照以便进行分析。
-XX:+HeapDumpOnOutOfMemoryError
3.设置出现内存溢出时,内存快照的保存路径
-XX:HeapDumpPath=logs -XX:ErrorFile=logs/hs_err_pid%p.log Dump出当前内存堆转储快照的路径
4.减少栈内存的容量(设置栈的大小)
-Xss161k
5.设置年轻代的大小
-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
6.设置元空间的最大值,默认是-1,即不限制,或者说是受限于本地内存的大小。
-XX:MaxMetaspaceSize:
7. java vritual machines 是否需要使用 Thread local allocation buffer可以通过
-XX: +/-UseTLAB参数来设定。
8.hotspot虚拟机日志打印
hotspot所有的日志都归到 -Xlog 参数上
jdk9以下 告诉虚拟机在发生垃圾回收时打印内存回收日志,并且在进程退出时打印当前各区的分配情况。
-XX:+PrintGCDetails
输出gc日志指定到目录
-Xloggc:logs/gc.log (logs/gc.log 是指定的目录)
9.指定老年代使用CMS垃圾收集器命令(使用这个命令后,新生代默认使用的收集器是ParNew收集器)(jdk9过时了)
-XX:+/-UseConcMarkSweepGC
也可以强制指定使用或去掉ParNew收集器命令 -XX:+/- UseParNewGC(过时的参数,jdk9不使用)
提高cms触发比例,降低内存回收的频率,获取更好的性能
-XX:CMSInitiatingOccupancyFraction=75
(在并发标记和清除阶段,用户线程还在执行任务,所以要预留出来一部分空间,留给正在执行的用户线程使用。如果老年区生成的数据不是很快,那么就调大一点这个值,减少清理的次数,提高性能。75是空间百分比)
10.使用G1垃圾收集配置的参数
1)给每个region分配空间(每个region就相当于把整个堆切分开了,其中有eden空间,Survivor空间,或者老年空间)
-XX:G1HeapRegionSize32MB 这个取值范围是1MB~32MB 应为2的N次幂
2)收集时的停顿时间
-XX:MaxGCPauseMillis 默认是200毫秒
垃圾收集器参数总结