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

痛定思痛。 2022-07-13 06:08 171阅读 0赞

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 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读

    相关 (heap)(stack)区别

     一、预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)―   由编译器自动分配释放 ,存放函数的