当前位置: 首页 > news >正文

深入解析JVM中对象的创建过程

1. 引言

对象是面向对象编程的核心概念之一,它们封装了数据和行为,构成了应用程序的基本构建块。然而,在Java语言中,每当使用new关键字或其他方式创建一个新对象时,背后发生了什么?这个问题的答案隐藏在JVM内部的工作机制之中。接下来,我们将逐步揭开这一神秘面纱。


2. 对象创建的主要流程
2.1 类加载检查

当JVM遇到一条new指令时,它首先会进行一次类加载检查。具体来说,JVM需要验证该指令引用的类是否已经被加载到方法区中。如果尚未加载,则必须先执行类加载过程,这通常涉及以下几个子步骤:

  • 加载:查找并导入类或接口的二进制表示形式。
  • 链接
    • 验证:确保加载的类文件格式正确并且符合当前运行环境的要求。
    • 准备:为静态变量分配内存空间,并设置默认值。
    • 解析:将符号引用转换成直接引用。
  • 初始化:执行静态初始化器和静态字段赋值语句。

只有当上述所有条件都满足后,JVM才会继续后续的对象创建过程。

2.2 内存分配

一旦通过了类加载检查,JVM就会开始为新对象分配内存。根据堆的状态不同,有两种主要的内存分配策略:“指针碰撞”和“空闲列表”。

  • 指针碰撞:适用于堆内存绝对规整的情况,即已使用的内存和空闲内存之间有明显的边界。此时,只需简单地移动指针即可完成分配。
  • 空闲列表:对于那些已经碎片化的堆,JVM维护一个记录可用内存块的列表,并从中选择合适的位置来放置新对象。

此外,为了提高并发性能,JVM还引入了本地线程分配缓冲(TLAB),允许每个线程拥有自己的小块内存区域,从而减少了全局锁的竞争。

2.3 初始化零值

在成功分配内存之后,JVM会立即将这块内存中的所有位设为零。这样做有两个目的:一是保证未明确初始化的实例字段具有合理的初始值;二是简化垃圾回收过程中对未引用对象的识别。

2.4 设置对象头

紧接着,JVM会在分配给对象的内存前面附加一个称为“对象头”的结构,其中包含了关于该对象的重要信息,如对象所属的类、哈希码、GC分代年龄等。这部分信息对于支持多线程编程以及实现高效的垃圾回收至关重要。

2.5 执行<init>方法

最后一步是调用构造函数<init>来完成对象的个性化初始化。这是由程序员定义的部分,用来设置成员变量的具体值,从而赋予对象特定的行为和状态。


3. 高级特性与优化

除了基本的对象创建流程之外,JVM还提供了若干高级特性和优化措施,以进一步提升程序性能和资源利用率:

3.1 指针压缩

在64位平台上,默认启用-XX:+UseCompressedOops参数使得JVM能够在不超过32GB的堆大小下使用32位指针表示对象引用,以此减少内存消耗并加快访问速度。

3.2 栈上分配与逃逸分析

借助逃逸分析技术,JVM能够识别出那些不会被外部访问的对象,并考虑将其分配至栈上而非堆中,进而减轻GC负担。此功能依赖于-XX:+DoEscapeAnalysis参数开启,并结合标量替换技术进一步优化临时对象的分配。

3.3 Eden区分配

大多数情况下,对象会在新生代中的Eden区分配内存。当Eden区满时触发Minor GC,存活下来的对象会被移动到Survivor区或直接晋升至老年代。JVM提供了灵活的比例配置选项(例如8:1:1)以及自适应调整策略,以应对不同的应用场景需求。

3.4 大对象直接进入老年代

针对需要大量连续内存的大对象,为了避免频繁复制导致效率低下,可以通过设置-XX:PretenureSizeThreshold参数让其直接进入老年代。

3.5 长期存活对象晋升老年代

随着对象经历多次Minor GC仍然存活,其年龄逐渐增加,最终达到一定阈值后会被转移到老年代,这一过程可通过-XX:MaxTenuringThreshold参数控制。

相关文章:

深入解析JVM中对象的创建过程

1. 引言 对象是面向对象编程的核心概念之一&#xff0c;它们封装了数据和行为&#xff0c;构成了应用程序的基本构建块。然而&#xff0c;在Java语言中&#xff0c;每当使用new关键字或其他方式创建一个新对象时&#xff0c;背后发生了什么&#xff1f;这个问题的答案隐藏在JV…...

使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;人工智能教程 文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime …...

ffmpeg之显示一个yuv照片

显示YUV图片的步骤 1.初始化SDL库 目的&#xff1a;确保SDL库正确初始化&#xff0c;以便可以使用其窗口、渲染和事件处理功能。操作&#xff1a;调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 2.创建窗口用于显示YUV图像&#xff1a; 目的&#xff1a;创建一个…...

MySQL中Performance Schema库的详解(下)

昨天说了关于SQL语句相关的&#xff0c;今天来说说性能相关的&#xff0c;如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...

【Rust自学】7.1. Package、Crate和定义Module

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.1.1. Rust的代码组织 代码组织主要包括&#xff1a; 那些细节可以对外暴露&#xff0c;而哪些细节是私有的在作用域内哪些名称有效… …...

【Git】-- 版本说明

Alpha&#xff1a;是内部测试版,一般不向外部发布,会有很多 Bug .一般只有测试人员使用。Beta&#xff1a;也是测试版&#xff0c;这个阶段的版本会一直加入新的功能。在 Alpha 版之后推出。RC&#xff1a;(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台…...

1919C. Grouping Increases

问题描述 序列 X X X&#xff0c;划分成两个字序列 A , B A,B A,B&#xff0c;其中惩罚是 A , B A,B A,B之中&#xff0c; A [ i ] < A [ i 1 ] , B [ i ] < B [ i 1 ] A[i] < A[i1], B[i] < B[i1] A[i]<A[i1],B[i]<B[i1]的个数 思路 拆分 X X X&#xf…...

Pion WebRTC 项目教程

Pion WebRTC 项目教程 webrtc Pure Go implementation of the WebRTC API [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/webrtc 1. 项目目录结构及介绍 Pion WebRTC 项目的目录结构如下&#xff1a; pion/webrtc ├── api ├── examples ├── inter…...

【安全编码】Web平台如何设计防止重放攻击

我们先来做一道关于防重放的题&#xff0c;答案在文末 防止重放攻击最有效的方法是&#xff08; &#xff09;。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准&#xff0c;或者…...

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接&#xff1a;http://118.25.110.213:5200/#/login 账号/密码&#xff1a;renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…...

Python爬虫(入门+进阶)

简介 围绕 Python 爬虫展开&#xff0c;包括四个章节。第一章从 Python 爬虫入门&#xff0c;涵盖爬虫概念、Requests 爬取、Xpath 解析、数据保存及入库等知识&#xff0c;并结合知乎、豆瓣、淘宝等案例讲解浏览器抓包及 Selenium 爬取动态网页。第二章介绍 Scrapy 框架&…...

保姆级教程Docker部署RabbitMQ镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行RabbitMQ容器 4、Compose运行RabbitMQ容器 5、开启界面插件 6、查看RabbitMQ运行状态 7、常见问题处理 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考&#xff1a;Ubuntu上安装 Docker及可视化管理…...

【RAII | 设计模式】C++智能指针,内存管理与设计模式

前言 nav2系列教材&#xff0c;yolov11部署,系统迁移教程我会放到年后一起更新&#xff0c;最近年末手头事情多&#xff0c;还请大家多多谅解。 上一节我们讲述了C移动语义相关的知识&#xff0c;本期我们来看看C中常用的几种智能指针&#xff0c;并看看他们在设计模式中的运…...

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…...

c++---------数据类型

基本数据类型 整数类型&#xff08;Integral Types&#xff09; int&#xff08;整型&#xff09; 这是最常用的整数类型&#xff0c;通常用于存储一般范围的整数值。在32位系统中&#xff0c;int类型一般占用4个字节&#xff0c;取值范围大约是 - 2147483648到2147483647。例如…...

前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的应用结构与模块化设计 在上一篇博文中&#xff0c;我们深入探讨了Flask框架&#xff0c;…...

鸿蒙系统文件管理基础服务的设计背景和设计目标

有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉&#xff0c;但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚&#xff0c;本文旨在分享文件管理服务的设计背景及目标&#xff0c;方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...

要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量

要查询 user 表中 we_chat_open_id 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_open_id IS NOT NULL AND we_chat_open_id ! ;解释&#xff1a; SELECT COUNT(*): 表示要计算符合条件的行数。FROM us…...

AI科研助手开发总结:向量与数据权限的应用(二)

一、前言 继上篇文章&#xff1a;AI科研助手开发总结&#xff1a;向量与数据权限的应用&#xff08;一&#xff09; 本章根据向量库内存储数据及权限&#xff0c;向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…...

python爬虫----爬取视频实战

python爬虫-爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…...

别再手动画码了!C#搭配ZXing.Net库,5分钟搞定商品标签一维码与会员卡二维码生成

企业级条码生成实战&#xff1a;用C#和ZXing.Net实现高效标签与会员卡管理 在仓储物流和会员管理的数字化浪潮中&#xff0c;条码技术早已从简单的商品标识进化为企业数据流转的核心枢纽。想象一下这样的场景&#xff1a;当仓库管理系统(WMS)收到订单时&#xff0c;系统自动生成…...

5种认知减负策略:2025年macOS效率工具深度测评与工作流优化指南

5种认知减负策略&#xff1a;2025年macOS效率工具深度测评与工作流优化指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 在数字化工作环境中&#xff0c;macOS菜单栏作为系统与用户交互的核心界面…...

PCB圆弧拐角和45度拐角走线实操

目录 0 前言 1 PCB圆弧拐角实操 1.2参数设置,如上图所示 1.3筛选导线,如上图所示 1.4选中所有走线,如上图所示(按shift键框选) 1.5 45拐角变为圆弧拐角,如上图所示 1.6 优化前后对比图,如上图所示 2 PCB 45度拐角走线实操 2.1 进入设置,如上图所示 2.2 参数设…...

手把手教你用Python的basemap标注旅行足迹(含常见安装问题解决)

用Python绘制个性化旅行地图&#xff1a;从安装到创意标记全指南 每次翻开相册&#xff0c;那些泛黄的机票和模糊的景点门票总让我想起走过的路。但有没有更科技感的方式记录旅行足迹&#xff1f;今天我们就用Python的basemap工具&#xff0c;把你的旅行故事变成一幅交互式世界…...

**发散创新:基于CUDA的GPU加速图像卷积运算实战详解**在现代计算机视觉与深度学习领域,**图像处理

发散创新&#xff1a;基于CUDA的GPU加速图像卷积运算实战详解 在现代计算机视觉与深度学习领域&#xff0c;图像处理任务的性能瓶颈往往集中在CPU端计算效率不足。尤其是在大规模图像数据集上进行卷积操作时&#xff0c;传统串行算法难以满足实时性需求。本文将深入探讨如何利用…...

基于Docker和Jellyfin打造全能家庭媒体中心(支持电影、音乐、电子书一站式管理)

1. 为什么选择DockerJellyfin方案 最近两年我测试过市面上几乎所有主流媒体服务器方案&#xff0c;最终发现DockerJellyfin的组合最能满足家庭多媒体需求。先说几个真实痛点&#xff1a;以前用Plex时电子书管理需要额外安装Calibre-web&#xff0c;Emby的电子书插件经常崩溃&am…...

DASD-4B-Thinking法律咨询效果展示:条款分析与案例参考

DASD-4B-Thinking法律咨询效果展示&#xff1a;条款分析与案例参考 1. 引言 在日常法律咨询中&#xff0c;很多人遇到合同条款看不懂、法律概念不理解的情况&#xff0c;但又不想每次都花钱请律师。DASD-4B-Thinking模型在这方面展现出了令人惊喜的能力&#xff0c;它不仅能清…...

Seata 1.6.1 + Nacos配置避坑指南:Windows环境从安装到整合SpringBoot的完整链路

Seata 1.6.1与Nacos深度整合实战&#xff1a;Windows环境下的全链路配置精要 当微服务架构遇上分布式事务&#xff0c;Seata无疑是Java开发者手中的瑞士军刀。但在Windows环境下&#xff0c;从零搭建Seata服务端到与SpringBoot应用无缝集成&#xff0c;这条路上布满的配置陷阱足…...

保姆级教程:用Docker Compose和Nginx给内网Nexus仓库上HTTPS(自签证书避坑指南)

内网Nexus私有仓库HTTPS全栈实战&#xff1a;从Docker部署到证书信任闭环 当开发团队规模超过10人时&#xff0c;私有制品仓库就成了刚需。上周帮某金融客户部署内网Nexus时&#xff0c;发现Maven 3.8.1强制HTTPS的策略让很多工程师措手不及——内网没有公网域名&#xff0c;Le…...

从单人到派对:Nucleus Co-op如何让你的电脑变身多人游戏主机

从单人到派对&#xff1a;Nucleus Co-op如何让你的电脑变身多人游戏主机 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirro…...