没有打印
空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC后调整堆的大小。
-Xms1024m -Xmx1024m
并行性
回收期间,可以由多个GC线程同时工作,有效的利用多核的计算能力并发性
G1拥有与应用程序交替执行的能力,部分工作可以与应用程序同时执行,不会在整个回收期间完全阻塞应用程序。分代GC
G1兼顾了年轻代和老年代,相比较于其他的垃圾回收器,其他的收集器只能工作于年轻代或者老年代其中的一个,所以在这个方面和之前的收集器有所不同。空间整理
在回收过程中会进行适当的对象移动,与CMS不同,只是简单的标记清理对象,在若干次GC之后,CMS必须执行一次碎片整理,G1则是每次回收都会有效的复制对象,尽量减少空间碎片。可预见性
由于分区的原因,G1可以只选取部分区域进行内存回收,可以缩小回收范围,对于全局停顿有很好的掌控性。
##测试代码
public class Demo2 { private static final int _1MB = 1 * 1024 * 1024; public static void main(String[] args) throws InterruptedException { int size = 1000 * 10000; int time = 1000; byte[] a1 = null; for (int i = 0; i < size; ) { System.out.println("次数:" + ++i); a1 = new byte[_1MB]; Thread.sleep(time); } } } vm配置 -Xms10M -Xmx10M -XX:+UseG1GC -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10###1 监视(CPU,堆,类,线程)
正常的堆,应该是锯齿周期情况###2 在出现OOME时生成堆
###3 内存 性能分析
可以查看哪些对象占用了较多的内存哪些对象存活的时间比较长###4 CPU 性能分析
###5 抽样器分析 ###6 线程分析
###7 visual GC 分析(安装插件)
###8 快照功能
生成任意个性能分析快照并保存到本地可以离线进行性能分析Profiler 快照
应用程序快照
###9 线程转储的生成与分析 对正在运行的本地应用程序生成线程转储,把活动线程的堆栈踪迹打印出来,帮助我们了解线程运行的情况,诊断死锁、应用程序瘫痪等问题。
###10 堆转储的生成与分析
可以看到摘要、类、实例数等信息以及通过OQL控制台执行查询语句功能。堆转储的摘要包括转储的文件大小、路径等基本信息,运行的系统环境信息,也可以显示所有的线程信息。##4.1 问题描述
项目首页,匿名无登陆,对首页进行150个线程,8小时压测,可以看到老年代一直在增加(visual gc),到某一时刻,直接oom,堆空间的图不是矩形。
##4.2 解决方案(堆dump文件分析)
加载dump文件分析自己写的实体 双击进去 点就属性中,非基本类型的,且是自己写的实体属性(CmsUserSite)
结论 说明CmsUserSite循环引用(a–>b–>a),循环引用造成内存溢出。 dump文件地址: 链接:https://pan.baidu.com/s/1ZtDGI8C-xUjwGK1nza56DQ 提取码:67qt
进入tomcat的bin目录
修改catalina.sh文件
if [ -z "$JSSE_OPTS" ] ; then JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" fi JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS" JVM_OPTS=" -Xmx2g -Xms2g -Xmn700m -XX:+UseG1GC -Xloggc:/home/hd/tomcat-app-node01/logs/gc.log -XX:+PrintGCDetails " MYPERF4J_OPTS=" -javaagent:/home/hd/myPerf4J/MyPerf4J-ASM.jar -DMyPerf4JPropFile=/home/hd/myPerf4J/myPerf4J.properties" JAVA_OPTS="$JAVA_OPTS $JVM_OPTS $MYPERF4J_OPTS" # Register custom URL handlers # Do this here so custom URL handles (specifically 'war:...') can be used in the security policy JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"