java内存泄漏和内存溢出
概念
- 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;
- 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。类似于内存上不可用的漏洞.
内存泄漏场景
- a)创建和应用生命周期一样的单例对象 不正确使用是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露
b)创建匿名内部类的静态对象
c)未关闭资源
d)长时间存在的集合容器中创建生命周期短的对象
代码语言:javascript复制示例:A a = new A();
B b = new B(a);
a = null; //期望a被回收,但事实是b中还有a的引用,所以导致a内存地址不可用,导致泄漏。可以使用弱引用(当a失效时,所有的引用也失效)解决。
内存溢出参考OOM
OOM的几种可能情况
遵循 CC 4.0 BY-SA 版权协议参考