java中堆和栈的不同

来源:互联网 发布:网络道德存在的问题 编辑:程序博客网 时间:2024/06/07 09:36

内存区域主要分为堆、栈、代码区和数据区

其中代码区主要存放程序中的二进制代码

数据区主要用于存放常量数据。

java中的堆和栈都是内存的一部分。它们之间的区别主要体现在以下方面。

1、分配时机的不同
对于栈和堆来说都是运行时分配存储空间,但是栈是在进入代码区域的时候就要确定需要分配的存储空间的大小。而堆可以在运行过程中动态的分配内存空间大小,如动态创建对象。
2、存储内容的不同
栈主要用来存放局部变量和方法调用。堆主要用来存放创建的对象和数组。
3、是否能够共享
栈中的数据可以共享,当向栈中放入数据的时候,首先放一个变量名的引用,然后查找栈中是否已经有该数据,如果有该数据就将该引用指向该数据,如果没有就将该数据插入到分配的栈空间。
4、可见范围的不同
每个线程都有自己独立的栈空间,所以每个线程的栈空间是线程独有的。所以栈内存是线程的独有内存。而堆内存中的对象对于所有线程可见。
5、大小不同
一般堆内存要远远大于栈内存
6、出错的异常信息不同
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。

0 0
原创粉丝点击