Java内存泄漏真实案例

内存泄漏:当再也不须要一个对象时,垃圾收集器会回收它;若是不须要的对象一直在产生而不被收回,就称做“内存泄漏”。数据库

 

如下为本人在工做中遇到的内存泄漏的案例:线程

 

一、对于大量的请求,使用了Executors.newCachedThreadPool()返回的线程池。对象

这个线程池是没有界限的,若是每一个线程处理时间较长,并且请求不少,会无限吃内存。内存

 

二、对于数据库查询,使用MyBatis的openSession获取SqlSession,而后忘记了close。get

SqlSession推荐在try-catch-finally语句的finally语句块中显式地调用close()方法io

 

如下是从网上收集的其余泄漏场景:object

三、向静态集合中添加大量元素的引用,这些对象就算再也不使用,也不会被GC主动回收的。从而致使集合内存泄漏。内存泄漏

 

解决方案:线程池

一、WeakHashMap,存放于其中的键值对,若是没有被使用,会在之后的时间里被GC自动回收。引用

二、WeakReference: 当一个对象仅仅被weak reference指向, 而没有任何其余strong reference指向的时候, 若是GC运行, 那么这个对象就会被回收.

WeakReference<String> nameRef = new WeakReference<String>(name);

当要得到weak reference引用的object时, 首先须要判断它是否已经被回收: nameRef.get()

三、SoftReference: 软引用。

当一个对象具备软引用时,在内存空间足够的状况下不会被回收。若是内存空间即将耗尽、就要抛出oom异常的时候,GC才会将该引用对象收回。

相关文章
相关标签/搜索