Java内存OOM分析———海客森
1.JProfiler安装
- JProfiler评估CPU、内存以及线程来避免内存漏失,是一个性能监测工具
- 视频与工具地址:https://pan.baidu.com/s/1PHM9hW3lh5Y0MEd3bMxvOA
- 源码(码云):https://gitee.com/hikseason/demo-spring-boot-all.git
1.JProfiler9.2.1安装
- 注意JProfiler10安装后,注册码虽然校验通过,但是安装后还是失败的,最好用9
- 安装注册码,查看百度云
2.Idea安装插件
- ctrl+shift+A或者File==>settings,然后搜索安装Plugins
- 安装好后在启动程序(或tomcat)右侧有两个蓝色圆圈按钮
- 左边一个是替你启动tomcat容器,右边是启动后,调用的,选择相应主程序
2.内存溢出分析
- 启动SpringBoot程序,启动右侧的JProfiler按钮
- 查看LiveMemory
1.访问程序,暴露问题
- 访问:http://localhost:8080/test
- 访问:http://localhost:8080/hello
- 都出现了1000个对象的问题,但是有的是不会回收的
2.过滤分析(Live memory)
- 过滤包com.demo
- 处理垃圾回收,正上方环形圆圈,Run GC
3.线上问题(用户账户系统)
- 代码迁移过程中,不规范的老代码,在日志前面的时候
- 做了日志切面
@Component
@Aspect
public class SysOperationlogAspect extends CommonServiceImpl {
private List<BeanSysOperationLog> logs=new ArrayList<BeanSysOperationLog>();
@Around("execution(* com.beikbank..*.*Service.*(..))")
public Object doServiceAround(ProceedingJoinPoint pjp) throws Throwable{
BeanSysOperationLog log=new BeanSysOperationLog();
logs.add(log);
return result;
}
- 原本有代码,进行伪清空的
// @Around("execution(* com.beikbank..*.*Controller.*(..))")
public Object doControllerAround(ProceedingJoinPoint pjp) throws Throwable{
logs=new ArrayList<BeanSysOperationLog>();
XXX
- 但是由于冲突,这里被注释了,无法回收logs,所以就造成new出来的Bean都在堆空间无法释放了