【Hotspot虚拟机创建对象的过程是什么样的?】

1. 类加载检查
  • 触发条件:当遇到 new 指令时,JVM首先检查该指令的参数(类符号引用)是否已在常量池中。
  • 检查内容
    • 类是否已被加载、解析和初始化。
    • 若未加载,则触发类加载过程(加载 → 验证 → 准备 → 解析 → 初始化)。
  • 目的:确保类元数据可用,避免后续操作因类未定义而失败。

2. 内存分配
  • 分配方式
    • 指针碰撞(Bump the Pointer):适用于内存规整的堆(如Serial、ParNew收集器)。
      通过移动指针划分内存,分配速度快(仅需指针移动)。
    • 空闲列表(Free List):适用于内存不规整的堆(如CMS收集器)。
      维护可用内存块列表,分配时搜索足够大的空间。
  • 线程安全
    • TLAB(Thread Local Allocation Buffer):为每个线程预分配堆内存区域,避免CAS竞争。
    • CAS重试:当TLAB不足时,使用CAS同步分配。

3. 初始化零值
  • 操作内容:将对象的内存空间初始化为零值。
    • 基本类型字段:int0booleanfalse
    • 引用类型字段:null
  • 目的:确保对象字段在不显式初始化时也能直接使用。

4. 设置对象头(Object Header)
  • 对象头结构(64位JVM):
    • Mark Word:存储哈希码、GC分代年龄、锁状态(偏向锁/轻量级锁/重量级锁)等信息。
    • Klass Pointer:指向类元数据,确定对象类型。
  • 示例
    |---------------------------|
    |        Mark Word (64位)    |
    |---------------------------|
    |   Klass Pointer (32位)     |
    |---------------------------|
    

5. 执行 <init> 方法
  • 步骤
    1. 初始化父类:递归调用父类构造方法(super())。
    2. 实例变量赋值:按代码顺序执行显式初始化和构造代码块。
    3. 构造器代码:执行用户编写的构造方法逻辑。
  • 目的:完成对象按业务需求的初始化。

内存分配优化策略

策略说明适用场景
TLAB分配线程私有内存区域,减少CAS竞争高频创建小对象的场景
逃逸分析若对象未逃逸方法,可能在栈上分配或标量替换方法内部临时对象(JIT优化)
大对象直接进入老年代避免在新生代频繁复制(通过 -XX:PretenureSizeThreshold 设置阈值)大数组、大字符串等

对象内存布局

区域内容大小(64位JVM)
对象头(Header)Mark Word(锁状态、哈希码等) + Klass Pointer(类元数据指针)12字节(开启压缩指针)
实例数据(Instance Data)对象实际字段值(包括父类继承字段)由字段类型和数量决定
对齐填充(Padding)补齐对象大小为8字节的整数倍0~7字节

常见问题与解决方案

  1. 内存分配失败

    • 触发GC:当Eden区空间不足时,触发Minor GC。
    • OOM处理:若GC后仍无法分配,抛出 OutOfMemoryError
  2. 线程竞争

    • TLAB优化:通过 -XX:+UseTLAB 启用(默认开启),减少CAS冲突。
  3. 对象初始化顺序

    • 字段默认值 → 显式赋值 → 构造器代码:确保初始化符合Java规范。

总结

Hotspot虚拟机通过 类加载检查 → 内存分配 → 初始化 → 对象头设置 → 构造方法调用 的流程创建对象,结合 TLAB、逃逸分析 等优化策略,平衡性能与安全性。理解这一过程有助于优化代码(如减少大对象创建)和排查内存问题(如OOM)。

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

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

相关文章

南墙WAF非标端口防护实战解析——指定端口安全策略深度剖析

本文系统解析非标端口DDoS攻击防护难点&#xff0c;重点阐述南墙WAF在指定端口防御中的技术突破。通过某金融机构真实攻防案例&#xff0c;结合Gartner最新防御架构模型&#xff0c;揭示如何构建基于智能流量建模的精准防护体系&#xff0c;为金融、政务等关键领域提供可落地的…

Context的全面解析:在不同技术应用中的通用作用与差异

Context的全面解析&#xff1a;在不同技术应用中的通用作用与差异 引言&#xff1a; 在软件开发中&#xff0c;“Context”这个概念被广泛使用。它不仅限于某个特定的技术或编程语言&#xff0c;实际上&#xff0c;Context 作为一种抽象的设计模式&#xff0c;贯穿在许多开发领…

寻找峰值 --- 二分查找

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码实现 class Solution { public:int findPeakElemen…

基础算法训练7

目录 库存管理II 翻转对 合并K个升序链表 存在重复元素II 字符串相乘 字符串解码 在每个树行中找最大值 数据流的中位数 被包围的区域 为高尔夫比赛砍树 库存管理II LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;先进行排序&a…

从单机版到超级APP:MCP如何解锁AI的超能力

MCP&#xff1a;AI界的“万能充电宝”——让AI从此告别“语言不通”的尴尬&#xff01; 开篇&#xff1a;AI咖啡馆的尴尬日常 想象一下这样的场景&#xff1a; 一位AI助手在咖啡馆里手忙脚乱——它想帮用户点杯咖啡&#xff0c;但需要先写代码调用天气API&#xff08;“今天下…

Grafana将弃用AngularJS-我们该如何迁移

AngularJS 弃用时间线 AngularJS 支持已在 Grafana 9 中正式弃用。在 2024 年 5 月发布的 Grafana 11 中&#xff0c;所有 Grafana Cloud 和自托管安装默认关闭该功能。到 Grafana 12 版本时&#xff0c;将完全移除对 AngularJS 的支持&#xff0c;包括配置参数开关 angular_s…

Qt之opengl定点数据添加更多属性

将颜色数据加入到定点数据中去 shader中代码 api中的代码 #include "sunopengl.h"#include <QTime>sunOpengl::sunOpengl(QWidget *parent) { } unsigned int VBO,VAO; float vertices[]{0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, 0.0f, 0.0f, 1.0f…

【Flink运行时架构】作业提交流程

本文介绍在单作业模式下Flink提交作业的具体流程&#xff0c;如下图所示。 客户端将作业提交给YARN的RM&#xff1b;YARN的RM启动Flink JobManager&#xff0c;并将作业提交给JobMaster&#xff1b;JobMaster向Flink内置的RM请求slots&#xff1b;Flink内置的RM向YARN RM请求…

AI大模型技术之RAG、模型微调、知识蒸馏

AI大模型技术之RAG、模型微调、知识蒸馏 检索增强生成&#xff08;RAG&#xff09;技术原理垂直领域应用场景使用的局限性 模型微调&#xff08;Fine-tuning&#xff09;技术原理垂直领域应用场景使用的局限性 知识蒸馏&#xff08;Distillation&#xff09;技术原理垂直领域应…

深入浅出:信号灯与系统V信号灯的实现与应用

深入浅出&#xff1a;信号灯与系统V信号灯的实现与应用 信号灯&#xff08;Semaphore&#xff09;是一种同步机制&#xff0c;用于控制对共享资源的访问。在多线程或多进程环境下&#xff0c;信号灯能够帮助协调多个执行单元对共享资源的访问&#xff0c;确保数据一致性与程序…

消防设施操作员岗位注意事项有哪些?

消防设施操作员主要负责消防设施的操作、维护和管理等工作&#xff0c;其岗位注意事项涉及操作规范、设备维护、应急处理等多个关键领域&#xff0c;以下是具体内容&#xff1a; 操作规范方面 熟悉设备原理&#xff1a;要全面了解各类消防设施的工作原理、性能参数和操作方法…

SQL:Relationship(关系)

目录 &#x1f517; 什么是 Relationship&#xff1f; 三种基本关系类型&#xff08;基于实体间的关系&#xff09;&#xff1a; 1. 一对一&#xff08;One-to-One&#xff09; 2. 一对多&#xff08;One-to-Many&#xff09; 3. 多对多&#xff08;Many-to-Many&#xf…

php伪协议

PHP 伪协议&#xff08;PHP Stream Wrapper&#xff09; PHP 的伪协议&#xff08;Protocol Wrapper&#xff09;是一种机制&#xff0c;允许开发者通过统一的文件访问函数&#xff08;如 file_get_contents、fopen、include 等&#xff09;访问不同类型的数据源&#xff0c;包…

当DRAM邂逅SSD:新型“DRAM+”存储技术来了!

在当今快速发展的科技领域&#xff0c;数据存储的需求日益增长&#xff0c;对存储设备的性能和可靠性提出了更高的要求。传统DRAM以其高速度著称&#xff0c;但其易失性限制了应用范围&#xff1b;而固态硬盘SSD虽然提供非易失性存储&#xff0c;但在速度上远不及DRAM。 为了解…

org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow...

Spark异常&#xff1a;Kryo serialization failed: Buffer overflow. 1、问题描述 SparkSQL任务报错如下&#xff1a; org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: xxx. To avoid this, increase spark.kryoseri…

编译原理 实验二 词法分析程序自动生成工具实验

文章目录 实验环境的准备实验实验预备知识分析案例所要做的任务实战 实验环境的准备 安装flex 安装MinGW MinGW Installation Manager页面 apply changes 下载比较耗时 只看到了一个文件&#xff0c;复制过去 配置环境变量 使用gcc -v检验是否安装完成 实验 实验预备知识…

BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调

本节代码将使用 transformers 库加载预训练的BERT模型和分词器&#xff08;Tokenizer&#xff09;&#xff0c;并处理文本输入。 1. 加载预训练模型和分词器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…

Python 质数筛选:从入门到优化的 5 种方法

质数&#xff08;Prime Number&#xff09;是指只能被 1 和自身整除的自然数&#xff0c;如 2、3、5、7 等。在算法题、密码学或数学计算中&#xff0c;高效生成质数至关重要。 Python 提供了多种方法来实现质数筛选&#xff0c;但不同方法的效率差异巨大。本文从 最基础的方法…

C#MQTT协议服务器与客户端通讯实现(客户端包含断开重连模块)

C#MQTT协议服务器与客户端通讯实现 1 DLL版本2 服务器3 客户端 1 DLL版本 MQTTnet.DLL版本-2.7.5.0 基于比较老的项目中应用的DLL&#xff0c;其他更高版本变化可能较大&#xff0c;谨慎参考。 2 服务器 开启服务器 关闭服务器 绑定事件【客户端连接服务器事件】 绑定事件【客户…

【连载3】基础智能体的进展与挑战综述

基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 2. 认知 人类认知是一种复杂的信息处理系统&#xff0c;它通过多个专门的神经回路协调运行…