0
点赞
收藏
分享

微信扫一扫

写程序分析堆内存溢出和栈内存溢出


打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 在一直上升。

写程序分析堆内存溢出和栈内存溢出_jar

写程序分析堆内存溢出和栈内存溢出_java_02

打开jvisualVM 工具,查看监视、线程、Visual GC。

写程序分析堆内存溢出和栈内存溢出_jar_03

写程序分析堆内存溢出和栈内存溢出_内存溢出_04

在ecplise 中安装MAT 在Help - Marketplace 中搜索Memory Analyzer  按照提示安装后,重新启动ecplise 

写程序分析堆内存溢出和栈内存溢出_jar_05

在ecplise中 打开File-open File 路径选择dump下来的文件路径,

写程序分析堆内存溢出和栈内存溢出_java_06

进入dump页面后显示

写程序分析堆内存溢出和栈内存溢出_内存溢出_07

写程序分析堆内存溢出和栈内存溢出_内存溢出_08

写程序分析堆内存溢出和栈内存溢出_jar_09


点击 红框内,在list objects 中选择outgoing references  和incoming references 定位到代码


写程序分析堆内存溢出和栈内存溢出_java_10

写程序分析栈内存溢出


在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);
		}
	}
}



写程序分析堆内存溢出和栈内存溢出_jar_11



一直处于线程等待,在此页面中,点击dump按钮,打dump,把dump 拷到版本,,从最底下看mian 线程



写程序分析堆内存溢出和栈内存溢出_java_12


举报

相关推荐

0 条评论