测试项目优化

未优化启动nhospital项目

1
java -jar -Xms1024m -Xmx2048m -Dhttp.proxyHostWx=219.128.77.86 -Dhttp.proxyPortWx=7002 nhospital-service-1.0.0-SNAPSHOT.jar --spring.profiles.active=test

优化前的内存监控,内存使用在1.7G-1.8G左右

使用JAVA自带的VisualVM进行监控

1
2
java安装目录的bin中
C:\Program Files\Java\jdk1.8.0_181\bin\jvisualvm.exe

Java VisualVM默认没有安装Visual GC插件,需要手动安装,点击菜单栏 工具->插件 安装Visual GC,安装完成后重启Java VisualVM,Visual GC界面自动打开,即可看到JVM中堆内存的分代情况

Graphs区域:内存使用详细介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
Compile Time(编译时间):15365 compiles 表示编译总数,1m29.699s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。

Class Loader Time(类加载时间): 17201 loaded表示加载类数量, 100 unloaded表示卸载的类数量,18.196s表示类加载花费的时间

GC Time(GC Time):67collections表示垃圾收集的总次数,1.118s表示垃圾收集花费的时间,last cause表示最近垃圾收集的原因

Eden Space(Eden 区):括号内的681.500M表示最大容量,637.500M表示当前容量,后面的145.561M表示当前使用情况,63collections表示垃圾收集次数,517.821ms表示垃圾收集花费时间

Survivor 0/Survivor 1(S0和S1区):括号内的227.500M表示最大容量,14.500M表示当前容量,之后的值是当前使用情况

Old Gen(老年代):括号内的1.333G表示最大容量,728.000M表示当前容量,之后的150.812M表示当前使用情况,4collections表示垃圾收集次数 ,600.392ms表示垃圾收集花费时间

Perm Gen(永久代):括号内的1.086G表示最大容量,106.039M表示当前容量,之后的103.775M表示当前使用情况

查看得知Spaces空间的Old(老年代)使用内存较大,但Old的最大内存和Eden最大内存很大,无法触发GC垃圾回收,

设置新生代的最大内存为512M,让新生代更快触发垃圾回收,更快的丢到老年代触发老年代垃圾回收

使用新配置启动

1
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大小,将直接丢入老年代

  • 老年代到达最大值时才会释放对象,在到达最大值之前一直存在