Java堆和栈
2015-08-05 10:48
405 查看
Java中堆和栈是被说的最多的话题了。
今天看了几篇博文,就在这里总结一下Java的堆和栈。
1、堆和栈都是一段内存空间,其中堆的内存空间大小要比栈大很多
2、栈可以看成一个一个进程私有的内存空间(单线程私有),而堆是共有(公有)的一段内存空间(多线程共享)
3、看下图就能看出堆和栈的主要区别
![](http://7jpolu.com1.z0.glb.clouddn.com/JVM_runtime_data_areas.png)
上图中绿色区域为栈区域,分为了程序计数器PC,JVM栈,本地方法栈
紫色区域为堆空间,堆又包含了 方法区域、运行时常量池
【1】程序计数器PC是记录当前线程执行的指令,类似一个指针,它是栈空间中唯一不会跑出OutOFMemory的运行时区域
【2】在介绍JVM栈之前,简单介绍一个概念,栈帧
栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。
JVM栈只对栈帧进行存储,压栈和出栈操作。栈内存的大小可以有两种设置,固定值和根据线程需要动态增长。在JVM栈这个数据区可能会发生抛出两种错误。
StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误。
OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。
【3】本地方法区域,也成为C栈,就是其它非Java语言写的方法,一般来说都是C/C++写的接口。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。
【4】堆数据区:堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。如果堆内存剩余的内存不足以满足于对象创建,JVM会抛出OutOfMemoryError错误。
4、String a = String("abc");
中“abc”是放在了堆空间,a是在栈空间,a是“abc”的引用。但是不推荐这种初始化方法,String a="abc"效率更高。因为String("abc")会先将“abc”转换为String类型变量,然后a再指向被转换的String类型的变量。
5、
今天看了几篇博文,就在这里总结一下Java的堆和栈。
1、堆和栈都是一段内存空间,其中堆的内存空间大小要比栈大很多
2、栈可以看成一个一个进程私有的内存空间(单线程私有),而堆是共有(公有)的一段内存空间(多线程共享)
3、看下图就能看出堆和栈的主要区别
![](http://7jpolu.com1.z0.glb.clouddn.com/JVM_runtime_data_areas.png)
上图中绿色区域为栈区域,分为了程序计数器PC,JVM栈,本地方法栈
紫色区域为堆空间,堆又包含了 方法区域、运行时常量池
【1】程序计数器PC是记录当前线程执行的指令,类似一个指针,它是栈空间中唯一不会跑出OutOFMemory的运行时区域
【2】在介绍JVM栈之前,简单介绍一个概念,栈帧
栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。
JVM栈只对栈帧进行存储,压栈和出栈操作。栈内存的大小可以有两种设置,固定值和根据线程需要动态增长。在JVM栈这个数据区可能会发生抛出两种错误。
StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误。
OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。
【3】本地方法区域,也成为C栈,就是其它非Java语言写的方法,一般来说都是C/C++写的接口。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。
【4】堆数据区:堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。如果堆内存剩余的内存不足以满足于对象创建,JVM会抛出OutOfMemoryError错误。
4、String a = String("abc");
中“abc”是放在了堆空间,a是在栈空间,a是“abc”的引用。但是不推荐这种初始化方法,String a="abc"效率更高。因为String("abc")会先将“abc”转换为String类型变量,然后a再指向被转换的String类型的变量。
5、
相关文章推荐
- 解决myeclipse中不能自动装箱拆箱问题
- spring + springmvc + jdbc + quartz + maven整合
- eclipse中生成javadoc文档
- 在springMVC中使用自定义的异常处理
- java数组
- JAVA中使用FTPClient上传下载
- 如何用JUnit4测试spring service
- java中的float double精度丢失
- Eclipse 安装 FreeMarker IDE 方法
- Java环境变量的配置步骤及JDK、JRE
- Java IO【21】PrintWriter的学习
- Java 数字转百分比%
- 关于 Eclipse 导出 Android项目 JavaDoc 详细过程
- java循环|分支结构
- 【MyBatis】MyBatis+SpringMVC+EasyUI整合分页
- final、static、static final修饰的字段赋值的区别
- JAVA学习笔记-----------InetAddress 的有关IP地址的使用案例(杂乱)
- Spring Ioc--Bean装配
- java中volatile关键字的含义
- Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)