Java虚拟机对象

news2024/9/29 9:30:01

对象的创建

当虚拟机遇到一条字节码new指令时,首先检查指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化,如果没有就先执行类加载过程。
在类加载检查完毕后,就要对这个对象分配内存了,对象所需的内存大小在类加载完成后就确定了。

内存分配

如果内存规整——所有使用过的内存在一边,所有未使用的内存在另一边,中间有一个指针指向分界点,则分配内存的时候只需要将指针向空闲方向移动指针即可。这种内存分配方式叫做“指针碰撞”。
如果内存不规整,使用过的和空闲的内存混杂在一起,则虚拟机需要维护一个列表,记录哪些内存是可用的,分配的时候在这个列表上找一块内存区域分配给对象,然后更新列表上的记录。
Java堆是否规整取决于垃圾收集器是否带有空间压缩能力。

并发情况

如果正在给对象A分配内存,指针还没来得及修改,此时要给对象B分配内存,就会错误的使用了旧的指针。为了解决这个问题,会有两种方案

  1. 使用CAS和失败重试的方式保证原子性
  2. 每个线程在堆上预先分配一块缓冲区,每个线程优先使用自己的缓冲区分配内存。只有当本地缓冲区用完,分配新的缓冲区的时候才需要同步锁定。

内存分配完成后,虚拟机将分配到的内存空间都初始化为0。如果使用本地缓冲区分配内存的话,这一步可以提前完成。

然后初始化对象头中的信息,比如当前实例属于哪个类,哈希值等。

初始化

从虚拟机的角度,对象已经创建了,从Java程序的角度对象的创建刚刚开始,这时要执行对象的构造函数。

对象的内存布局

在HotSpot虚拟机中,对象在堆中的存储可以划分为三部分:对象头、实例数据、对其填充。

对象头

包含两类信息

  1. 存储对象自身的运行时数据,如哈希码、GC分代年龄、线程持有的锁等。这部分的数据长度为32位或64位(取决于虚拟机的位数)。官方称之为“Mark Word”。
  2. 类型指针,对象指向它类型的指针。Java虚拟机通过这个指针得知这个对象是哪个类的实例。
  3. 如果对象是一个数组,则头中还必须有一块用于记录数据的长度的数据。

实例数据

HotSpot虚拟机默认的分配顺序是longs/doubles、ints、shorts/chars、bytes/boolean、oops(Ordinary Object Pointers),在这个前提下,父类定义的变量出现在子类之前。

对齐填充

由于HotSpot虚拟机内存管理系统要求对象起始地址必须是8字节的整数倍,所以需要这部分将对象大小补齐为8字节的整数倍。

对象的访问

访问对象有两种方式

  1. 通过句柄访问
  2. 通过直接指针访问

如果使用句柄访问的话,则Java堆中需要分出一部分句柄池。Java栈中的reference存放的是句柄地址,在句柄中存放了到类型数据的指针和到对象实例的指针。
在这里插入图片描述
如果通过直接指针访问的话,直接指针指向堆中对象的地址,而且Java堆中对象需要放置访问类型信息的指针。在这里插入图片描述

这两种方法各有优劣,使用句柄访问,当对象移动的时候不需要改变reference的值,只需要改变句柄中的对象实例指针,而使用直接访问要比使用句柄访问更快,只需要一次指针定位。
HotSpot主要使用直接指针。

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

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

相关文章

常见的7种软件规模估算方法 优劣势比较

业内主要的软件规模估算方法:LOC估算方法、故事点估算法、FPA功能点估算方法、COSMIC功能点估算方法、快速功能点估算方法、IFPUG功能点估算方法和自动化功能点估算方法。 1、LOC估算方法 LOC是源代码的总行数。通过统计源代码中的行数,来估算软件规模。…

Spring项目的创建和使用

Spring:Spring是一个包含众多工具方法的IoC容器; Spring的核心功能: 将对象(俗称Bean)存储到Sping容器中从容器中取出对象目录 一,创建Spring项目 1,创建一个Maven项目 2,添加Spri…

[STL]string的使用+模拟实现

[STL]string的使用模拟实现 文章目录[STL]string的使用模拟实现一、STL1.什么是STL2.如何学习STL二、string1.string类的介绍2.string的常用接口string的构造string的迭代器string的容量操作string的访问string的修改string的其他接口string的非成员函数接口三、string的模拟实…

Node【七】初识Express框架

文章目录🌟前言🌟Express框架🌟1.什么是框架🌟2.express安装🌟3.创建web服务基本遵循之前的四个步骤:🌟4.路由🌟 由 :请求方式请求路径(1)get发送…

JAVA+SQL离散数学题库管理系统的设计与开发

题库、试卷建设是教学活动的重要组成部分,传统手工编制的试卷经常出现内容雷同、知识点不合理以及笔误、印刷错误等情况。为了实现离散数学题库管理的信息化而开发了离散数学题库管理系统。 该系统采用C/S 模式,前台采用JAVA(JBuilder2006&am…

面试官:自动化测试都没弄明白,你怎么敢来面试的?

最近看了很多简历,很多候选人年限不小,但是做的都是一些非常传统的项目,想着也不能通过简历就直接否定一个人,何况现在大环境越来 越难,大家找工作也不容易,于是就打算见一见。 在沟通中发现,由…

全国青少年信息素养大赛图形化编程初赛·模拟二卷,含答案解析

全国青少年电子信息智能创新大赛 图形化编程选做题模拟二卷 一、单选题 1. 下图中的程序执行一次之后,“我的变量”最终的值是?( ) A、0或者1 B、true或者false C、包含或者不包含 D、成立或者不成立

纯虚函数和抽象类

什么时候使用纯虚函数: 某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数,只是为了提供一个形式上的借口,准备让子类来做具体化的实现,此时,这个方法就可以定义为"纯虚函数",包含纯虚函数的类,就称为抽象类. 纯虚函…

token详解

token详解前言什么是token?为什么要使用token?那么如何使用token呢?使用Token进行身份验证和授权的过程具体步骤项目上如何运用的tokentoken过期了什么办?总结升华前言 本篇博客主要从什么是token?为什么要使用token&…

C++ 图系列之基于有向无环图的拓扑排序算法

1. 前言 有向无环图,字面而言,指图中不存在环(回路),意味着从任一顶点出发都不可能回到顶点本身。有向无环图也称为 DAG(Directed Acycline Graph)。 有向无环图可用来描述顶点之间的依赖关系,依赖这个概…

MLX90640 热成像 STM32

点击此处了解详情点击此处了解详情点击此处了解详情点击此处了解详情点击此处了解详情 1、描述 这是一款手持式多功能热像仪,小巧轻便,搭载3.2英寸TFT显示屏、MLX90640热红外探头,锂电池供电,可以在各种场合使用,温度…

( “树” 之 DFS) 572. 另一棵树的子树 ——【Leetcode每日一题】

572. 另一棵树的子树 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tr…

Densely Connected Convolutional Networks(引言翻译(有选择性))

翻译得有可能会不太专业,望见谅的同时,如果有些地方翻译错了,欢迎批评指正! as information about the input or gradient passes through many layers, it can vanish and "wash out" by the time it reaches the end …

淄博烧烤、洛阳汉服......爆火,揭秘实体店客流爆满的秘诀!

淄博烧烤、云南泼水、洛阳穿越...... 沉寂了3年后,线下实体消费终于又开始火热起来,临近五一小长假,国内外旅游订单出现井喷式增长,线下消费持续迎来新一轮的高峰。 而这些热点,也带动了周边很多相关的实体店&#xff…

美团外卖平台的部分外卖 SPU数据实操练习

一、环境要求 Hadoop hive spark hbase开发环境 开启hadoop:start-all.sh开启zookeeper:zkServer.sh start开启hive:nohup hive --service metastore &nohup hive --service hiveserver2 & 打开hive界面:beeline -u j…

Ubuntu16.04安装NCNN和Opencv

一、安装NCNN 官网:NCNN官方文档 On Debian, Ubuntu or Raspberry Pi OS, you can install all required dependencies using: 首先安装NCNN的依赖项,根据官网安装以下依赖项。 sudo apt install build-essential git cmake libprotobuf-dev protobuf-…

dc-4靶机渗透

1.信息搜集,扫描存活主机,扫描端口,服务,发现开放80,22端口,cms没有看到 nmap 192.168.85.0/24 nmap -p1-66535 192.168.85.175 nmap -sv 192.168.85.1752.访问网站,发现登录框,根据提示&#…

360安全卫士 - 设置技巧 / 关闭广告

360安全卫士 - 设置技巧 / 关闭广告前言同步设置基本设置弹窗设置开机小助手安全防护中心漏洞修复木马查杀功能大全管理360文件夹游戏管家健康助手前言 360安全卫士是一款免费的PC安全软件,拥有垃圾清理、病毒查杀、启动项管理等功能。虽然有一些广告,但…

【Python】python技能树之包含元祖的列表升降序

文章目录前言一、实际操作二、使用步骤总结前言 大家都知道,在Python里面可以使用.sort方法或者sorted函数对各种数据进行排序,例如: 一、实际操作 a [2, 3, 1, 9, 3, 7, 4] a.sort() b [2, 3, 1, 9, 3, 7, 4] c sorted(b, reverseTrue…

Linux中的网络

文章目录一 、查看网络配置1.2 route命令—查看路由条目1.3 1.3hostname命令—查看主机名称1.4netstat命令—查看网络连接情况二 、测试网络连接2.1 ping 命令2.2 traceroute命令—跟踪数据包的路由途径2.3 mtr—动态跟踪网络2.4 nslookup命令—测试域名解析三 、使用网络配置命…