Java常见面试题-基础知识-JVM(一)

130 阅读2分钟

Java内存泄露

内存泄露最终导致内存溢出
内存泄露分为四类

  • 常发性内存泄露
    发生内存泄露的代码会被多次执行,每次被执行的时候都会导致一块内存泄露;
  • 偶发性内存泄露
    发生内存泄露的代码之后在某个特定环境或者操作过程中才会发生;
  • 一次性内存泄露
    发生内存泄露的代码只会被执行一次,或者是由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄露;
  • 隐式内存泄露
    程序运行过程中不定的分配内存,但是直到结束的时候才释放内存。

Java内存泄露的原因
内存泄露是指无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费。

根本原因,长生命周期的对象持有短生命周期对象的引用;

  • 静态集合类引起内存泄露 HashMap,Vector等使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有对象Object也不能被释放,因为他们也将一直被Vector等引用着;当集合里面的对象属性被修改后,再调用remove()方法时不起作用;
  • 监听器
    释放对象的时候没有去删除监听器,从而增加了内存泄露的机会;
  • 各种连接
    数据库连接,网络连接,io连接,除非其显示的调用了其close()方法将其连接关闭,否则是不会自动被GC回收的;
  • 单例模式
    如果单例模式持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露。