Java堆和栈
Java中堆和栈是被说的最多的话题了。
今天看了几篇博文,就在这里总结一下Java的堆和栈。
1、堆和栈都是一段内存空间,其中堆的内存空间大小要比栈大很多
2、栈可以看成一个一个进程私有的内存空间(单线程私有),而堆是共有(公有)的一段内存空间(多线程共享)
3、看下图就能看出堆和栈的主要区别
上图中绿色区域为栈区域,分为了程序计数器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、
版权声明:本文为博主原创文章,未经博主允许不得转载。