zoukankan      html  css  js  c++  java
  • Java内存泄漏真实案例

    内存泄漏:当不再需要一个对象时,垃圾收集器会回收它;如果不需要的对象一直在产生而不被收回,就称作“内存泄漏”。

    以下为本人在工作中遇到的内存泄漏的案例:

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

    这个线程池是没有界限的,如果每个线程处理时间较长,而且请求很多,会无限吃内存。

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

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

    以下是从网上收集的其他泄漏场景:

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

    解决方案:

    1、WeakHashMap,存放于其中的键值对,如果没有被使用,会在以后的时间里被GC自动回收。

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

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

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

    3、SoftReference: 软引用。

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

  • 相关阅读:
    第四周助教小结
    java课程总结
    第十四周总结
    第十三周实验报告
    第十二周课程报告
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
  • 原文地址:https://www.cnblogs.com/shuada/p/9168149.html
Copyright © 2011-2022 走看看