对象分配、布局和访问

A股量化实战:用Python回测动量因子策略(附聚宽完整代码) 本文详细介绍了如何在A股市场使用Python和聚宽平台,实战回测一个动量因子量化交易策略。从环境搭建、数据获取到完整的策略代码实现与回测分析,手把手教你验证“强者恒强”的投资逻辑,并提供参数优化与实战避坑指南,助力量化新手迈出第一步。 阅读详情

1、对象的创建

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

在类加载检查通过后为新生对象分配内存。内存分配方式有两种:

(1)指针碰撞:指针碰撞的前提是Java堆是绝对规整的,有用的和空闲各自放在一边,中间放着一个指针作为分界点指示器,所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。在使用Serial,和ParNew等收集器时候使用的是指针碰撞。

(2)空闲列表:如果Java堆不是规整的,已使用的内存和空闲的内存相互交错,虚拟机就必须维护一个列表,记录了哪些是可用的内存,在分配的时候从列表中找到一块足够大的空间分配给对象实例,并更新列表上的记录。在使用CMS这种基于Mark-Sweep算法的收集器时,通常采用空闲列表。

在并发情况下为保证线程安全,在分配内存时可以对分配内存空间的动作进行同步处理,或者把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)。若采用此方式,内存空间初始化为零值将提前至TLAB分配时进行。

    内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值。

接下来要对对象进行必要的设置,例如这个对象是哪个类的实例,对象的哈希码,对象的GC分代年龄等信息。这些信息存放在对象的对象头中。

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

2、对象的内存布局

在 HotSpot 虚拟机中,对象在内存中存储布局分为 3 块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。

(1)对象头

HotSpot 虚拟机的对象头包括两部分(非数组对象)信息:

  • 第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳、对象分代年龄,这部分信息称为“Mark Word”;Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据自己的状态复用自己的存储空间。
  • 第二部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;
  • 如果对象是一个 Java 数组,那在对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通 Java 对象的元数据信息确定 Java 对象的大小,但是从数组的元数据中无法确定数组的大小。

这部分数据的长度在 32 位和 64 位的虚拟机(未开启压缩指针)中分别为 32bit 和 64bit。

(2)实例数据

实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类中继承下来的,还是在子类中定义的,都需要记录下来。这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在 Java 源码中定义顺序的影响。

(3)对齐填充

对齐填充不是必然存在的,没有特别的含义,它仅起到占位符的作用。

由于 HotSpot VM 的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,也就是说对象的大小必须是 8 字节的整数倍。对象头部分是 8 字节的倍数,所以当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

3、对象的访问定位

Java程序需要通过栈上的引用数据来操作堆上的具体对象。对象的访问方式取决于虚拟机实现,目前主流的访问方式有使用句柄和直接指针两种。

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

优势:引用中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而引用本身不需要

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

优势:速度更快,节省了一次指针定位的时间开销。由于对象的访问在Java中非常频繁,因此这类开销积少成多后也是非常可观的执行成本。(例如HotSpot)


COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件) 本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。 阅读详情

相关推荐

网格自适应_Comsol案例解析17:自适应网格的使用

本期导读自适应网格细化有许多优势,比如可以不用对网格进行全局加密,增加计算精度,又会降低求解自由度。本期仍然以气泡上升案例为例,在两相流模块中使用自适应网格。【打开案例模型】【修改网格】适当让气泡边界加密,注意,曲率因子越小,曲线上的网格越密【添加自适应网格】使用默认的参数即可,这里的误差指示器用的是水平集phi。可以根据具体求解模型选择适当的自变量作为误差指示器。【口诀】默认的一般是最...

weixin_28726871的博客 5682

JVM 堆中对象分配、布局和访问

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达 作者|低吟不作语来源 | urlify.cn/a6v22m1、对象的创建Java 是一门面向对象的语言,Java 程...

JAVA高级架构 347

用CesiumLab2+nginx零成本构建三维地形服务:从DEM数据到浏览器渲染全流程

本文详细介绍了如何利用CesiumLab2和nginx零成本构建私有三维地形服务的完整流程。从获取DEM数据、使用CesiumLab2进行格式转换,到配置nginx服务器并重点解决跨域问题(Access-Control-Allow-Origin),最终实现在Cesium中流畅加载与渲染自定义地形,为内网或涉密项目提供了高性价比的解决方案。

weixin_29300931的博客 117

HotSpot虚拟机中对象的分配、布局和访问

本篇文章以HotSpot虚拟机和常用的内存区域Java堆为例,深入探讨HotSpot在Java堆中对象分配、布局和访问的全过程。 对象的创建 在Java对象的创建和初始化一文中,我们知道了创建对象的几种方式。虚拟机在遇到创建指令时,首先会去检查对象所代表的类是否已经被加载、解析和初始化过。如果没有,那么必须执行相应的类加载过程,详细细节可参考Java类的加载和初始化。 空间分配 在类加载完成后,将...

Embrace Change 115

OCC入门指南:从零开始掌握Open CASCADE Technology

本文是Open CASCADE Technology(OCC)的入门指南,详细介绍了这款开源C++三维几何建模内核的核心概念与价值。内容涵盖从零开始搭建开发环境、编写第一个显示立方体的程序,到深入理解其几何与拓扑核心、掌握Draw测试工具及Handle内存管理等关键编程范式,旨在帮助开发者快速掌握这一工业级CAD/CAE/CAM应用开发利器。

java5的博客 1276

【可不卸载重装】VS2019新建项目里没有CUDA选项

问题:VS2019 新建项目里没有CUDA选项,vs也属性没有cuda。这是因为你在Visual Studio 2019安装之前,先安装了CUDA Toolkit。

qq_62844901的博客 1321

虚拟机对象的分配、布局和访问

文章目录1. 对象的创建1.1 内存分配方式指针碰撞(Bump the Pointer)空闲列表(Free List)线程安全问题2. 对象的内存布局2.1 对象头2.2 实例数据2.3 对齐填充3. 对象的访问定位3.1 句柄3.2 直接指针访问 1. 对象的创建 ​ 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配

tb1542的博客 248

基于STM32、HAL库的CH9434总线转UART驱动程序设计

CH9434是一款USB转4串口控制芯片,可以将单个USB接口扩展为4个独立的串口(UART)。支持多种数据格式(数据位5-8,停止位1/1.5/2,奇偶校验或无校验)// 读取接收到的数据。// 重新启动接收中断。// 向所有4个串口发送数据。// UART初始化函数示例(USART1)// 其他UART初始化函数类似...// 初始化CH9434。// 初始化UART1。// 初始化UART2。// 初始化UART3。// 初始化UART4。工作电压:3.3V/5V兼容。

corlin6688的博客 990

JVM—堆中Java对象分配、布局和访问的全过程

一 、对象的创建 1.1 创建对象的几种方式 使用new 使用Class 类的 newInstance() 使用Constructor类的newInstance() 实现Cloneable接口并重写clone()方法 使用反序列化 2.2 JVM层面创建对象的过程 判断对象对应的类是否加载、链接、初始化 为对象分配内存 内存绝对规整,采用“指针碰撞”;不规整采用“空闲列表” 处理并发安全问题 将分配到的内存空间(但不包括对象头)都初始化为零值 设置对象的对象头 调用Class

多一天,多一点 1214

喷涂机器人系列编程:ABB IRB 5500_(2).ABB IRB 5500喷涂机器人系统架构与组件

ABB IRB 5500喷涂机器人系统不仅在性能上表现出色,而且在安全和维护方面也提供了全面的解决方案。通过本文的详细介绍,希望读者能够更好地理解和掌握这一系统的架构和功能,为实际应用提供有力支持。

zhubeibei168的博客 779

Python调用CANoe(1)(启动与停止,变量和信号读写)

CANoe因为其封闭性(Vector独有),开发的时候,有很多局限性;Python 因为其开源,容易上手,功能强大,那么Python 和 CANoe结合会产生怎样的火花呢?

蚂蚁小兵 4万+

虚拟机在Java堆中对象分配、布局和访问

JAVA堆内存规整,已使用的和空闲的内存分为在两侧,中间由一个指针作为分界点,为新生对象分配内存只需将指针向空闲内存挪动一段与对象大小相等的距离就可以。,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。JAVA堆内存不规整,使用的内存和空闲的内存交错在一起,虚拟机需要维护一个空闲列表,记录可用内存,在分配时从列表上选取。,如无,先进行类加载过程,若已类加载通过,才可以为对象分配内存。

Hx_blog的博客 166

学 Simulink—— 基于储能系统(BESS)并网逆变器的 削峰填谷(Peak Shaving & Valley Filling)功能仿真

本文详细介绍了基于储能系统(BESS)并网逆变器的削峰填谷功能Simulink仿真方法。主要内容包括:1)削峰填谷原理与典型日负荷曲线控制逻辑;2)简化系统拓扑与关键参数设置;3)分步骤建模过程,重点讲解EMS控制逻辑、SOC模型和PQ控制实现;4)典型仿真结果分析及参数调优建议;5)常见问题解决方案和工程扩展方向。通过该仿真可掌握BESS在用户侧储能、虚拟电厂等场景的核心应用,实现电网侧功率按峰谷时段规划、BESS充放电控制及并网逆变器PQ控制。文章还提供了完整的BESS/微网系列课程框架和混合微网系统进

xiaoheshang_123的博客 42

JVM学习总结(二)——对象分配、布局和访问

一、对象的创建 在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已。 虚拟机中,对象的创建过程(仅限于普通Java对象,不包括数组和Class对象等) 类加载检查: 当JVM遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 为新生对象分配内存: 在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,

Luffy的博客 301

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HotSpot 虚拟机对象分配、布局和访问的全过程

原文地址 对象的创建 1. 类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 2. 分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存...

Chen65432125的博客 307

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HotSpot虚拟对象(对象创建 内存分配 栈上分配 TLAB 对象内存布局和对象访问等 )

对象的创建 整个对象的创建过程如下所示: 首先进行类加载的检查:虚拟机遇到new指令的时候,首先去检查该指令的参数是否能够在常量池中定位到这个类的符号引用,并且检查该符号引用代表的类是否已经被加载过、解析和初始化过。若没有,必须先执行相应的类加载的过程。 分配内存:类加载检查通过之后,虚拟机为对象分配内存。(内存大小在类加载完后就能确定)。分配的方式有“指针碰撞”和“空闲列表”两种,若java...

mulinsen77的博客 1204

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

虚拟机在 Java 堆中的对象分配、布局和访问

TLAB: 为每一个线程预先在 Eden 区分配一块儿内存,JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,当对象大于 TLAB 中的剩余内存或 TLAB 内存已用尽时,再采用上述的 CAS 进行内存分配。初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始, 方法还没有执行,所有的字段都还为零。...

z2431435的博客 207

java中堆的对象中值,JVM 堆中对象分配、布局和访问

优质文章,第一时间送达作者 | 低吟不作语来源 | urlify.cn/a6v22m1、对象的创建Java 是一门面向对象的语言,Java 程序运行过程中无时无刻都有对象被创建出来。从语言层面看,创建对象只是一个 new 关键字而已,而在虚拟机中,对象(仅限于普通 Java 对象,不包括数组和 Class 对象等)的创建又是怎么一个过程呢?以 Hotspot 虚拟机为例,当虚拟机遇到一条字节码...

weixin_42181693的博客 142

JVM夯实之路—对象在堆中分配、布局和访问全过程

本文详细讲解。

li2683056515的博客 219

java空布局如何定位_JVM 堆中对象分配、布局和访问

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达作者|低吟不作语来源 | urlify.cn/a6v22m1、对象的创建Java 是一门面向对象的语言,Java 程序运行过程中无时无刻都有对象被创建出来。从语言层面看,创建对象只是一个 new 关键字而已,而在虚拟机中,对象(仅限于普通 Java 对象,不包括数组和 Class 对象等)的创建又是怎么一个过程呢?以 Hotspot 虚...

weixin_42129412的博客 249

JVM 之 HotSpot虚拟机对象在Java堆中分配、布局和访问的全过程【对象分配的具体流程?内存分配时有哪些策略?如何解决并发问题?对象布局?头信息中存放了哪些数据?对象访问定位的方式有哪些?】

1、对象的创建:类加载检查(没加载则加载,获取对象所需内存)-》内存分配(指针碰撞、空闲列表,并发通过TLAB+CAS重试 解决)-》对象初始化(设置对象头信息+其他信息零值填充)-》调用构造器(dup指令复制对象指针+invokespecial指令调用对象构造方法)。 2、对象的内存分布:对象头(mark word(哈希码+GC年龄+锁标志位)+类元数据指针+数组长度)+实例数据(根据字段类型排序)+对齐填充(保证是8字节的倍数) 3、对象的访问定位:句柄访问、直接指针访问

人生快意事,读的好书,觅得良友 569

虚拟机在Java堆中对象分配、布局和访问的过程

虚拟机在Java堆中对象分配、 布局和访问的过程1. 对象的创建2. 对象的内存布局3. 对象的访问定位 1. 对象的创建 当虚拟机执行到一条new字节码指令的时候,会先检查这个指令的参数在常量池中是否能定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载,解析,初始化过。如果没有,则执行类的加载过程。 在类加载检查通过之后,虚拟机开始为新生对象分配内存。所需的内存大小在类加载之后便可确定,为对象分配内存空间就相当于把java堆中的一部分内存划分出来。假如java堆中的内存是规整的,被使用的内存

weixin_47389238的博客 284

HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程

三个过程:对象创建、内存布局、访问定位。 1、对象的创建 (1)虚拟机遇到一条new指令时,首先将取检查这个指令的参数是否能在常量池中定位到一个类的引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。 (2)在类加载检查通过后,虚拟机将为新生对象分配内存。 假设Java堆中内存时绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存...

昨日的桥 232

深入理解JVM在Java堆中对象分配、布局和访问的全过程

1.1 对象的创建 本文所讨论的对象限于普通Java对象,不包括数组和Class对象。虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,(下文将会提及)为对象...

javashareauthor的博客 604

理解Java虚拟机(二)对象分配、布局和访问的全过程

  本篇介绍HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。 一、对象的创建 1.1 为新生对象分配内存   为新生对象分配内存有两种方式:指针碰撞(Bump The Pointer)和空闲列表(Free List)。 1.1.1 指针碰撞   垃圾收集器带空间压缩整理能力时,Java堆内存是规整的,所有被使用过的内存都被放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离。 1.2.2空闲列表   已使用

jinyangjie的博客 445
上一篇: 美图笔试总结
下一篇: Spring依赖注入
yang_9613
博客等级 码龄10年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值