目录
一、背景介绍
二、实现思路
三、实现过程
服务启动内存分配过小
有大量的对象被创建
GC清理了堆内的对象,但没有及时把内存归还给操作系统
四、总结提升
AR项目有一个爬取的功能,之前出现了爬取加载慢的情况,经过排查发现服务的内存占用非常高。下面一起分析内存过高的问题
1.服务启动分配堆内存过小
2.有大量的对象被创建
3.GC清理了堆内的对象,但没有立即把内存归还给操作系统
我们在启动服务的时候经常会配置Xms和Xmx的配置,例如:nohup java -Xms3072m -Xmx4096m -jar a.jar& 。
-Xms 为JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation来指定这个比列。
-Xmx 为JVM运行时可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation来指定这个比列
我们通过监控内存飙升的那一时刻使用内存分析工具来对dump文件进行分析。找到内存飙升的原因并针对性的做出调整。
内存分析工具:jdk1.8自带的工具-jvisualvm.exe
在linux系统上我们可以通过名称生成dump文件,将生成的dump文件下载到本地运行内存分析工具进行分析。
jmap -dump:[live,]format=b,file=
在windows系统上我们可以直接打开内存分析工具,然后运行程序。就可以看到内存飙升的情况。
对于内存归还的的触发和垃圾回收器及其回收机制有关系,可以通过命令查看jvm目前使用的是哪一种垃圾回收器。
java -XX:+PrintCommandLineFlags -version
对于内存飙升的问题我们可以通过压测的方式进行复现问题,根据内存分析工具聚焦到是哪一部分的问题,然后针对相应的进行代码的优化。也可以根据使用场景来选择对应的垃圾回收器和对应的机制。