系统中为了保证事务一致性,把相关参数放进了上下文,目的是在出现异常的时候通过上下文取值进行业务级的事务处理。
测试发现在开源环境下代码中原有放入上下文里面的信息在调用结束后没有被清除,导致堆内存一直持续增加,手动GC也不能正常回收。
在调用微服务模式下压测,请求参数比较大的情况下:例如联网住院结算流程(入院、明细上传、结算、回退等全流程 ),内存增长很快并且停止压测后手工GC不能正常回收。
1.MbsHsafContextHolder增加了一个彻底删除上下文对象的方法,调整了getContext()对CurrentUser的处理,避免空指针。
/**
* 用以保存mbs HSAF上下文与线程绑定关系的ThreadLocal对象
*/
private static ThreadLocal<MbsHsafContext> contextHolder = new ThreadLocal<>();
-
MbsHsafContext增加了切面计数器的管理方法和自己管理自身引用的方法,这个参考了Netty的ReferenceCounted设计
-
MbsAspect增加了个aopCnt()的@Around切面切了BO和Service,执行引用计数器支持
-
ThreadLocalRemoveFilter在业务逻辑执行前后彻底删除上下文对象
-
代码增加了部分注释和@NonNull注解标记