做java开发的工程师,稍微有点工作经验的都避不开JVM,在目前的内卷形式下,甚至刚刚毕业的应届生都要求了解JVM的知识以及原理,我们Java的程序之所以能一次编译多处运行,离不开JVM的功劳。
在工作中我们碰到的JVM问题都是OOM内存溢出,内存溢出一般有两种原因,一是我们虚拟机的内存设置比较小,一般一个新的项目刚刚开始时,业务量不多,为了节省服务器内存,设置的都是默认的最小内存,参数也是默认参数,不会特别的考虑去优化,随着业务的发展,对内存的要求越来越高,就会出现系统变慢甚至经常内存溢出的情况,这种一般是直接扩大虚拟机内存即可。而是我们自己的代码导致,比如无限循环,创建大对象不回收,一次性加载过多数据等,这种场景需要我们对内存副本进行分析,找出具体的原因,进而去优化代码,或者去优化业务流程,避免出现溢出问题。
在出现内存溢出时,一般情况是让运维直接导出内存副本,不需要我们一步步去排查问题系统,然后自己手动下载副本,拿到副本后用MAT等分析工具,一般很快能排查到具体的问题代码并进行修复。每次出现问题及时补救很重要,但最好的是让生产不出现内存泄露问题,生产问题不但会影响公司的业务,还会影响自己的绩效,给公司和个人都会有一定的损失。
怎么能够在我们实际开发的时候避免未来出现OOM内存泄露,需要我们在开发时,注意自己代码的性能,避免无限循环、一次性加载过多数据等问题,需要我们去了解虚拟机,不但要了解虚拟机的运行原理,还要了解进一步了解虚拟机的加载机制、回收算法、回收机制等。