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、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值