内存溢出样例
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