对象的一生

【JVM调优实战】05-对象的一生 本文是《JVM调优实战》专栏第 5 讲。在 Java 程序员眼中,只是一行代码;但在 JVM 眼中,这行代码背后是一套精密的协作流程:类加载检查、内存分配、零值初始化、对象头设置、构造方法执行。对象创建出来后,它在内存中长什么样?我们通过引用访问对象时,JVM 又是如何找到它的?这些问题看似底层,却和性能调优息息相关。比如,一个Long对象到底占多少字节?为什么 64 位 JVM 默认开启指针压缩?为什么用句柄访问比直接指针慢,却仍有场景在用?本章我们就来完整拆解"对象的一生"。 阅读详情
  1. 对象诞生
    1. 加载
      1. 加载时机
        1. 使用new关键字实例化对象
        2. 使用reflect方法对类型进行反射调用时候
        3. 处理静态字段,静态方法
        4. 含main主类会加载
        5. MethodHandle解析结果为get/put/invoke/ newInvoke special四种类型方法句柄
        6. 接口加入默认方法,实现主类初始化,接口需要先进行初始化
        7. 子类初始化,父类需要先初始化
      2. 加载过程
        1. 加载
        2. 验证
        3. 准备
        4. 解析
        5. 初始化
    2. 分配内存
      1. 根据不同的算法收集器决定使用不同的内存分配方式
        1.1 如果使用Serial,ParNew等压缩整理过程的收集器,系统采用的分配算法是指针碰撞
        1.2 如果使用的是CMS(标记清楚算法),使用空闲列表分配内存
      2. 保证并发情况下的线程安全
        2.1 CAS配上失败重试的方法保证更新操作的原子性
        2.2 把内存分配的动作按照线程分化在不同的空间进行,即每个线程在Java堆中预先分配内存
    3. 初始化零值

      保证了对象的实例字段在Java代码中可以不赋值就可以直接使用

    4. 必要设置
      1. 对类进行必要设置
        1.1 属于哪个类的实例
        1.2 如何才能找到类的元数据信息
        1.3 对象的hash码
        1.4 对象的GC分代年龄信息
        1.5 是否使用偏向锁等
    5. 构造函数
  2. 对象消亡
    1. 判断对象死亡
      1. 判断死亡方式
        1. 引用计数器法

          1. 在对象添加一个引用计数器,每当一个地方引用它时,计数器加1;当引用失效时,计数器减一;不在被引用时,对象计数器为零。
          2. 虽然占用很多内存,但是效率较高,很难解决循环引用问题
        2. 可达性分析法

          1. 可以作为GCroot对象
          1. 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法对栈中引用的参数,局部变量,临时变量
          2. 在方法区中类静态变量引用的对象,譬如java类的引用类型静态变量
          3. 在方法区中常量引用的对象,譬如字符串常量池中的引用
          4. 在本地方法栈中JNI(Native)引用的对象
          5. Java虚拟机内部的引用,如基本类型对应的Class方法,一些常驻的异常对象,还有系统加载器
          6. 被同步锁持有的对象
          7. 反应Java虚拟机内部情况JMXBean,JVMTI注册的回调,本地代码缓存
      2. 死亡过程
      1. 对象不可达不一定非死不可,但最多会被标记两次
      2. 如果对象在进行可达性分析的时候,发现没有GC Roots相连的引用链,将会被第一次标记
      3. 判断是否需要执行finalize()方法,假如对象没有覆盖finalize()方法,后者方法已经被调用,都是没有必要执行
      4. 如果有必要执行,需要放入一个F-Queue的队列中,然后有一个低优先级的线程区执行finalize方法
    2. 垃圾回收算法
      1. 标记清除算法
      2. 标记复制算法
      3. 标记整理算法
    3. 垃圾处理器
      1. 标记整理
        1. Serial Old
        2. Paralled Old
      2. 标记清除算法
        1. CMS
      3. 标记复制算法
        1. Parallel Scavenge
        2. ParallelNew
        3. Serial
        4. G1
STM32基于软件模拟IIC进行AHT21B温湿度采集 通过学习软件IIC来进行实操AHT21B采集温湿度。 阅读详情

相关推荐

NSIDC海冰运动产品-速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

入门级NSIDC海冰运动产品速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

Mluoo的博客 2959

一个对象的一生

我是一个普通的 Java 对象,我出生在 Eden 区,在 Eden 区我还看到和我长的很像的小兄弟,我们在 Eden 区中玩了挺长时间。 有一天,Eden 区中的人实在是太多了,我就被迫去了 Survivor 区的 “From” 区。 自从去了 Survivor 区,我就开始飘了,有时候在 Survivor 的 “From ” 区,有时候在Survivor的 “To” 区,居无定所。直到我1...

学无止境 2445

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 268

OC对象的一生

前言 在面向对象编程中,我们每天都在创建对象,用对象描述着整个世界,然而对象是如何从孕育到销毁的呢? 目录 1.孕育对象 2.对象的出生 3.对象的成长 4.对象的销毁 5.总结 一.孕育对象 每天开发我们都在alloc对象,而alloc方法做了些什么呢? + (id)alloc { return _objc_rootAlloc(self); } 所有对象all...

gcs的博客 839

瑞数6.5逆向实战:手把手教你用RPC搞定cookie sign加密(附环境补全技巧)

本文深入解析瑞数6.5逆向实战,重点探讨如何结合环境补全与RPC调用技术来应对其动态加密机制。文章详细介绍了环境指纹采集、双重验证等核心防护原理,并提供了基于Puppeteer的RPC实现方案,手把手教你搞定cookie sign加密,附有实用的环境补全技巧与完整代码示例。

weixin_29315091的博客 1273

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。

Modeler_xiaoyu的博客 1万+

java一个对象的一生

一个对象的一生:我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上...

weixin_42541254的博客 165

使用Qt Creator调用eBUS SDK

在新界面,勾选左下角“ Show unreachable Network Devices",可以看到没有成功连接的网络相机,原因是IP地址配置错误。每个版本的OpenCV的依赖项的名字都不同,我这里是opencv_world490.lib与opencv_world490d.lib。函数,可以看到在这里是图像缓存区,能够对捕获的图像进行一些操作。在Visual Studio打开项目属性,在VC++目录这里,把Opencv的路径添加进去。这时,会自动跳转到mainwindow.cpp,生成该按钮对应的槽函数。

qq_35685051的博客 1289

从成员初始化列表开始,彻底理解 C++ 对象的一生

本文系统阐述了C++成员初始化列表(Member Initializer List)的核心价值与演变历程。从最初构造函数内赋值的性能问题出发,到处理const/引用成员的必要性,再到指针成员引发的拷贝构造、赋值运算符和析构函数问题,最终引出RAII(资源获取即初始化)思想。成员初始化列表不仅是性能优化手段,更是理解C++对象生命周期的关键:它决定了对象的"出生方式"(减少构造/赋值),与拷贝构造(复制对象)、拷贝赋值(覆盖对象)、析构函数(对象销毁)共同构成了完整的对象生命周期管理体系。

Mark Wu 的博客 675

深度学习入门:一文详解BP神经网络

在BP神经网络中,输入层和输出层的节点个数都是确定的,而隐含层节点个数不确定,那么应该设置为多少。实际上,隐含层节点个数的多少对神经网络的性能是有影响的,有一个经验公式可以确定隐含层。上面是对隐含层和输出层之间的权值和输出层的阀值计算调整量,而针对输入层和隐含层和隐含层的阀值调。在BP神经网络中,输入层节点没有阀值。神经网络,神经网络在机器学习中应用比较广泛,比如函数逼近,模式识别,分类,数据压缩,数据。要求输入模式要有足够的随机性,对输入模式的噪声比较敏感,即对于剧烈变化的输入模式,训。

Machine Learning with Tutors 4万+

LLC谐振变换器软启动,不只是“慢启动”,还是“智能启动”

LLC谐振变换器的软启动,不只是“慢慢来”,而是要在控制时序、限流、响应速度之间精妙权衡。而数字控制,特别是用查表法或混合信号法,为实现真正的“最佳轨迹”提供了可能。✨小Tips:如果你的系统成本敏感,选择查表法准没错;如果你的设计目标是超高速响应,那就上混合信号的高配方案!

weixin_43199439的博客 691

Runtime之对象的一生

在所有的面向对象语言中,万物皆对象。Objective-C也不例外,这篇文章我们从Runtime的源码去分析一个对象从创建到销毁的整个过程中都做了哪些操作,同时也加深我们对内存管理的理解。 对象的创建 我们平时开发中创建一个对象的方式一般有三种 alloc init NSString *str = [[NSString alloc] init]; new NSString *str = [NSString new]; 类方法构建 NSMutableString *.

weixin_43180925的博客 371

Ubuntu开机进入initramfs,解决办法来了!

摘要:Ubuntu系统启动时卡在initramfs界面,表明系统无法正常挂载根文件系统。常见原因包括引导配置错误、文件系统损坏、驱动程序问题和硬件故障。解决方法包括:1)使用fsck修复文件系统;2)通过dmesg排查驱动问题;3)检查硬盘等硬件状态;4)重新安装GRUB引导程序。建议做好系统备份等预防措施,遇到问题时按步骤排查。该问题通常可通过文件系统修复或引导配置重建解决。(148字)

米可的博客! 3421

程序员“对象”的一生

码个蛋(codeegg) 第 928次推文作者:轩辕之风链接:https://mp.weixin.qq.com/s/xp2S4_3UQTZ0TOIlVqM8uw对象的诞生“你醒啦!”,...

陈宇明 286

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

6. 对象秘密的一生

6. 对象秘密的一生

小羊的 Blog 840

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

对象的一生(上)

本文追踪了 Java 对象的“一生”:从类加载、堆内存分配、对象实例化,到类元信息在方法区的变迁,再到引用体系的落地

m0_68524280的博客 527

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

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

对象的一生(下)

对象的一生跨越了方法区堆栈这三个核心区域。

m0_68524280的博客 247

一个Java Class 对象的一生

一 JavaClass文件 java的class文件是java文件通过javac编译之后得到的jvm可执行的文件,以.class结尾的文件。 二 Java Class 对象的生命周期

清风扶柳 170

一篇JVM文章,让你读懂对象的一生

如果一个类加载器收到了加载类的请求,首先不会自己尝试去加载这个类,而是向上请求父类加载器去完成,每一个加载器都是如此工作,一直到最顶层的启动类加载器。从启动类加载器开始,只有当父类无法加载这个请求的,便会将请求发送到子类,子类尝试加载。启动类加载器:加载 JDK 中 lib 目录中 Java 的核心类库,即$JAVA_HOME/lib目录。扩展类加载器。加载 lib/ext 目录下的类。应用程序类加载器:加载我们写的应用程序。自定义类加载器:根据自己的需求定制类加载器。

qq_53223625的博客 714

一次线上故障之Java对象的"一生"简单总结

“对象”的一生像往常一样,早上10点到了公司,赵小八打开电脑收到了PM前一天晚上发来的推荐系统新需求,内心一万只草泥马飘过,思索了半天,打开IDEA开始了“愉快的”new对象之旅。垃圾回收...

weixin_44742132的博客 101

和你的对象走完这一生~

第三节 各位小伙伴大家好,还记得上一章我们讲了什么吗?虚拟机中的堆,他是整个内存模型中占用最大的一部分,而且不是连续的。当有需要分配内存的时候,一般有两个方法分配,指针碰撞和空闲列表。该部分的内存回收是由虚拟机的垃圾收集器进行管理的。 刚刚粗略的回忆了上一章所讲的内容,而这一章我们的重点还在堆上面。之间有简单的提到过新生代和老年代,今天就给大...

abcdef00001111234的博客 197

面向对象:希望找一个聊得来,相处自然舒服的人,走完这一生~

各位男生如果看到合适的女生,但自己 “下不了手”,请可劲地介绍给你还单着的亲朋好友 ^_^小帖士1)单身男生和女生都有机会加入面向对象,点击 “阅读原文” 可以开始试...

程序员的那些事 677

二、一切皆对象:论对象的一生一世

一切皆对象 在面向对象程序设计中,所有的行为、数据等都需要基于对象,Java中一切都被视为对象,因此在操纵对象上可以采用单一固定的语法。 在《对象导论:从面向过程到面向对象的转变》那篇文章中,我们知道,对象即为服务提供者、数据的载体。现在我们类比现实世界中的对象,来看看一个对象应该具有哪些属性。 首先,我们需要给对象取名字(引用),再则,有的对象长得一样有的则完全不一样,我们需要对他们进行归类(数...

Alan-zzx的博客 392

Java 对象的一生:从 new 到回收的 7 个关键节点

(新手友好版 + 源码深挖版,按需食用)关键词:对象创建、TLAB、逃逸分析、GC、指针压缩、源码阅读时长:10 min源码版本:OpenJDK 17适合:1~5 年 Java 开发、面试突击、零基础也能看懂前半部分。

持续输出Java相关知识 454

面向对象:希望能遇到可以相伴一生的人

各位男生如果看到合适的女生,但自己 “下不了手”,请可劲地介绍给你还单着的亲朋好友 ^_^ 小帖士 1)单身男生和女生都有机会加入面向对象,点击 “阅读原文” 可以开始试...

程序员的那些事 943
上一篇: MYSQL架构
下一篇: 工作经验分享-vivo链路监控
陌逸_逺
博客等级 码龄9年 13粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值