sandbox下的内存泄露问题

情况一:使用了ProcessControl 特性,shutdown无法释放SandboxClassLoader
分析:
EventListenerHandlers.handleEvent中的
catch (ProcessControlException pce) {
final EventProcessor.Process process = processor.processRef.get();
....}
此处的 processor.processRef 很可能在 EventListenerHandlers.handleOnEnd 的方法中,已经被释放掉,此处的get会导致重新初始化且后续无释放

一个空Process 对象放在ThreadLocal中,导致使用了ProcessControl 特性且复用线程的的应用,ThreadLocal始终存在没有释放的Process,shutdown导致Classloader泄露

情况二:被切的方法存在阻塞方法或方法执行时间较长,在阻塞或方法自身执行的的过程中,shutdown会导致processor.processRef 无法释放

并发分析图如下


情况一:修改方案:
catch (ProcessControlException pce) {
...
//return 前检查 局部变量EventProcessor.Process process,process的栈空时释放ThreadLocal
}
情况二:修改方案:
方案1. EventProcessor 内部由状态变量和读写锁保护 释放/运行并发的情况,
状态变量作用:标记EventProcessor正在被冻结,阻止新的用户线程使用EventProcessor
读写锁:冻结操作要等所有当前正在操作EventProcessor用户线程退出
方案2. EventProcessor 内部由状态变量和无锁化操作保护

 

 

posted on 2023-07-28 15:52  贝克田庄  阅读(55)  评论(0编辑  收藏  举报

导航