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

堆内存(Heap)和栈内存(Stack)详解

原文地址:http://blog.csdn.net/abcjennifer/article/details/39780819 堆:顺序随意  栈:先进后出  堆和栈的...
  • Meta_Cpp
  • Meta_Cpp
  • 2015年01月09日 14:02
  • 2524

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

如图演示
  • a11a2233445566
  • a11a2233445566
  • 2017年01月18日 11:27
  • 229

堆(heap)和栈(stack)有什么区别??

堆栈存放用户自己用malloc分配的空间,用free来释放;由用户自己管理,而栈存放函数的局部变量,由编译器来负责分配和回收管理,速度快,但容量有限, 简单的可以理解为:  heap:是由ma...
  • ly0303521
  • ly0303521
  • 2015年04月09日 19:40
  • 1670

java内存解析--heap(堆)stack(栈)的理解

学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。 理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。 含义一...
  • smartboy_01
  • smartboy_01
  • 2014年04月04日 09:57
  • 3650

栈和堆,stack和heap,以及程序的内存分配

stack,栈,准确来说,应该叫“堆栈”。 heap,堆。
  • Benjamin_Xu
  • Benjamin_Xu
  • 2014年08月03日 20:58
  • 1239

我理解的堆栈(stack)、动态内存分配与堆(heap)

看到第4章,首次接触到堆(heap)这个概念,不好理解,所以用vs2010反汇编跟踪下程序: // use_new.cpp -- using the new operator #include ...
  • yss28
  • yss28
  • 2013年04月27日 10:19
  • 876

堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出

简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 一、预...
  • Acceptyly
  • Acceptyly
  • 2015年08月22日 11:01
  • 1436

面试题思考:Stack和Heap的区别

堆和栈的区别
  • u014306011
  • u014306011
  • 2016年04月02日 15:30
  • 3317

stack与heap的关系与区别

stack:         具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。这种机制的特点...
  • ydonghao2
  • ydonghao2
  • 2013年10月25日 19:24
  • 2636

Android内存机制—堆和栈

Android 内存机制-堆和栈
  • cao_chen
  • cao_chen
  • 2017年01月18日 16:07
  • 746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory
举报原因:
原因补充:

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