从JVM了解堆栈
堆栈(stack)是JVM的内存指令区域。堆栈管理非常简单。推入具有一定长度字节的数据或指令,然后堆栈指针将相应的字节位移压入堆栈;弹出具有特定字节长度的数据或指令,并且堆栈指针弹出堆栈。并且每个操作的数据或指令字节长度是已知的。因此,Java基本数据类型,Java指令代码和常量都存储在Stack中。
堆(heap)是JVM的内存数据区域。堆的管理非常复杂。每次分配可变长度的内存空间时,它专门用于保存对象的实例。
JVM空间分配
堆就是堆:1、手动应用和释放空间[k1]较大的空闲区域

stack是堆栈:1、自动分配并释放2、有限的空间
示例:在Java中,如果仅声明一个对象,则首先在堆栈存储器中为其分配地址空间,如果创建一个新对象,则将其实例化,然后在堆存储器中为其分配地址。
对象a = null;仅在堆栈中分配内存。
new Object();在堆中分配空间。
Object b = new Object();在堆栈中分配空间并指向堆中的地址。
堆栈在内存中的关系
堆是Stack的子集。
堆栈的访问速度仅次于寄存器,并且其存储效率高于堆。它可以共享存储数据,但是在运行之前必须确定数据的大小和寿命。

堆是可以在运行时动态分配的数据区域。就速度而言,它比Stack慢。 Heap中的数据不会共享,并且大小和生存期可以在运行时确定。
new关键字是在运行时在Heap中创建一个对象,由于不共享堆数据,因此每次都会创建一个新对象。
回收方面的区别
Stack的内存管理是按顺序分配的,并且其长度是固定的,没有内存回收问题
堆以可变长度随机分配内存,并且内存分配和回收存在问题
JVM中还有另一个GC进程,该进程会定期扫描Heap。它根据保存在Stack中的4字节对象地址扫描Heap,在Heap中定位这些对象,并进行一些优化(例如合并空闲内存块),并假设未在Heap中扫描的区域是空闲的,则全部刷新(实际上是删除堆栈中失去其对象地址的无用对象。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-362707-1.html
我们烊烊最棒了
台湾问题已经超出了政治范畴