测试项目优化
未优化启动nhospital项目
java -jar -Xms1024m -Xmx2048m nhospital-service-1.0.0-SNAPSHOT.jar --spring.profiles.active=test |
优化前的内存监控,内存使用在1.7G-1.8G左右
使用JAVA自带的VisualVM进行监控
java安装目录的bin中 |
Java VisualVM默认没有安装Visual GC插件,需要手动安装,点击菜单栏 工具->插件 安装Visual GC,安装完成后重启Java VisualVM,Visual GC界面自动打开,即可看到JVM中堆内存的分代情况
Graphs区域:内存使用详细介绍
Compile Time(编译时间):15365 compiles 表示编译总数,1m29.699s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。 |
查看得知Spaces空间的Old(老年代)使用内存较大,但Old的最大内存和Eden最大内存很大,无法触发GC垃圾回收,
设置新生代的最大内存为512M,让新生代更快触发垃圾回收,更快的丢到老年代触发老年代垃圾回收
使用新配置启动
java -jar -Xms1024m -Xmx2048m -Xss256k -Xmn512m -XX:SurvivorRatio=6 -Dhttp.proxyHostWx=219.128.77.86 -Dhttp.proxyPortWx=7002 nhospital-service-1.0.0-SNAPSHOT.jar --spring.profiles.active=test |
启动后可看到监控中的内存使用,平稳在1.07G左右
JVM垃圾回收原理:
第一种情况
项目创建的新对象会先进入新生代进行存储,等达到新生代最大值时,还在使用就进入S0或S1,如未使用进行释放,
S0达到最大值后,未使用释放对象,到达最大值后进去S1,
S1未使用释放对象,到达最大值后进去S0
S0-S1互相交替15次后 未释放对象会进入老年代
老年代到达最大值时才会释放对象,在到达最大值之前一直存在
第二种情况
项目创建的新对象会先进入新生代进行存储,等达到新生代最大值时,还在使用就进入S0或S1,如果对象的大小超过S0或S1大小,将直接丢入老年代
老年代到达最大值时才会释放对象,在到达最大值之前一直存在