Java的堆内存与栈内存的异同(Heap memory vs Stack memory)

Java Heap Memory

堆内存会在Java运行时分配给对象(Object)或者JRE类。每当我们创建一个对象的时候,在堆内存中就会分配一块储存空间给这个对象。Java的垃圾回收机制就是运行在堆内存上的,用以释放那些没有任何引用指向自身的对象(不可达的对象。注意Java的垃圾回收也会处理几个相互引用但没有任何外部引用的对象)。任何在堆内存中分配的对象都有全局访问权限,可以从应用的任何地方被引用。


Java Stack Memory

Java栈存储空间用来供线程执行时使用。栈空间中包含特别的变量如:短生命周期和指向其他在对内存中对象的引用。栈存储空间满足后进先出(LIFO)的顺序。当一个函数被调用时,会在栈中分配一块心的存储空间来存放函数的基本数据以及在函数中其他对象的引用(recursion的工作依赖于栈的后进先出原则)。一旦函数执行结束,存储空间就会被释放供下一个函数使用。栈空间中存储的一般是局部变量。
栈空间远远小于堆存储空间。


堆和栈的异同
1. 堆存储空间可以被应用的任何部分使用,而栈存储空间只能被对应的执行线程使用
2. 一旦对象被建立,JVM就会在堆中分配一段存储空间给这个对象,栈空间中保留对这个对象的引用。栈空间中仅仅保留基本数据类型和指向堆中对象的引用。
3. 堆中存储的对象可以被全局访问,而栈中存储的变量不能被其他线程(函数)访问。
4. 栈中的内存管理采用后进先出(LIFO)的原则的。堆内存的管理更为复杂,因为堆中的对象可以被全局使用。堆存储空间被分为Young-Generation, Old-Generation等(具体查阅JVM的工作原理)。
5. 栈存储空间是段生命周期的,堆存储则长的多。
6. 当栈空间满了,Java运行时会抛出java.lang.StackOverFlowError。堆空间满了会抛出java.lang.OutOfMemoryError:Java Heap Space异常。
7. 栈空间相比堆空间是非常小的。又因为栈空间使用的是简单的后进先出(LIFO)原则,其运行速度是远快于堆的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耀凯考前突击大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值