• Theadlocal和它造成的内存泄露


    Theadlocal和它造成的内存泄露

    ThreadLocal、Thead、TheadMap。

    Thead类里有一个成员变量是TheadMap类型,这个TheadMap类的每一个entry的key是Theadlocal类,value就是Theadlocal类中存储的对象。对Theadlocal进行get和set时都是通过当前线程获取TheadMap对象,然后以当前Theadlocal对象为key,要存的值为value存入其中。(一个线程可以创建很多个Theadlocal对象,相当于这个TheadMap对象中可以有很多对值)

    ThreadLocal中存入的内容是线程私有的,是线程安全的。(如果存入对象的话一定要存入对象的副本,否则也是线程不安全的)。

    保证new出来的Theadlocal不同:

    主要是通过Theadlocal内封装的一个final int字段threadLocalHashCode,当每次new一个Theadlocal时,都会以相同的增加量原子更新一个AtomicInteger字段,然后把这个字段赋值给threadLocalHashCode,这个AtomicInteger字段是static的,也就是说下一次new Theadlocal时就还会在此基础上赋值给threadLocalHashCode一个新值。

    内存泄露问题:TheadMap使用ThreadLocal的弱引用为key,当外界没有对TheadLocal的强引用时,内存就会回收TheadLocal。此时TheadMap的key就是null,但是TheadMap不会被回收,因为有当前线程对象Thread强关联。这样如果线程不结束就有可能造成内存溢出。ThreadLocal类自身可以在getset时遇见为null的key会清除掉,但是这样还不能避免内存溢出,需要调用者手动调用remove方法,手动删除不需要的ThreadLocal。建议把ThreadLocal设置为静态类变量,这样它的生命周期就会很长不会出现被回收的现象,用完再remove掉。

  • 相关阅读:
    JavaScript对象与JSON字符串的相互转换
    IE6下javascript:void(0)不可用的解决
    mybatis-spring集成:配置多数据库源中遇到的问题
    网易免费企业邮箱Foxmail设置方法
    ARM Linux 驱动Input子系统之按键驱动测试
    arm Linux 驱动LED子系统 测试
    AM335x内核模块驱动之LED
    ARM开发板搭建NFS网络文件共享方法
    AM335x开发板与PC机虚拟机建立tftp文件传输
    am335xSD卡启动--文件系统制作
  • 原文地址:https://www.cnblogs.com/yinyunmoyi/p/11556770.html
Copyright © 2020-2023  润新知