在面试过程中,除了可以展示 Java 虚拟机内存调优和定位排查内存问题的技能外,还可以通过展示自己解决过的 OOM 问题,进一步让面试官确信你有内存调优的能力。下面给出一套范例说辞。
首先你可以说下问题的表现,或者说说你是怎么发现内存性能问题的。
比如,项目上线后,new relic 监控软件发现内存用量 70%以上的时间超过 5 分钟,发出了警告,由此发现了内存问题。
或者,通过观察日志,你们发现日志中频繁出现 OOM 问题。
再或者,在某段时间,程序非常卡,原来预期 10 分钟就能结束的程序,运行了 30 分钟,而且无错误日志。
亦或者,代码部署到测试环境后,用 JMeter 等工具在 1 秒钟内发出了 1000 个请求,模拟高并发场景,由此来做压力测试,此时出现了 OOM 问题。
在讲完如何发现问题以后,你可以讲下是怎么分析问题的。
你可以说,通过日志或告警邮件发现问题后,通过 dump 命令,得到了出问题时的内存镜像,随后再用 jvisualvm 命令打开该 dump 文件,观察出现问题时的对象使用情况。
然后你再讲下分析结果,以下列出了常见的 OOM 问题原因:
-
使用 JDBC 的 Connection 对象打开了数据库,并在获取了海量的数据,同时,在用好以后,没有关闭该 Connection,所以数据对象没有被回收,从而导致 OOM 问题。解决方法是,用好以后 close 掉。
-
在 ArrayList 或 HashMap 等集合对象中,存储了大量的对象,但用好以后没有 clear 掉,导致其中对象的引用无法释放,从而造成 OOM 问题。解决方法是,用好以后 clear 掉。
-
通过循环,创建了大量对象。解决方法是,改变创建对象的方式。
最后,你可以根据上文的提示,说下解决问题的措施。
总之,当你在面试中,围绕发现问题、分析问题和解决问题这三个层面来讲述你解决过的OOM问题时,面试官就能确信你有比较强的内存调优技能。
通过 JVM 调优,展示个人技能
在面试中,你非常有可能被问及 JVM 内存调优方面的问题。比如面试官可以可能会问:
-
你知不知道 Java 虚拟机的结构?
-
你是否知道 JVM 垃圾回收机制?
-
你知道 OOM 异常吗?你解决过 OOM 异常吗?
一旦面试官问及 JVM 或者 JVM 调优方面的问题时,你可以对面试官说:“对于这个问题,我能否从 Java 虚拟机结构的角度开始讲起?这样我能更加透彻地回答您的问题。”当得到允许后,你可以通过如下的步骤,系统地展示这方面的能力。
-
围绕 JVM 处理字节码的流程,边画边讲虚拟机体系结构,着重突出堆区的作用。
-
讲述堆区分代的结构,在此基础上讲述垃圾回收的流程。
-
讲一下你在代码中提升内存性能的做法。
-
“发现、分析和解决”OOM 问题的说辞,展示你内存调优方面的经验。
要知道,大多数求职者甚至根本不知道有 Java 虚拟机调优这个话题,而你在面试中,一旦能按照上述步骤全面展示 JVM 调优方面的技能后,一定能帮你超越大多数的竞争者。