堆,栈,常量池

Posted helloWord程序猿们

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆,栈,常量池相关的知识,希望对你有一定的参考价值。

java 中保存new 出来的对象(每个对象都包含一个与之对应的class的信息,【class信息存放在方法区】),堆中分配的内存,有虚拟机的自动垃圾回收器管理,栈内存只对其所属线程可见。

java 中保存一些基本数据类型 (int,long,byte,double,float,char,boolean,short)和引用变量,堆内存对所有线程可见。

 

异常错误

如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。

 

空间大小

栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。
你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。

 

方法区:

又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

 

String a = new String("abc"); 产生一个或者两个对象。会先去常量池看有没有"abc"对象,若果没有则创建一个,然后堆中再创建一个常量池中此 ”abc” 对象的拷贝对象。

以上是关于堆,栈,常量池的主要内容,如果未能解决你的问题,请参考以下文章

java 堆 栈 常量池

java---堆栈常量池的存储数据

Java运行时数据区域(堆 栈 方法区 常量池)

Java栈,PC寄存器,本地方法栈,堆,方法区(静态区)和运行常量池

运行时数据区域(堆 栈 方法区 常量池)和内存分配策略

Java内存的堆栈与常量池