JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

news2024/11/24 8:33:10

对象

内存分配的两种方式

指针碰撞

适用场合:堆内存规整(即没有内存碎片)的情况下。

原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。

使用该分配方式的GC收集器:Serial, ParNew

空闲列表

适用场合:堆内存不规整的情况下。

原理:虚拟机会维护一个列表,列表中会记录哪些内存块是可用的,在分配的时候,找一块儿足够大的内存块儿来划分给对象实例,最后更新列表记录。

使用该分配方式的GC收集器:CMS

如何选择

选择以上两种方式中的哪一种,取决于 Java 堆内存是否规整。

而 Java 堆内存是否规整,取决于 GC 收集器的算法是"标记-清除",还是"标记-整理"(也称作"标记-压缩"),值得注意的是,复制算法内存也是规整的。

对象的创建过程

Java 对象的创建过程我建议最好是能默写出来,并且要掌握每一步在做什么。

Step1:类加载检查

虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

Step2:分配内存

类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。

Step3:初始化零值

内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

Step4:设置对象头

初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。

Step5:执行 init 方法初始化

在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始,<init> 方法还没有执行,所有的字段都还为零。所以一般来说,执行 new 指令之后会接着执行 <init> 方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来

对象的内存布局

可以划分为三个部分:对象头、实例数据、对齐填充(8bit倍数)

  1. 虚拟机的对象头:包括两部分信息:

    1. 第一部分用于存储对象自身的运行时数据(哈希码、GC 分代年龄、锁状态标志等等)

    2. 另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

  2. 实例数据:是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。

  3. 对齐填充:不是必然存在的,也没有什么特别的含义,仅仅起占位作用。 因为 Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

对象的访问定位

对象的访问方式由虚拟机实现而定,目前主流的访问方式有:使用句柄直接指针

建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference引用 数据来操作堆上的具体对象。

句柄的方式

如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference (引用)中存储的就是对象的句柄地址。

流程就是: 引用 找到--》 句柄地址 找到--》 实际数据

句柄中包含了对象实例数据与对象类型数据各自的具体地址信息。

优点

这种方式的好处是可以使对象的布局更加灵活,因为对象数据可以在堆内存中移动而不影响句柄的引用。

缺点

访问对象需要两次内存访问:首先是根据句柄找到对象的引用,然后再根据引用找到对象的实际数据。这会导致一些额外的性能开销。

直接指针

如果使用直接指针访问,reference引用 中存储的直接就是对象的地址。

流程就是: 引用 找到--》 实际数据

指针访问方式最大的好处:就是速度快,它节省了一次指针定位的时间开销。

 

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

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

相关文章

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-卷积-[北邮鲁鹏]

目录标题 参考学习链接卷积的定义卷积的性质叠加性平移不变性交换律结合律分配律标量 边界填充边界填充方法 - 常数填充最常用常数填充零填充&#xff08;zero padding&#xff09;拉伸镜像 卷积示例单位脉冲核无变化平移平滑锐化 卷积核平均卷积核高斯卷积核高斯卷积核定义高斯…

智能金融决策策略,规则引擎在大数据金融行业的实战案例

在金融风控场景中&#xff0c;规则引擎是一个核心风险管理的利器&#xff0c;它预先设定一系列规则设定&#xff0c;用于便捷的评估和处理各种交易、客户行为或其他需要自动化决策、计算、推理判断的情况。 以下是一个详细的示例&#xff0c;说明规则引擎在金融风控中的使用。 …

智能工厂的产业前景如何?

智能工厂的产业前景相当光明&#xff0c;并且正在迅速发展。智能工厂&#xff0c;也称为工业 4.0 或第四次工业革命&#xff0c;代表了先进技术和数据驱动自动化推动的制造和工业流程的重大转变。以下是智能工厂产业前景的一些关键方面&#xff1a; 1.提高效率&#xff1a;智能…

OSCP系列靶场-Intermediate-BTRSys2.1保姆级

OSCP系列靶场-Intermediate-BTRSys2.1 目录 OSCP系列靶场-Intermediate-BTRSys2.1总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试21-FTP端口的信息收集21-FTP版本版本信息与MSF利用21-FTP端口匿名登录测试(成功)21-FTP端口-文件GET收集…

C++中的深拷贝和浅拷贝介绍

对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: class Base{public:Base(): m_a(0), m_b(0){ }Base(int a, int b): m_a(a), m_b(b){ }private:int m_a;int m_b;};int main(){int a = 10;int b = a; //拷贝Base obj1(10, 20);Base obj2…

项目管理软件在项目中的这些作用,你知道吗?

现在项目管理软件成为各类企业必不可少的工具&#xff0c;给项目提供全面的视图、促进团队协作、实时跟踪和监控、优化资源利用、改善决策制定等优势。 它们可以帮助团队成员更好地组织和协作&#xff0c;是实现项目目标的必备工具。通过合理利用项目管理软件的功能和特点&…

87 # express 应用和创建应用的分离

创建应用的过程和应用本身要进行分离。路由和创建应用的过程也做一个分离。 下面实现创建应用的过程和应用本身要进行分离&#xff1a; express.js const Application require("./application");function createApplication() {// 通过类来实现分离操作return ne…

一篇文章告诉您立仪3D线激光位移传感器

激光位移传感器是利用激光技术进行测量的传感器。它由激光器、激光检测器和测量电路组成。激光传感器是新型测量仪表。能够精确非接触测量被测物体的位置、位移等变化。 可以测量位移、厚度、振动、距离、直径等精密的几何测量。激光有直线度好的优良特性&#xff0c;同样激光…

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则数据插值实现时间序列数据扩充

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则数据插值实现时间序列数据扩充 如时间数据以单位1为间隔排序&#xff0c; 可插间隔为0.5的数据 。 一、实现效果 1.规则间隔数据 2.非规则间隔数据 二、主程序代码 1.插值测试效果 %% 清空环境变量 warning off …

【送书活动1】强势挑战Java,Kotlin杀回TIOBE榜单Top 20!

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 强势挑战Java&#xff0c;Kotlin杀回TIOBE榜单Top 20&#xff01; …

python绘制钻头外径磨损图

import matplotlib.pyplot as plt import numpy as np srcpathrC:\Users\user\Documents\F1-21\data0.125-1.8.txtdef openreadtxt(file_name):data []with open(file_name, r) as file:file_data file.readlines() # 读取所有行for row in file_data:tmp_list row.split()…

跨境支付融合解析:有效解决跨境电商系统开发的支付问题

作为跨境电商系统开发的专家&#xff0c;我们深知支付问题对整个系统的重要性。在不同国家、不同支付体系的交叉领域里&#xff0c;跨境支付融合是一个引人注目的话题。本文将深入探讨跨境支付融合的必要性&#xff0c;分析其优势&#xff0c;并提供一系列解决方案&#xff0c;…

vue-element-admin项目部署 nginx动态代理 含Docker部署、 Jenkins构建

介绍三种方式&#xff1a; 1.直接部署到nginx中 2.用nginx docker镜像部署 3.使用Jenkins构建 1.直接用nginx部署 vue-element-admin项目下有两个.env文件&#xff0c;.env.production是生产环境的&#xff0c;.env.developpment是开发环境的 vue-element-admin默认用的是mock数…

ChatGPT竞争对手Writer,获得1亿美元融资;面向不同任务微调Llama-2经验总结

&#x1f989; AI新闻 &#x1f680; ChatGPT竞争对手Writer&#xff0c;获得1亿美元融资 摘要&#xff1a;美国生成式AI平台Writer宣布获得1亿美元的B轮融资。Writer提供类似于ChatGPT的功能&#xff0c;主要聚焦在企业领域&#xff0c;提供文本生成、总结摘要、文本纠错等服…

注解实现接口幂等性

一、什么是幂等性&#xff1f; 简单来说&#xff0c;就是对一个接口执行重复的多次请求&#xff0c;与一次请求所产生的结果是相同的&#xff0c;听起来非常容易理解&#xff0c;但要真正的在系统中要始终保持这个目标&#xff0c;是需要很严谨的设计的&#xff0c;在实际的生…

C++ 异常处理学习笔记

一、使用情况 1、数组越界&#xff1a;包括数组索引小于0&#xff0c;或者大于数组长度 2、空指针 可以抛出(throw)各种类型的异常&#xff0c;catch的地方接收就可以

电子产品的老化测试有哪些类型?

一、什么是老化测试&#xff1f;老化测试时&#xff0c;专用老化电路板上的元件将承受等于或高于其额定工作条件的压力&#xff0c;以消除任何在额定寿命之前过早失效的元件。这些测试条件包括温度、电压/电流、工作频率或指定为上限的任何其他测试条件。这些类型的压力测试有时…

java -jar后出现中文乱码

吹牛撒谎是道义上的灭亡,它势必引向政治上的灭亡。列宁 黑窗口执行一个jar包&#xff0c;发现程序运行后打印的日志全部出现中文乱码的情况&#xff0c;现记录一下解决的办法。 网上说dos窗口出现中文乱码有两种情况&#xff0c;一是运行jar包后程序输出的日志出现乱码&#x…

节省十倍代码,精益 Web 开发:Nue JS 的极简之道 | 开源日报 No.34

lodash/lodash Stars: 57.3k License: NOASSERTION lodash 是一个以 UMD 模块形式导出的 Lodash 库。 简化 JavaScript 编程&#xff0c;提供了一系列处理数组、数字、对象和字符串等操作的方法。模块化设计&#xff0c;方便迭代数组、对象和字符串&#xff1b;操作和测试值…

MPLS VPN跨域B

拓扑设计 拓扑介绍 如图&#xff0c;上海分公司与山东分公司之间为保证业务可以互通&#xff0c;需要使用MPLS VPN技术进行连接。且为了使设备减轻压力&#xff0c;只有拓扑中两边的设备需要建立VRF实例&#xff0c;其余设备不可以建立实例。因为网络需要经过联通与移动两个AS域…