打jar包 用命令java -jar xxx.jar
写程序分析堆内存溢出
package com.mvntest.mvn;
import java.util.ArrayList;
import java.util.List;
public class HeapOOM {
public static void main(String[] args) throws InterruptedException{
int size = 1024 * 1024 * 8;
List<byte[]> list = new ArrayList<byte[]>();
for(int i = 0; i < 1024; i++){
System.out.println("往JVM内写入"+(i+1)+"M数据");
Thread.sleep(1000);
list.add(new byte[size]);
}
}
}
用jmap -histo 进程号 | more
查看系统内存情况,由图分析,bytes 在一直上升。
打开jvisualVM 工具,查看监视、线程、Visual GC。
在ecplise 中安装MAT 在Help - Marketplace 中搜索Memory Analyzer 按照提示安装后,重新启动ecplise
在ecplise中 打开File-open File 路径选择dump下来的文件路径,
进入dump页面后显示
点击 红框内,在list objects 中选择outgoing references 和incoming references 定位到代码
写程序分析栈内存溢出
在Java项目中,有很多时候需要做线程dump,比如,系统挂起、死锁、不能创建更多本地线程的OOME、CPU消耗过多等等;甚至有些堆内存溢出也可能跟线程有关,因为可能是创建了过多的线程导致堆内存不够用。
public class ThreadTest {
public static void main(String[] args) throws InterruptedException{
for(int i = 0 ;i < 1000; i++){
Thread.sleep(1000);
System.out.println(i);
}
}
}
一直处于线程等待,在此页面中,点击dump按钮,打dump,把dump 拷到版本,,从最底下看mian 线程