Tomcat-热加载之ThreadLocal内存泄漏篇(二)
通过举例深入的分析了热加载场景下ThreadLocal使用不当造成的内存泄漏。并剖析了Tomcat通过实现无效的ThreadLocalMap.Entry清除、ThreadLocalLeakPreventionListener回收空闲worker线程和TaskQueue对取任务逻辑的重写来兜底剩余worker线程回收这三种策略来优雅的解决ThreadLocal内存泄漏的问题
通过举例深入的分析了热加载场景下ThreadLocal使用不当造成的内存泄漏。并剖析了Tomcat通过实现无效的ThreadLocalMap.Entry清除、ThreadLocalLeakPreventionListener回收空闲worker线程和TaskQueue对取任务逻辑的重写来兜底剩余worker线程回收这三种策略来优雅的解决ThreadLocal内存泄漏的问题
本文深入分析了 WebappClassLoader 的热加载整体流程,并对热加载过程中遗留的垃圾回收问题进行了系统性拆解。重点涵盖了:垃圾的分类、核心引用关系的梳理、各类资源的清理策略。最后详细解析了 Tomcat 如何通过兜底机制清理仍存活的线程,并结合实践给出了线程资源管理的最佳建议
以问题切入,深入剖析了commonLoader与WebappClassLoader各自的定位与设计初衷,重点分析了WebappClassLoader如何在保证JVM核心类安全的前提下,部分打破双亲委派机制,实现Web应用之间的真正隔离。
分析了Tomcat中Pipeline+Valve和支持Filter的ApplicationFilterChain两种基于责任链模式的实现逻辑,并在最后总结了这两者的异同点以及为什么会有这两种类似的模块。
对Tomcat中Server,Service的init和start方法 + 核心字段进行了分析,并重点分析了Connector-NioEndpoint内部的Acceptor和Poller线程,并用图文的方法做了总结。并简单总结了Mapper和MapperListener的作用
分析了Spring Scope的作用和实现类。并从源码分析了其Scoped Proxy作用和实现,并在最后用arthas进行了简单的验证。重点应该关注基于代理的其他作用域Bean注册的两个BeanDefinition异同点,以及为何会注册两个BeanDefinition
呕心沥血的分析了ConfigurationClassPostProcessor的核心源码,深入剖析了Spring注解驱动的原理。对其中的延迟机制、字节码解析优化和代理模型进行了深度的思考,并通过arthas反编译反向验证了full configuration的代理