1、在解决问题之前,先看下jvm堆内存结构,如下图所示:
对于Java应用,虚拟机管理的内存,可以参考如下图所示:
一般对于一个应用来说,如果内存使用过大,可以从两块来分析,第一:堆内存,第二:堆外内存。下面着重从这两个方面阐述下对最近遇到的内存问题进行分析并解决的过程。
问题详情:
本人负责了一个应用,主要就是定时调度一批接口任务,同时提供一些对外接口,功能很简单,在使用的过程中,逐渐发现了几个内存问题。
1、oom问题,发现一段时间后,应用进程就没了,查看日志提示内存溢出,内存被吃光了,不够分配下个资源使用的空间了。
2、第一个问题解决后,添加了几个功能,发现又出现一些问题:应用运行一段时间后,发现,内存随着时间不段推移,内存占用也越来越多,一般4天后,内使用几乎达到90%,很吓人。
第一个问题解决过程:
oom问题,一般就是程序代码处理不当造成的,有些资源没有释放或者一直在循环开辟某些内存资源。分析这个问题,我使用了本地jvm的一个工具,找到对应的jdk/bin/jvisualvm 工具,它是用来JVM监测、故障排除、分析工具,主要以图形化界面的方式提供运行于指定虚拟机的Java应用程序的详细信息。
1、本地启动程序后,同时打开jvisualvm,在jvisualvm工具可视化页面有多个选项tab,可以根据需求,选择对应的tab进行使用,而我主要对profiler进行了使用,同时发现了问题,进而解决了问题,如下图所示: