堆与堆栈:Java 如何管理要记住或忘记的内容
当我们运行程序时,操作系统会分配内存,以便该应用程序可以根据需要存储数据并检索数据。与 C 或 C++ 中程序员可以自由地“手动”分配内存和管理指针不同,在 Java 中,JVM(Java 虚拟机)管理易失性存储,为我们在两个分配系统(堆和内存)中抽象了这种复杂性。堆栈。
它们之间的区别在于存储的目的以及是否需要与多个进程共享该数据。
JVM 使用堆栈来存储短期数据并遵循 LIFO(后进先出)结构。堆栈是一个内存区域,用于管理方法的执行,在帧中以有组织的方式存储局部变量和方法调用。 JVM 中的每个线程都有自己的堆栈。
堆是所有线程之间共享的全局内存区域,其中分配的对象和变量的使用寿命需要超出创建它们的方法的范围。
堆上的内存由垃圾收集器管理,它会删除未引用的对象以释放空间,用于长期数据。
让我们用一个实际的例子。
当在方法范围内创建原始变量时,它必须在方法执行时可供使用。这样,堆栈将存储该变量,因为它负责在程序中具有独特且特定用途的数据的生命周期。
但是,当方法创建实例时,该对象可以在程序的其他部分使用,而不仅仅是在声明它的地方。当我们创建一个代表数据库中记录的对象时,这显然会发生。在我们的程序中,可以在整个执行过程中查阅、编辑和删除同一实例。这样,堆将负责存储对象。
为了说明这一点,我将使用作者 Hanumant Deshmukh 在他的指南“OCP Java SE 17/21 程序员考试基础知识”中描述的一个简单示例。顺便说一句,这本书很棒,因为它在解释相当复杂的过程方面非常具有说教性。如果您像我一样正在寻找 Oracle 认证专家 (OCP) 认证,我强烈推荐您。作者使用 String 实例用于教学目的,但我将在这里使用自定义对象只是为了避免侵犯版权的风险 (:S)
public class Main { public static void main(String[] args) { HeapObj heapObject = newObject(); int counter = 0; while (counter++ < 10){ print(heapObject.getName()); } } public static HeapObj newObject(){ return new HeapObj("Happy instance"); } public static void print(String text){ System.out.println(text); } }
在示例中,Main 类调用三个方法:主方法 (main)、创建 HeapObj 对象实例的方法和仅打印文本的方法。
如果我们在所有方法都被调用后拍照,堆栈和堆将如下所示:
换句话说:
1. 启动时:
Stack:主框架(包含args、heapObject、计数器)。
堆:空。
2.newObject之后:
堆栈:主框架(包含参数、heapObject 引用、计数器)。
Heap:带有字符串“Happy instance”的 HeapObj 对象。
3. 循环期间:
Stack:主框架(包含args、heapObject引用、计数器),堆叠和未堆叠的多个打印帧。
堆:相同的 HeapObj 对象和字符串“Happy instance”。
4.循环后:
Stack:主框架(包含args、heapObject引用)。
堆:相同的 HeapObj 对象和字符串“Happy instance”。
5. 程序结束时:
堆栈:空。
堆:空。
以上是堆与堆栈:Java 如何管理要记住或忘记的内容的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本启动Spring...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...
