首页 > 编程知识 正文

java类实现堆栈先进后出,java实例变量存放在栈还是堆

时间:2023-05-04 13:33:27 阅读:25407 作者:280

“Java虚拟机堆栈”(Java Virtual Machine Stacks )也是线程专用的,其生命周期与线程相同。 虚拟机堆栈描述Java方法执行的内存模型。 每个方法在执行的同时,都会创建一个堆栈框架,以存储本地变量表、操作数堆栈、动态链接和方法出口等信息。 从调用每个方法到执行完成的过程对应于从堆栈帧堆栈到虚拟机堆栈的过程。

有人经常将Java内存分为堆内存(Heap )和堆栈内存(Stack ),但这种分发很粗糙,Java内存空间的划分实际上要复杂得多。 这种划分方式的流行只表明,大多数程序员最关注的、与对象内存分配关系最密切的内存区域就是这两个。 此处的“堆”如下所述,“堆栈”是指当前虚拟机堆栈或虚拟机堆栈中的本地变量表部分。

局部变量表包含编译器可以预测的各种基本数据类型(布尔、字节、短整型、长整型、双精度、浮点型、长整型)、对象引用(引用类型)。 与对象本身不同,它可以是对象起始地址的引用指针,也可以是对象的引用指针

其中,64位长的long型和double型数据占用两个局部变量空间Slot,剩下的数据类型只占用一个。 局部变量表所需的内存控件在编译过程中分配。 方法中,则确定在方法执行期间必须为框架分配多少局部变量区域,而不调整局部变量表的大小。

javavirtualmachinespecification在此区域中定义了两个异常。 如果线程请求的堆栈深度大于虚拟机允许的深度,则会抛出堆栈溢出错误异常。 如果虚拟机堆栈可以动态扩展(目前大多数Java虚拟机都可以动态扩展,但Java虚拟机规范还允许固定长度的虚拟机堆栈),则无法向足够的内存申请扩展

Java堆(Java Heap )对于大多数APP应用程序来说,Java堆是Java虚拟机管理的内存中最大的块。 Java堆是所有线程共享的内存区域,是在虚拟机启动时创建的。 此内存空间的唯一目标是存储实例,大多数对象实例都在此分配内存。 这是因为,Java虚拟机规范要求将所有对象实例和数组分配给堆,但随着JIT编译器的发展和转义分析技术的成熟,分配给堆栈、标量替换优化技术会发生细微的变化

由于Java堆是垃圾收集器管理的主要区域,因此经常成为“GC堆”。 从内存回收的角度看,由于目前采集器基本采用分代采集算法,Java堆还可以细分为:gydwd代和较老的年代; 更精细的例子包括Eden空间、From、Survivor空间和To Survivor空间。 从内存分配的角度看,线程共享的Java堆中可能会划分出多个线程专用分配的缓存空间。 但是,无论如何分割,与保存内容无关。 在任何区域中,存储的仍然是对象实例。 进一步分割的目的是更有效地回收内存或更快地分配内存。

根据javavirtualmachinespecification的规定,如果Java堆在逻辑上连续,它就可以位于物理上不连续的内存空间中,就像我们的磁盘空间一样。 实施时,可以同时在固定大小和可扩展性上实施,但目前主流的虚拟机是基于可扩展性实施的。 使用-Xmx和-Xms。 如果堆中没有内存,实例分配完成,并且堆无法扩展,则会抛出内存输出错误异常。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。