augus007

代码如下:

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变量就不能被回收,从而就会导致栈的溢出
}
}

  

分类:

技术点:

相关文章: