内存溢出样例
public class App {public static void main(String[] args) {new Thread() {public void run() {while(true) {Thread threadBigObject = new Thread(new Runnable() {public void run() {
// while (true) {BigObject bigObject = new BigObject();String tt = new String(bigObject.getB());System.out.println(tt);/*try {TimeUnit.MILLISECONDS.sleep(800);} catch (Exception e) {e.printStackTrace();}*/
// }}});try {TimeUnit.MILLISECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}threadBigObject.start();}}}.start();/*while(true) {Thread threadSmallObject = new Thread(new Runnable() {public void run() {SmallObject smallObject = new SmallObject();String tt = new String(smallObject.getBytes());System.out.println(tt);try {TimeUnit.MILLISECONDS.sleep(800);}catch (Exception e) {e.printStackTrace();}}});threadSmallObject.start();}*/}
}public class BigObject {private byte[] b = new byte[1024*1024];public byte[] getB() {return b;}public void setB(byte[] b) {this.b = b;}
}public class SmallObject {private byte[] bytes = new byte[1024];public byte[] getBytes() {return bytes;}public void setBytes(byte[] bytes) {this.bytes = bytes;}
}
##idea配置ivm运行参数-Xmx48m -XX:+PrintGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/jvmgclog/heapdump/
##分析Java堆Dump工具下载
https://github.com/oracle/visualvm/releases/download/2.1.9/visualvm_219.zip
##GC-ROOT对象
1、虚拟机栈(栈帧中的本地变量表)中的引用对象:即各个线程当前执行的活动栈帧中引用的对象。
2、方法区中的类静态属性引用的对象:例如,public static修饰的变量。
3、方法区中的常量引用的对象:例如,字符串常量池(String Pool)中的字符串。
4、本地方法栈中JNI(Java Native Interface)引用的对象:通过JNI调用本地方法时,本地方法栈中引用的对象。
5、Java虚拟机内部的引用:如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointerException、OutOfMemoryError等),系统类加载器。
6、所有被同步锁(synchronized)持有的对象:持有锁的对象不会被回收。
7、活跃线程:线程本身也是对象,活跃线程自然不能被回收。
8、JVM内部的引用:比如指向JVM内部的类、方法、字段的引用。
9、其他:比如一些特殊的引用,如finalize队列中的对象、引用类型字段中的引用等。
##从图中看出GC-ROOT持有大对象 BigObject