内存泄露探查 Memory Analyzer

1.模拟程序

新建一个Spring Boot程序,启动类添加注解@EnableScheduling,创建定时组件。

@Component
public class MemoryLeaker {
    private static final Logger LOG = LoggerFactory.getLogger(MemoryLeaker.class);
    private List objs = new LinkedList<>();

    @Scheduled(fixedRate = 1000)
    public void run(){
        for(int i=0;i<50000;i++){
            objs.add(new Object());
        }
    }

} 
  

备注:每隔一秒钟向list插入5万个对象。

命令行启动这个程序

java -Xmx256m -Xss256k -verbose:gc -Xloggc:"mylog.txt" -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar .\demo-0.0.1-SNAPSHOT.jar                                            

大概一分钟左右你的程序就会收到java.lang.OutOfMemoryError: GC overhead limit exceeded,多次full gc只能回收少量空间。

2.探查隐藏的内存泄露

GCViewer总览堆内存gc情况

内存泄露探查 Memory Analyzer_第1张图片

堆内存、老年代迅速上升,多次full gc均不能回收内存。

Eclipse Memory Analyzer

使用Eclipse Memory Analyzer对内存dump文件进行分析,非常直观。

使用jps查看正在运行的java进程id

使用jmap获取dump文件

jmap -dump:live,format=b,file=6356-3.bin 6356

使用Eclipse Memory Analyzer打开dump文件xxx.bin。

内存泄露探查 Memory Analyzer_第2张图片

一共分配256M的对空间,运行到中间时,一个list就占了201.12MB

真正的内存泄露探查

打开Leak Suspects报告,查看找到的问题,比如点开第一个,如下图

内存泄露探查 Memory Analyzer_第3张图片

一个list有5百多万对象,这就是问题所在了。

 

总结:Eclipse Memory Analyzer可以很直观的进行内存泄露探查。

你可能感兴趣的:(Memory,Analyzer,内存泄露,调优)