深入解析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. 引言 对象是面向对象编程的核心概念之一,它们封装了数据和行为,构成了应用程序的基本构建块。然而,在Java语言中,每当使用new关键字或其他方式创建一个新对象时,背后发生了什么?这个问题的答案隐藏在JV…...
使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:人工智能教程 文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime …...
ffmpeg之显示一个yuv照片
显示YUV图片的步骤 1.初始化SDL库 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。操作:调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 2.创建窗口用于显示YUV图像: 目的:创建一个…...
MySQL中Performance Schema库的详解(下)
昨天说了关于SQL语句相关的,今天来说说性能相关的,如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...
【Rust自学】7.1. Package、Crate和定义Module
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.1.1. Rust的代码组织 代码组织主要包括: 那些细节可以对外暴露,而哪些细节是私有的在作用域内哪些名称有效… …...
【Git】-- 版本说明
Alpha:是内部测试版,一般不向外部发布,会有很多 Bug .一般只有测试人员使用。Beta:也是测试版,这个阶段的版本会一直加入新的功能。在 Alpha 版之后推出。RC:(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台…...
1919C. Grouping Increases
问题描述 序列 X X X,划分成两个字序列 A , B A,B A,B,其中惩罚是 A , B A,B A,B之中, 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…...
Pion WebRTC 项目教程
Pion WebRTC 项目教程 webrtc Pure Go implementation of the WebRTC API [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/webrtc 1. 项目目录结构及介绍 Pion WebRTC 项目的目录结构如下: pion/webrtc ├── api ├── examples ├── inter…...
【安全编码】Web平台如何设计防止重放攻击
我们先来做一道关于防重放的题,答案在文末 防止重放攻击最有效的方法是( )。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准,或者…...
VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
网址连接:http://118.25.110.213:5200/#/login 账号/密码: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 爬虫展开,包括四个章节。第一章从 Python 爬虫入门,涵盖爬虫概念、Requests 爬取、Xpath 解析、数据保存及入库等知识,并结合知乎、豆瓣、淘宝等案例讲解浏览器抓包及 Selenium 爬取动态网页。第二章介绍 Scrapy 框架&…...
保姆级教程Docker部署RabbitMQ镜像
目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行RabbitMQ容器 4、Compose运行RabbitMQ容器 5、开启界面插件 6、查看RabbitMQ运行状态 7、常见问题处理 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…...
【RAII | 设计模式】C++智能指针,内存管理与设计模式
前言 nav2系列教材,yolov11部署,系统迁移教程我会放到年后一起更新,最近年末手头事情多,还请大家多多谅解。 上一节我们讲述了C移动语义相关的知识,本期我们来看看C中常用的几种智能指针,并看看他们在设计模式中的运…...
Linux复习3——管理文件系统2
修改文件权限命令 chmod 功能: chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示,没有授予的部分就表示…...
c++---------数据类型
基本数据类型 整数类型(Integral Types) int(整型) 这是最常用的整数类型,通常用于存储一般范围的整数值。在32位系统中,int类型一般占用4个字节,取值范围大约是 - 2147483648到2147483647。例如…...
前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计 在上一篇博文中,我们深入探讨了Flask框架,…...
鸿蒙系统文件管理基础服务的设计背景和设计目标
有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉,但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚,本文旨在分享文件管理服务的设计背景及目标,方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...
要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量
要查询 user 表中 we_chat_open_id 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_open_id IS NOT NULL AND we_chat_open_id ! ;解释: SELECT COUNT(*): 表示要计算符合条件的行数。FROM us…...
AI科研助手开发总结:向量与数据权限的应用(二)
一、前言 继上篇文章:AI科研助手开发总结:向量与数据权限的应用(一) 本章根据向量库内存储数据及权限,向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…...
python爬虫----爬取视频实战
python爬虫-爬取视频 本次爬取,还是运用的是requests方法 首先进入此网站中,选取你想要爬取的视频,进入视频页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要…...
DAMOYOLO-S模型Android端集成实战:移动端实时检测应用开发
DAMOYOLO-S模型Android端集成实战:移动端实时检测应用开发 如果你是一名Android开发者,想在自己的App里加入实时物体检测功能,比如识别摄像头里的猫猫狗狗、车辆行人,但又担心模型太大、速度太慢,那今天这个实战项目就…...
Notion增强器:如何用岛屿组件系统彻底改变你的工作空间体验
Notion增强器:如何用岛屿组件系统彻底改变你的工作空间体验 【免费下载链接】notion-enhancer An enhancer/customiser for the all-in-one productivity workspace Notion 项目地址: https://gitcode.com/gh_mirrors/no/notion-enhancer 你是否曾经觉得Noti…...
Cursor Free VIP技术解析:突破AI编程助手限制的实现方案
Cursor Free VIP技术解析:突破AI编程助手限制的实现方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your t…...
OpenClaw安全防护指南:千问3.5-27B本地化部署的权限管控策略
OpenClaw安全防护指南:千问3.5-27B本地化部署的权限管控策略 1. 为什么需要特别关注OpenClaw的安全防护? 去年冬天,我在自己的MacBook上部署OpenClaw时,曾因为一个简单的配置疏忽差点酿成大祸。当时我只是想让AI助手帮我整理桌面…...
零基础玩转Qwen3-TTS:手把手教你搭建个人语音工作室
零基础玩转Qwen3-TTS:手把手教你搭建个人语音工作室 1. 为什么选择Qwen3-TTS搭建语音工作室 语音合成技术已经从实验室走向大众生活,但大多数工具要么操作复杂,要么效果不尽如人意。Qwen3-TTS-12Hz-1.7B-Base的出现改变了这一局面ÿ…...
OpenCore Legacy Patcher:让旧Mac重获新生的完整方案
OpenCore Legacy Patcher:让旧Mac重获新生的完整方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当您的Mac被官方系统更新拒之门外时…...
Altium Designer 22 实战:用这个隐藏技巧,为DIP插件焊盘穿上‘防烫服’
Altium Designer 22实战:用丝印层为DIP焊盘打造双重防护 手工焊接DIP插件时,烙铁温度过高或操作不当导致绿油层损坏,进而引发短路问题,是硬件工程师经常遇到的痛点。特别是在生产线上,工人为了效率往往将烙铁温度调至最…...
提升SARscape 5.6处理效率:详解General Parameters与OpenCL加速设置(含笔记本独显启用技巧)
SARscape 5.6性能调优实战:从参数配置到硬件加速的完整指南 当处理Sentinel-1时序数据时,你是否经历过漫长的等待?面对TB级SAR数据,合理的参数配置和硬件加速能带来惊人的效率提升。本文将深入解析那些被大多数用户忽略的性能优化…...
自动化规划工具提升工单分配效率
自动化规划工具使工单分配更高效 “分支定界”方法可排除混合整数非线性规划问题中的非最优解。 作者:Anupam Purwar 2023年3月28日 阅读时长:4分钟自动化规划工具是结合人工智能与设计算法的程序,用于规划与调度任务、资源和活动。它们广泛应…...
复古游戏新玩法:OpenClaw+Qwen3-14B实现经典游戏自动化
复古游戏新玩法:OpenClawQwen3-14B实现经典游戏自动化 1. 当AI遇见复古游戏:一场技术人的浪漫实验 去年整理旧物时,我在抽屉深处翻出一张《金庸群侠传》的光盘。这款1996年发布的经典游戏,承载着无数80后的青春记忆。当我试图在…...
