代码如下:
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sun.org.apache.bcel.internal.util.ClassLoader;
public class OutOfMemoryTest {
/**
* @param args
* 在JDK1.6下,模仿堆、栈、永久代溢出
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException { //这些静态方法,是放在方法区的。
// TODO Auto-generated method stub
// heapTest();
permGenTest();
//stackTest();
}
//堆溢出,堆存放对象实例
public static void heapTest() throws InterruptedException{
List list = new ArrayList(); //list 作为一个对象的变量名(即:引用),将会放在栈里面,new ArrayList() 作为一个对象(或者实例),需放在堆里面
List list = new ArrayList(7); //7作为对象型数据值,所以需放在堆中
String i="hello world"; //i放在栈里面,变量值放在堆中, (为啥String的值,和int的值放的位置不一样,这就要从基础数据类型和对象型数据类型有关了,)
while(true){
//Thread.sleep(30);
list.add(i); //因i作为list的参数,所以同list一同放在堆中
System.out.println(list.size());
}
}
//永久代溢出,JDK8已经没有永久代。永久代存放class,常量池等
public static void permGenTest(){
String str = "s";
while(true){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
str = str+str;
str.intern(); //判断常量池中是否有该变量只,如果没有,将堆中的变量值,推到常量池中,
}
}
//栈溢出,栈存放方法中局部变量和对象引用。
public static void stackTest() throws InterruptedException{
int value = 0; //value作为一个变量是放在栈中,其值0,作为基本数据类型的值,所以也是放在栈中。
value++;
Thread.sleep(3);
stackTest(); // 通过递归,导致stackTest()方法一直运行下去,同时value是作用在这个方法区里,该方法不结束,value变量就不能被回收,从而就会导致栈的溢出
}
}