一 java堆溢出
我们知道java堆是用来储存对象实例的,如果我们不停地创建对象,那么当对象数量达到一定数量的时候,就会产生内存溢出的异常。
如下:运行下面代码:
- public static void main(String args[]){
- List l = new ArrayList();
- while(true){
- JavaHeapOverFlow f = new JavaHeapOverFlow();
- l.add(f);
- }
- }
会抛出下面异常:
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文件的信息,还有就是编译期间生成的各种字面量和符号应用,如下面代码所示:
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int i = 0;
- //保持对常量池的应用,避免被full gc回收
- List<String> l = new ArrayList<String>();
- while(true){
- l.add(String.valueOf(i++).intern());
- }
- }
运行这段代码,会抛出:
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)
阅读(3086) | 评论(0) | 转发(0) |