我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解Java 虚拟机中HotSpot 虚拟机对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解Java 虚拟机中HotSpot 虚拟机对象

今天就跟大家聊聊有关如何理解Java 虚拟机中HotSpot 虚拟机对象,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一、对象的创建

对象的创建步骤:

1. 类加载检查

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

2. 分配内存

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。 对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配【关键词违禁,此句忽视】方式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配【关键词违禁,此句忽视】方式由 Java 堆是否规整决定, 而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

①. 内存分配的两种方式

如何理解Java 虚拟机中HotSpot 虚拟机对象

②. 内存分配并发问题

在创建对象的时候有一个很重要的问题,就是线程安全,因为在实际开发过程中,创建对象是很频繁的事情, 作为虚拟机来说,必须要保证线程是安全的,通常来讲,虚拟机采用两种方式来保证线程安全:

  • CAS+失败重试: CAS 是乐观锁的一种实现方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。

  • TLAB: 每一个线程预先在Java堆中分配一块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)。哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才采用上述的CAS进行内存分配。

3. 初始化零值

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

4. 设置对象头

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

5. 执行init方法

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

二、对象的内存布局

在 Hotspot 虚拟机中,对象在内存中的布局可以分为 3 块区域:对象头、实例数据、对齐填充。

1. 对象头

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

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

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

2. 实例数据

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

3. 对齐填充

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

三、对象的访问定位

建立对象就是为了使用对象,我们的Java程序通过栈上的 reference 数据来操作堆上的具体对象。 对象的访问方式视虚拟机的实现而定,目前主流的访问方式有两种:使用句柄、直接指针。

1. 使用句柄

如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息 。

2. 直接指针

如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而 reference 中存储的直接就是对象的地址。

这两种对象访问方式各有优势:

  • 使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改。

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

看完上述内容,你们对如何理解Java 虚拟机中HotSpot 虚拟机对象有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解Java 虚拟机中HotSpot 虚拟机对象

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解Java 虚拟机中HotSpot 虚拟机对象

今天就跟大家聊聊有关如何理解Java 虚拟机中HotSpot 虚拟机对象,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、对象的创建对象的创建步骤:1. 类加载检查虚拟机遇到一条 n
2023-06-05

如何理解JAVA虚拟主机

今天就跟大家聊聊有关如何理解JAVA虚拟主机,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。其实虚拟主机也可以称之为网站空间,就是把一台运行在互联网上的物理服务器,划分为多个虚拟服务器
2023-06-07

怎么在Java中创建虚拟机对象

这篇文章给大家介绍怎么在Java中创建虚拟机对象,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、对象的创建1.1 new 类名虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,
2023-06-15

从小工到专家的 Java 进阶之旅:HotSpot虚拟机对象探秘

Java 堆中将可能会划分出一块内存来作为句柄池,reference 中存储的是对象的句柄地址,句柄中包含了对象实例数据和类型数据各自的具体地址信息。好处是解耦,reference 中存储的是稳定句柄地址,在对象被移动(垃圾回收等)时只会改

深入浅析java虚拟机中的对象访问

今天就跟大家聊聊有关深入浅析java虚拟机中的对象访问,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java 虚拟机中对象访问详解对象访问会涉及到Java栈、Java堆、方法区这三个
2023-05-31

如何优化Java虚拟机

这篇文章将为大家详细讲解有关如何优化Java虚拟机,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。堆设置-Xmx3550m:设置JVM最大堆内存为3550M。-Xms3550m:设置JVM初始堆内存为355
2023-05-30

深入理解Java虚拟机:程序计数器与虚拟机栈详解

在Java​源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference​)保存在class文件的常量池里。

虚拟机operatingsystemnotfound如何解决

这篇“虚拟机operatingsystemnotfound如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“虚拟机ope
2023-07-01

如何在 Cockpit 中管理虚拟机

如果使用 libvirt 运行现有虚拟机,Cockpit 可能会检测到它们并在此面板中列出它们。如果 Cockpit 无法检测到现有虚拟机,您可以通过单击导入 VM 按钮导入它们。

虚拟主机如何部署java

要部署Java应用程序,可以按照以下步骤在虚拟主机上进行操作:1. 首先,确保您的虚拟主机支持Java应用程序的部署。通常,虚拟主机提供商会在其官方网站上明确说明是否支持Java。2. 登录到您的虚拟主机的控制面板或使用SSH等远程访问工具
2023-09-12

虚拟主机如何部署java

虚拟主机部署Java的步骤选择支持Java的虚拟主机提供商,创建帐户,创建域并设置DNS。在虚拟主机上安装Java,部署Java应用,配置Web容器,部署数据库,测试和排错。最后,监控和维护应用程序,并遵循最佳实践,如使用版本控制、启用自动部署、实施安全措施和定期备份。
虚拟主机如何部署java
2024-04-09

如何解决无法创建 Java 虚拟机的问题?(无法创建java虚拟机如何解决)

在Java开发过程中,有时会遇到无法创建Java虚拟机的情况,这可能会导致程序无法正常运行。本文将详细介绍无法创建Java虚拟机的原因以及解决方法。一、无法创建Java虚拟机的原因内存
如何解决无法创建 Java 虚拟机的问题?(无法创建java虚拟机如何解决)
Java2024-12-22

Java虚拟机的Heap怎么理解

本篇内容介绍了“Java虚拟机的Heap怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java虚拟机中,我是一个位高权重的大管家,
2023-06-02

深入理解Java虚拟机:堆详解

内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差

如何理解独立IP虚拟主机

如何理解独立IP虚拟主机,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、自主性IP虚拟主机,也叫独立IP空间,也被一些人误认为是“独立IP主机”。正如其名称所
2023-06-25

如何理解Java 虚拟机中的String 类和常量池

本篇文章为大家展示了如何理解Java 虚拟机中的String 类和常量池,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、String 对象的两种创建方式String str1 = "abcd";S
2023-06-05

如何部署 Java 虚拟主机环境?(java虚拟主机环境怎么部署)

在当今的互联网时代,Java应用程序的部署变得越来越重要。虚拟主机环境为Java应用提供了一个稳定、高效的运行平台。本文将详细介绍如何部署Java虚拟主机环境,帮助你轻松搭建起自己的Java应用服务器。一、准备工作
如何部署 Java 虚拟主机环境?(java虚拟主机环境怎么部署)

java虚拟机创建失败如何解决

如果Java虚拟机创建失败,可以尝试以下解决方法:检查系统环境变量是否正确配置,包括JAVA_HOME和PATH变量。检查系统是否有足够的内存可用。可以尝试增加虚拟机的内存分配。确保安装的Java版本与应用程序要求的Java版本匹配。
java虚拟机创建失败如何解决
2024-04-09

java虚拟机创建失败如何解决

如何解决Java虚拟机(JVM)创建失败?检查Java环境、重启计算机、增加堆内存、检查文件权限、禁用安全模式、检查系统资源、更新驱动程序、检查病毒或恶意软件、卸载并重新安装Java、检查依赖关系、检查GC日志、使用不同的JVM、联系供应商寻求支持。
java虚拟机创建失败如何解决
2024-04-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录