概念
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
场景
循环过多或死循环,产生大量对象;
静态集合类引起内存泄漏,因为静态集合的生命周期和 JVM 一致,所以静态集合引用的对象不能被释放,集合类元素太多可能导致内存泄露;
单例模式,和静态集合导致内存泄露的原因类似,因为单例的静态特性,它的生命周期和 JVM 的生命周期一样长,所以如果单例对象如果持有外部对象的引用,那么这个外部对象也不会被回收,那么就会造成内存泄漏。
数据连接、IO、Socket连接等等,它们必须显示释放(用代码在finally里执行 close 代码),否则不会被 GC 回收。
内部类的对象被长期持有,那么内部类对象所属的外部类对象也不会被回收。
Hash 值发生改变,比如下面中的这个类,它的 hashCode 会随着成员变量的变化而变化,每次成员变量变化后都会生成一个新对象:注:当我们想把自己定义的类保存到散列表的时候,需要保证对象的 hashCode 不可变。
内存中加载数据量过大;初始化加载的数据量占用内存超过设置的JVM参数值。