扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: Java > JVM高频面试题 > 8.Java内存泄漏和内存溢出是什么,如何避免

内存泄漏:指程序中动态分配给内存一些临时对象,并且这些对象始终没有被回收,一直占用着内存,简单来说就是申请内存使用完了不进行释放

常见的内存泄漏产生原因:

  • 静态集合类引起内存泄漏,因为静态集合的生命周期和JVM一致,所以静态集合引用的对象不能被释放
  • 单例模式导致内存泄漏,因为单例模式的静态特性,它的生命周期和JVM的生命周期一致,如果单例对象持有外部对象的引用,这个对象也不会被回收
  • 内部类的对象被长期持有,那么内部类对象所属的外部类对象也不能被收回
  • 数据库连接、网络连接等各种连接没有显示释放导致内存泄漏,例如在数据库连接后不再使用时,必须调用close方法释放与数据库的连接,否则会造成大量对象无法被回收进而造成内存泄漏
  • 改变哈希值,例如在一个对象存储到HashSet后,改变了对象中参与计算哈希值的字段,那么会导致对象的哈希值发生变化,和之前存入HashSet的哈希值不同,也就无法通过当前对象的引用在HashSet中找到这个对象,无法从HashSet中删除对象,造成内存泄漏,这也是为什么通常利用String类型的变量当作HashMap的key,因为String类型是不可变的

内存泄漏解决方案:写代码时尽量避免上述会造成内存泄漏的情况

内存溢出:指程序运行过程中无法申请到足够的内存导致的错误

常见的造成内存溢出的原因:

  • 内存加载的数据量太大,内存不够用了
  • 代码中存在死循环或循环产生大量对象
  • 启动参数内存值设置过小
  • 长期的内存泄漏也会导致内存溢出

内存溢出解决方案:

  • 修改JVM启动参数,增加内存
  • 使用内存查看工具动态查看内存使用情况
  • 对代码进行排查,重点排查有没有上述提到的造成常见内存溢出情景的代码

点击面试手册,获取本站面试手册PDF完整版