一:背景介绍
目前又出现了爬取加载慢的情况;查了现在core服务的内存占用也是很高。
二:思路&方案
服务内存占用过高的原因
- 服务启动时分配的堆内存过小
- 具有大量对象被创建,并且没有及时被GC回收或者由于具有引用GC无法回收
- 当GC之后,虽然会清理堆内的对象,但是并不会释放内存,没有把曾经申请到的内容归还给操作系统
如何解决服务内存占用过高的原因
1、服务启动时分配的堆内存过小
- -Xms 为JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation来指定这个比列。
- -Xmx 为JVM运行时可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation来指定这个比列。
2、具有大量对象被创建,并没有及时被GC回收或者由于具有引用GC无法回收
1)、分析dump文件找到内存占用的原因
①使用命令生成dump文件,其中 pid为进程号,生成的dump文件会在当前目录下。(生产环境运行时,禁止使用)
jmap -dump:[live,]format=b,file=<filename> <pid>
②使用jvisual分析dump文件(是jdk1.8自带的分析工具)
3、当GC之后,虽然会清理堆内的对象,但是并不会释放内存,没有把曾经申请到的内容归还给操作系统
可以参考GC机制详解
- 尽早释放无用对象的引用
- 尽量少用finalize函数
- 如果需要使用经常使用的图片,可以使用soft应用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起OutOfMemory
- 注意结合数据类型,包括数组、树、图、链表等数据结构
- 可以手动执行System.gc()