栈是线程独有的,不需要gc,方法区和元数据空间堆是线程共享的,需要gc.
内存溢出实战
1.java堆内存溢出:
package com.test1;
import java.util.ArrayList;
import java.util.List;
/**
* -Xms5M -Xmx5M -XX:+PrintGCDetails -verbose:gc
* @author Administrator
*
*/
public class TestHeap {
public static void main(String[] args) {
List <Object> list =new ArrayList<>();
int i = 0 ;
while(true){
if(i % 10000 == 0)System.out.println("i = " + i);
list.add(new Object());
i++;
}
}
}
2.方法区和运行时常量池溢出:
package com.test1;
import java.util.LinkedList;
import java.util.List;
/**-XX:MaxMetaspaceSize=3M jdk1.8
* -XX:PermSize=4k -XX:MaxPermSize=4k jdk1.7
* @author Administrator
*
*/
public class TestHeap {
public static void main(String[] args) {
List<Object> list = new LinkedList<>();
}
}
报错信息:Error occurred during initialization of VM
Too small initial permanent heap
3.虚拟机栈和本地方法栈溢出:
package com.test1;
/**
* -Xss256k
* @author Administrator
*
*/
public class TestVMStack {
private int length = 1;
private void diGui(){
int x = 0;
int y = 1;
length ++;
diGui();
}
public static void main(String[] args) {
TestVMStack test = new TestVMStack();
try {
test.diGui();
} catch (Throwable e) {
// TODO: handle exception
System.out.println(" length" + test.length);
e.printStackTrace();
}
}
}
报错信息:报错信息:
java.lang.StackOverflowError
at com.test1.TestVMStack.diGui(TestVMStack.java:14)
at com.test1.TestVMStack.diGui(TestVMStack.java:15)
at com.test1.TestVMStack.diGui(TestVMStack.java:15)
at com.test1.TestVMStack.diGui(TestVMStack.java:15)
at com.test1.TestVMStack.diGui(TestVMStack.java:15)
at com.test1.TestVMStack.diGui(TestVMStack.java:15)
at com.test1.TestVMStack.diGui(TestVMStack.java:15)
4.本机直接内存溢出: