展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Java堆、java栈

Java堆、java栈

Java堆是虚拟机启动时创建的最大共享内存区域,用于存放对象实例。它分为老年代和新生代(含Eden和两个Survivor区),新对象在Eden分配,多次回收后存活的对象晋升至老年代。堆支持动态分配与自动垃圾回收,但存取较慢。Java栈为线程私有,为方法执行提供内存模型,每个方法对应一个栈帧,存取速度极快。

Ja va堆:

一启动Ja va虚拟机,那块最大的内存区域——Ja va堆,就被创建出来了。它可以说是垃圾收集器工作的“主战场”,被所有线程共享,其核心使命就是存放各种对象实例。

为了更高效地管理内存和进行垃圾回收,堆空间被划分成了老年代和新生代。老年代,顾名思义,存放的是那些“长寿”对象,要么是经过多次垃圾回收(GC)依然坚挺的“老兵”,要么是那些一出生就过于庞大、新生代根本放不下的“巨婴”。而新生代,则是新创建对象的“摇篮”,它内部又细分为三个区域:Eden区、From Survivor区(简称From区)和To Survivor区(简称To区)。具体结构可以参考下图:

一个新对象诞生后,首先会被安置在新生代的Eden区,这里也是新生代最主要的内存区域。当Eden区快满时,会触发一次针对新生代的垃圾回收(Minor GC)。在这次回收中存活下来的对象,会被移动到From区。

接下来的过程就有点“二人转”的味道了。From区里的对象,经过下一次GC后,存活下来的会被转移到To区。而To区里的对象再经历GC时,存活者又会被挪回From区。这里的关键在于,From区和To区的角色并不是固定的,它们会随着GC算法的执行而相互转换。严格来说,每次都是“当前存活的From区”经过GC后,将幸存者送入“当前空闲的To区”。

那么,对象什么时候才能“晋升”到老年代呢?通常,在From区和To区之间来回“折腾”了足够多次(默认是15次)后,如果依然存活,就证明它是一个值得长期持有的对象,于是便会被转移到老年代中。

堆内存的优势非常明显:可以动态地按需分配内存大小,对象的生命周期也无需事先声明,不再使用的数据会有垃圾收集器自动清理。但凡事都有两面性,这种动态分配的灵活性,带来的代价就是存取速度相对较慢。

Ja va栈:

与共享的堆不同,Ja va栈是线程私有的,它的生命周期与所属线程完全绑定。栈的核心作用,是为Ja va方法的执行提供内存模型。每个方法被执行时,都会在栈中创建一个对应的“栈帧”,用来存储这个方法的局部变量表、操作数栈、动态链接、方法出口等信息。可以说,一个方法从被调用到执行完毕的过程,就对应着它的栈帧在虚拟机栈中从入栈到出栈的完整旅程。

栈的优势在于速度极快,其存取效率仅次于CPU内部的寄存器。但它的缺点也同样突出:存放在栈中的数据,其大小和生存期都必须在编译期就确定下来,缺乏堆那种运行时动态调整的灵活性。

从代码中分析堆、栈空间:

理论说了这么多,不如看一段具体的代码来得直观。我们来看下面这个例子:

public class Test1 {
    public void m1(){
        int a = 3;
        Person person = new Person();
        person.setName("name");
        m2();
    }
    public void m2(){
        int a = 3;
        Person person = new Person();
        person.setAge(20);
        Person person2 = person;
        person2.setName("name2");
    }
}

这段代码里,Test1类定义了m1()m2()两个方法。我们来一步步拆解,看看其中的变量在JVM的堆和栈中是如何分布的。其内存模型可以参考下图:

  1. 执行m1()方法:JVM会为m1()在栈中开辟一个栈帧。首先,存放基本类型变量int a = 3;接着,定义引用类型变量Person person,并执行new Person()——这一步是关键,它会在中开辟一块新空间,用于存储这个新创建的Person对象实例,栈中的person变量则保存着指向堆中该对象的引用地址。
  2. 调用person.setName("name"):这行代码通过栈中person变量持有的引用,找到堆中对应的Person对象,并修改其name属性。
  3. 调用m2()方法:此时,JVM会为m2()在栈顶开辟一个新的栈帧(位于m1栈帧之上)。同样,先存放int a = 3;然后定义Person person并执行new Person(),这会在中再次开辟一块新的空间,创建另一个Person对象。
  4. 执行Person person2 = person:这是理解引用类型的关键。这行代码并没有在堆中创建新的对象,它仅仅是将栈中person变量保存的引用地址,复制了一份给person2变量。结果是,personperson2这两个栈中的变量,指向了堆中同一个Person对象。
  5. 通过person2修改对象:当执行person2.setName("name2")时,通过person2的引用修改了堆中那个唯一对象的数据。此时,通过person变量去访问这个对象,其name属性也同步变成了“name2”。

这里引出了一个至关重要的概念:基本数据类型与引用数据类型的根本区别

基本数据类型(如int, short, long, byte, float, double, boolean, char,共8种,注意String不属于基本类型)的变量,存储的是实际的“字面值”。比如int a = 3;,这个“3”就直接存放在栈帧的局部变量表中。因为它们大小固定、生命周期明确(通常随方法结束而消失),出于追求极致速度的考虑,被安排在栈中。栈还有一个优化:对于字面值相同的变量,可能会共享同一份数据。例如同时定义int a = 3;int b = 3;,编译器可能会让ab指向栈中同一个字面值“3”。

引用数据类型(即对象类型)则完全不同。当我们写Person person = new Person();时,new Person()这个动作在中创建了对象的实际数据,而栈中的变量person仅仅保存了一个指向堆中那个对象的“地址引用”。因此,当多个引用变量(如personperson2)被赋值为指向同一个堆对象时,无论通过其中哪一个变量去修改对象状态,所有指向该对象的变量所看到的内容都会同步改变。这正是上例中第4、5步所演示的情况。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。