Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1134979
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: Java

2012-09-16 14:35:01

一 java堆溢出
   我们知道
java堆是用来储存对象实例的,如果我们不停地创建对象,那么当对象数量达到一定数量的时候,就会产生内存溢出的异常。
如下:运行下面代码:

点击(此处)折叠或打开

  1. public static void main(String args[]){
  2.         List l = new ArrayList();
  3.         while(true){
  4.             JavaHeapOverFlow f = new JavaHeapOverFlow();
  5.             l.add(f);
  6.         }
  7.     }
会抛出下面异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2760)
    at java.util.Arrays.copyOf(Arrays.java:2734)
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
    at java.util.ArrayList.add(ArrayList.java:351)
    at com.lwq.JavaHeapOverFlow.main(JavaHeapOverFlow.java:17)

2 运行时常量池溢出
常量池中除了class文件的信息,还有就是编译期间生成的各种字面量和符号应用,如下面代码所示:

点击(此处)折叠或打开

  1. public static void main(String[] args) {
  2.         // TODO Auto-generated method stub
  3.         int i = 0;
  4.         //保持对常量池的应用,避免被full gc回收
  5.         List<String> l = new ArrayList<String>();
  6.         while(true){
  7.         l.add(String.valueOf(i++).intern());
  8.     }
  9.     }
运行这段代码,会抛出:
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
    at java.lang.String.intern(Native Method)
    at com.lwq.ConstString.main(ConstString.java:22)

3 本机直接内存溢出
下面通过反射得到取得Unsafe实例进行内存分配

    public static void main(String args[]) throws IllegalArgumentException, IllegalAcces***ception{
        Field f = Unsafe.class.getDeclaredFields()[0];
        f.setAccessible(true);
        Unsafe d =(Unsafe)f.get(null);
        while(true){
            d.allocateMemory(1024*1024);
        }
       
    }
console报错如下:
Exception in thread "main" java.lang.OutOfMemoryError
    at sun.misc.Unsafe.allocateMemory(Native Method)
    at com.lwq.DirectMemoryError.main(DirectMemoryError.java:20)



阅读(3038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~