1JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory

原创 2016年05月30日 14:27:35

第一 heap 堆溢出:

heap中只能保存对象,对象存储过多会报错 java heap space

测试时修改JVM的默认参数:


 代码:

import java.util.ArrayList;
import java.util.List;


class Person{ }


public class HelloHeapOutOfMemory {

public static void main(String[] args) {
System.out.println("HelloHeapOutOfMemory");
List<Person> persons = new ArrayList<Person>();
int counter = 0;
      while(true){
      persons.add(new Person());
      System.out.println("Instance: " + (++counter));
      }


}


}

结果:10M空间在存储36W个空对象后报错;



第二:stack是线程私有,在主线程中运行其他线程会报错:stackOverFlowError

代码:

package com.dt.spark.jvm.basics;


public class HelloStackOverFlow {
private int counter;


  


    public void count() {


       counter++;


       count();


    }


public static void main(String[] args) {
System.out.println("HelloStackOverFlow");


HelloStackOverFlow helloStackOverFlow = new HelloStackOverFlow();
try {
helloStackOverFlow.count();
} catch (Exception e) {
e.printStackTrace();
throw e;
}

}


}

结果:


3.ConstantOutOfMemory 当常量里面存储内容超出存储空间时会报错 GC overhead limit exceeded

测试代码:


package com.dt.spark.jvm.basics;


import java.util.ArrayList;
import java.util.List;


public class HelloConstantOutOfMemory {


public static void main(String[] args) {
try {


          List<String> stringList = new ArrayList<String>();


          int item = 0;


          while(true){


             stringList.add(String.valueOf(item++).intern());


          }


      } catch (Exception e) {


          e.printStackTrace();


          throw e;


      }


}


}


结果:


4.java.lang.OutOfMemoryError: Direct buffer memory

代码:

package com.dt.spark.jvm.basics;


import java.nio.ByteBuffer;


public class HelloDirectMemoryOutOfmemory {
private static final int ONE_GB = 1024*1024*1024;


private static int count = 1;


public static void main(String[] args) {
 try {           


          while (true) {


             ByteBuffer buffer = ByteBuffer.allocateDirect(ONE_GB);


             count++;


          }


      } catch (Exception e) {


          System.out.println("Exception:instance created "+count);


          e.printStackTrace();


      } catch (Error e) {


          System.out.println("Error:instance created "+count);


          e.printStackTrace();


      }
}


}

结果:


注意:测试时,把jvm的临时改为-verbose:gc -Xms10M -Xmx10M -Xss128k -XX:+PrintGCDetails

相关文章推荐

实战演示JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory等

如图演示

JVM 内存 (堆(heap)、栈(stack)和方法区(method) )

JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

JVM内存格局总结:stack/heap/static/code(技术如果不能换钱,那不过是垃圾而已)

在java研发面试的岗位中,关于JVM的内存的分配格局这一块儿的知识,是必须会问到的。第一,对于理解深层次的java很有帮助。其次,在程序调试代码中,常会出现的OutOfMemory错误提示。这部分知...

JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

先了解具体的概念: JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。...

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的...

JVM运行原理及Stack和Heap的实现过程

Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在ja...

深入Java虚拟机:JVM中的Stack和Heap

在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题。 一般,J...

JVM Heap和Stack

在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题。   一般,J...
  • bubaxiu
  • bubaxiu
  • 2014年08月04日 21:04
  • 361

JVM中的栈(Stack)和堆(Heap)

在JVM中,静态属性保存在Stack指令内存区,动态属性保存在Heap数据内存区。本文将从JVM的角度来讲解Java虚拟机的这一机制。      在JVM中,内存分为两个部分,Stack(栈)和He...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory
举报原因:
原因补充:

(最多只允许输入30个字)