19年Java岗面试分享:升级打怪连跳三家公司 最终斩获心动offer(18)

  • Dubbo的RpcContext是怎么传递的?(ThreadLocal)主线程的ThreadLocal怎么传递到线程池?(说了先在主线程通过ThreadLocal的get方法拿到上下文信息 , 在线程池创建新的ThreadLocal并把之前获取的上下文信息设置到ThreadLocal中 。 这里要注意的线程池创建的ThreadLocal要在finally中手动remove , 不然会有内存泄漏的问题)

  • 你说的内存泄漏具体是怎么产生的?(说了ThreadLocal的结构 , 主要分两种场景:主线程仍然对ThreadLocal有引用和主线程不存在对ThreadLocal的引用 。 第一种场景因为主线程仍然在运行 , 所以还是有对ThreadLocal的引用 , 那么ThreadLocal变量的引用和value是不会被回收的 。 第二种场景虽然主线程不存在对ThreadLocal的引用 , 且该引用是弱引用 , 所以会在gc的时候被回收 , 但是对用的value不是弱引用 , 不会被内存回收 , 仍然会造成内存泄漏)

  • 线程池的线程是不是必须手动remove才可以回收value?(是的 , 因为线程池的核心线程是一直存在的 , 如果不清理 , 那么核心线程的threadLocals变量会一直持有ThreadLocal变量)

    推荐阅读