MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

为什么你写的java系统的JVM虚拟机里的内存对象无法被回收?

2025-06-03 22:21 huorong 精选文章 5 ℃ 0 评论

当年轻代和年老代都满了时,虚拟机会启动Full GC,对年轻代和年老代进行全面内存回收了,这个过程可能会耗费较长的时间,影响系统性能。

说下在代码里提升内存性能的要点:

要点1,我们在使用完物理对象(比如Connection或IO等对象)后,一般会在finally从句里立即释放。

如果有必要,可以进一步解释,不论发生什么异常,或者不论是否发生异常,finally从句里的代码一定会被执行,所以这样能保证物理对象能及时正确地被关闭。

要点2,当使用完某个对象时,应及时把它设置成null,比如obj = null;,这样就能撤销掉该引用对象上的强引用,从而能提升该对象的回收时间,尤其地,如果某个引用指向的内存空间较大,更应当采用这种做法。

要点3,不要频繁地在循环里操作String或其它不可变对象。如果在频繁操作,会大量产生内存碎片,从而加重内存的负担。如果有必要,可以再进一步讲,在一些需要针对字符串频繁操作的场景里,我们会用到StringBuilder对象。

要点4,List或HashMap集合对象在用好后,应当及时clear掉,否则集合对象还将占有一个强引用,导致对象无法被回收。


面试的时候一旦把话题引入到 jvm oom 这方面,大家就可以按如下顺序,全面展示JVM内存方面的技能。

1. 先说下JVM虚拟机内存的相关概念,比如new出来的对象是放在堆区,然后结合分代管理机制,说下垃圾回收的流程,在这个过程中,顺带可以展示下强、弱和软引用的知识点。

2. 再说下自己平时在写代码时,提升内存性能的一些做法,比如用好List等集合对象后要释放掉,尤其可以说下,自己知道finalize方法,但不会重写该方法。(由于finalize()的不可预测性和性能问题,以及它在Java生态系统中的逐渐淘汰,新开发的应用程序应当避免使用此方法。替代方案包括使用try-with-resources语句自动管理资源,以及显式调用清理方法来确保资源的正确释放。)

3. 最后,结合“发现问题”、“分析问题”和“解决问题”的思路,结合项目场景,说下自己解决过的内存OOM问题。

4. 说一个自己解决过的问题后,可以继续引导,争取再说出自己面试前准备过的,解决过的其它OOM问题或解决过的其它(数据库或分布式等层面)问题。



Tags:try-with-resources

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言