高薪程序员必修课-JVM的内存区域以及对象创建过程

news2024/10/6 8:35:54

JVM内存区域

        在Java虚拟机(JVM)中,内存区域(Memory Areas)是对内存空间的逻辑划分,用于存储不同类型的数据和执行不同的操作。理解JVM的内存区域有助于优化程序性能、调优内存使用和排查内存相关的问题。下面是Java中主要的JVM内存区域及其作用:

1. 程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器,它的作用包括:

  • 线程私有:每个线程都有自己的程序计数器。
  • 线程切换时保存当前执行位置:确保线程恢复执行时能够知道继续执行的位置。
  • 执行Java方法时记录字节码地址:用于支持基于线程的轮转和异常处理。

2. Java虚拟机栈(JVM Stack)

Java虚拟机栈用于存储方法的局部变量、部分方法返回值和操作数栈等数据。每个方法被执行时,都会同时创建一个栈帧(Stack Frame),用于存储方法的局部变量表、操作数栈、动态链接、方法出口等信息。JVM栈具有以下特点:

  • 线程私有:每个线程都有自己的JVM栈。
  • 方法调用:用于存储方法的局部变量和操作数栈。
  • 动态扩展和收缩:根据方法的调用深度动态分配和回收内存。

3. 本地方法栈(Native Method Stack)

本地方法栈与JVM栈类似,但是它为执行本地(Native)方法服务。本地方法是由JNI(Java Native Interface)调用的本地代码,本地方法栈用于支持这些本地方法的执行。

4. Java堆(Java Heap)

Java堆是JVM中最大的一块内存区域,用于存储对象实例和数组。Java堆是所有线程共享的内存区域,主要用于存放:

  • 对象实例:通过new关键字创建的对象。
  • 数组:Java中的数组,包括基本类型数组和对象数组。

Java堆具有以下特点:

  • 垃圾回收:Java堆中的对象不再被引用时,会由垃圾回收器自动进行垃圾回收和内存释放。
  • 分代策略:Java堆通常被划分为新生代(Young Generation)、老年代(Old Generation)和永久代(PermGen,已废弃,Java 8后改为元空间Metaspace)等不同的区域,以支持不同的垃圾回收算法。

5. 方法区(Metaspace)

方法区(Metaspace)用于存储类的结构信息、运行时常量池、静态变量、即时编译器编译后的代码等数据。Java 8及之前的版本称为永久代(PermGen),Java 8之后改为元空间(Metaspace),其特点包括:

  • 动态扩展:根据应用程序的需要动态分配内存空间。
  • 垃圾回收:元空间中的类数据和常量池通常不会被垃圾回收器回收。

6. 运行时常量池(Runtime Constant Pool)

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。与Class文件中的常量池(Constant Pool)不同,运行时常量池是动态生成的,并且具有一定的动态性。


JAVA对象创建过程

        Java中对象的创建过程涉及类加载、内存分配、初始化等多个步骤。下面详细讲解Java中对象创建的过程,从类加载到实例化的整个流程:

1. 类加载

在Java中,对象的创建首先要加载类的定义信息,即将类的.class文件加载到内存中并生成对应的Class对象。类加载由类加载器(ClassLoader)完成,主要包括以下几个步骤:

  • 加载(Loading):查找并加载类的二进制数据(.class文件)到内存中。
  • 链接(Linking)
    • 验证(Verification):确保加载的类符合JVM规范,如字节码验证。
    • 准备(Preparation):为类的静态变量分配内存,并设置默认初始值(零值)。
    • 解析(Resolution):将符号引用转换为直接引用。

2. 内存分配

一旦类加载完成,JVM需要为对象分配内存。Java堆(Heap)是存放对象实例的主要内存区域。内存分配的方式通常有两种:

  • 指针碰撞(Bump the Pointer):在堆内存中,用一个指针来指示已使用和未使用的内存分界线,分配内存时向未使用的内存段移动指针即可。这种方式要求堆中的内存是连续的,且堆空间必须是规整的。

  • 空闲列表(Free List):在堆内存中维护一个列表,记录上哪些内存块是可用的。分配内存时从列表中找到合适大小的块,标记为已使用,并更新列表。这种方式适用于堆空间不规整的情况。

3. 对象初始化

对象内存分配完成后,JVM会对对象进行初始化。对象初始化主要包括:

  • 设置对象头:包括对象的哈希码、GC分代年龄、锁状态标志等。
  • 执行构造方法:调用对象的构造方法进行初始化。构造方法会按照定义顺序初始化成员变量和执行构造代码块。

示例

以下是一个简单的Java类及其对象创建过程的示例:

public class MyClass {
    private int value;
    
    // 构造方法
    public MyClass(int v) {
        this.value = v;
    }
    
    // 实例方法
    public void printValue() {
        System.out.println("Value: " + value);
    }
    
    public static void main(String[] args) {
        // 第一步:加载类信息
        // MyClass类会被ClassLoader加载到JVM中
        
        // 第二步:内存分配
        // 在Java堆中分配内存空间给MyClass对象
        
        // 第三步:对象初始化
        // 调用构造方法进行初始化
        MyClass obj = new MyClass(10);
        
        // 调用对象的实例方法
        obj.printValue();
    }
}

输出结果

Value: 10

总结

        理解Java虚拟机的内存区域对于优化Java程序、排查内存泄漏和性能调优至关重要。Java中对象的创建过程涉及类加载、内存分配和对象初始化等多个步骤。不同的内存区域具有各自的作用和特点,理解其工作原理和使用方法可以帮助开发人员更好地设计和编写Java应用程序,优化代码结构和性能,同时也有助于排查对象相关的内存问题。


⭐️⭐️ ⭐️ ⭐️ ⭐️ 好书推荐
《Java项目开发全程实录》(第4版)

【内容简介】

        《Java项目开发全程实录(第4版)》以企业QQ、蓝宇快递打印系统、开发计划管理系统、酒店管理系统、图书馆管理系统、学生成绩管理系统、进销存管理系统、神奇Book—图书商城、企业门户网站、棋牌游戏系统之网络五子棋10个实际项目开发程序为案例,从软件工程的角度出发,按照项目的开发顺序,系统、全面地介绍了J2SE和J2EE项目的开发流程。从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行方面进行讲解,每一过程都进行了详细的介绍。

📚 京东购买链接:《Java项目开发全程实录》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1898760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java后端每日面试题(day1)

目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别?Spring Boot的优点Spring IoC是什么?说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值?如何理解Spring的SPI机制?Spr…

溶酶体靶向嵌合体制备方法和技术

网盘 https://pan.baidu.com/s/1dhCCryatp71j7yXTDdrrTw?pwdynr4 具有聚集诱导发光性质的比率型溶酶体pH探针及应用.pdf 内体-溶酶体转运靶向嵌合体降解剂及其制备方法与应用.pdf 可降解PDGFR-β的蛋白降解靶向嵌合体及其制备方法和应用.pdf 溶酶体膜包覆纳米颗粒的制备方法.…

19C 单机文件系统安装文档

准备工作 1)查看系统版本、内核参数 more /etc/redhat-release more /etc/redflag-releaseuname -a2)查看当前系统是否配置了HugePages。在下面的查询中,HugePages的几个相关值都为0,表明当前未配值HugePages,其次可以看到该版本的大页大小为…

科普文:微服务之服务网格Service Mesh

一、ServiceMesh概念 背景 随着业务的发展,传统单体应用的问题越来越严重: 单体应用代码库庞大,不易于理解和修改持续部署困难,由于单体应用各组件间依赖性强,只要其中任何一个组件发生更改,将重新部署整…

2024年7月5日 (周五) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《乐高地平线大冒险》为何不登陆…

能否免费使用Adobe XD?

Adobe XD不是免费的。Adobe 目前XD采用订阅模式,提供订阅模式 7 每天试用期结束后需要付费购买,具体价格根据不同的订阅计划确定,包括每月购买,包括 9.99 美元或每月 99.99 美元,或者选择购买Adobe CreativeCloud整体订…

文件打开的系统错误分析流程

当用户出现“Open file failed”错误时,手动产生dump文件。 (1)打开资源管理器,选择AppNameXXX.exe进程,右击鼠标选择“创建转储文件” (2) 生成转储文件 3.获取用户转储文件 4.用Visual studio2015打开dump文件分析…

Qt使用sqlite数据库及项目实战

一.sqlite使用介绍 在Qt中使用SQLite数据库非常简单,SQLite是一个轻量级的嵌入式数据库,不需要单独的数据库服务器,完全使用本地文件来存储数据。 当在Qt中使用SQLite数据库时,需要涉及到一些SQL语句以及Qt中的相关函数&#xf…

linux主机(A)通过私钥登录linux主机(B)

1.登录B主机,先在B主机执行 ssh-keygen 2.设置id_rsa的权限 chmod 600 id_rsa 3.将生成的id_rsa.pub导入到authorized_keys ssh-copy-id -i ./id_rsa.pub root127.0.0.1 4.将id_rsa复制到A主机 scp id_rsa_123 root1.1.1.A:/home/ 5.登录到A主机使用私钥登录 因…

华为云生态和快速入门

华为云生态 新技术催生新物种,新物种推动新生态 数字技术催生各类运营商去重塑并颠覆各行业的商业模式 从业务层面看,企业始终如一的目标是业务增长和持续盈利,围绕这些目标衍生出提质、增效、降本、安全、创新和合规的业务诉求&#xff0c…

【C语言题目】34.猜凶手

文章目录 作业标题作业内容2.解题思路3.具体代码 作业标题 猜凶手 作业内容 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。 D说&#xff…

科研绘图系列:R语言STAMP图(STAMP Plot)

介绍 STAMP图(STAMP plot)并非一个广泛认知的、具有特定名称的图表类型,而是可能指在STAMP(Statistical Analysis of Metagenomic Profiles:“STAMP: statistical analysis of taxonomic and functional profiles”)软件使用过程中生成的各种统计和可视化图表的总称。ST…

window.ai 开启你的内置AI之旅

❝ 成功是得你所想,幸福是享你所得 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder ❝ 此篇文章所涉及到的技术有 AI( Gemini Nano) Chrome Ollama 因为,行文字数所限,有些概念可能会一带而过亦或者提供…

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配(非流式)MainBranch结果展示 代码适配(流式) 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

第十六章 Qt的文件处理操作详解

目录 一、基本文件操作 二、二进制文件读写 三、文本文件读写 四、操作例子 1、QTextStream的流操作符 一、基本文件操作 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之…

生成式人工智能如何改变软件开发:助手还是取代者?

生成式人工智能如何改变软件开发:助手还是取代者? 生成式人工智能(AIGC)正在引领软件开发领域的技术变革。从代码生成、错误检测到自动化测试,AI工具在提高开发效率的同时,也引发了对开发者职业前景的讨论…

如何快速开展每日待办工作 待办任务高效管理

每天,我们都需要处理大量的待办工作,如何高效有序地开展这些工作成为了我们必须要面对的问题。仅仅依靠个人的记忆和脑力去管理这些繁杂的事务,显然是一项艰巨的挑战。在这个时候,如果能有一款实用的待办工具来辅助我们&#xff0…

深度神经网络语言识别

「AI秘籍」系列课程: 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 使用 DNN 和字符 n-gram 对一段文本的语言进行分类(附 Python 代码) 资料来源,flaticon:htt…

惠海 H6225K 降压恒压芯片 支持12V24V36V48V60V转3.3V 5V车载仪器仪表方案

H6225K是一种内置60V耐压MOS,支持输入高达48V的高压降压开关控制器,可以向负载提供2.5A的连续电流。H6225K支持输出恒定电压,可以通过调节VFB采样电阻来设置输出电压,同时支持最大电流限制,可以通过修改CS采样电阻来设…

yolov8环境安装(可修改代码版本,源代码安装)

下载下来源文件以后,进去文件目录,然后输入pip指令,即可安装yolov8 cd ultralytics-main pip install -e . 直接使用pip安装的情况 当你使用pip install ultralytics这样的命令安装YOLOv8时,你实际上是在从Python包索引&#x…