无招胜有招之Java进阶JVM(七)对象模型
Java对象前言:
在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用。
Java对象包含三个部分:
一个Java对象可以分为三部分存储在内存中,分别是:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
1.对象头(包含锁状态标志,线程持有的锁等标志)
2.实例数据
3.对齐填充
对象头:对象头包括两部分信息分别是Mark World和元数据指针,Mark World用于存储对象运行时的数据,比如HashCode、锁状态标志、GC分代年龄等。而元数据指针用于指向方法区的中目标类的类型信息,通过元数据指针可以确定对象的具体类型。
实例数据:用于存储对象中的各种类型的字段信息(包括从父类继承来的)。
对齐填充:对齐填充不一定存在,起到了占位符的作用,没有特别的含义。
OOP-Klass:
HotSpot中采用了OOP-Klass模型,它是用来描述Java对象实例的一种模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。
【补充】
在Java中,对象的生命周期包括以下几个阶段:
1. 创建阶段(Created)
2. 应用阶段(In Use)
3. 不可见阶段(Invisible)
4. 不可达阶段(Unreachable)
5. 收集阶段(Collected)
6. 终结阶段(Finalized)
7. 对象空间重分配阶段(De-allocated)
1.创建阶段(Created)
在创建阶段系统通过下面的几个步骤来完成对象的创建过程
l 为对象分配存储空间
l 开始构造对象
l 从超类到子类对static成员进行初始化
l 超类成员变量按顺序初始化,递归调用超类的构造方法
l 子类成员变量按顺序初始化,子类构造方法调用
一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段
2.应用阶段(In Use)
对象至少被一个强引用持有着。
3.不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。
简单说就是程序的执行已经超出了该对象的作用域了。
举例如下图:本地变量count在25行时已经超出了其作用域,则在此时称之为count处于不可视阶段。当然这种情况编译器在编译的过程中会直接报错了。
图2. 不可见阶段示例
4.不可达阶段(Unreachable)
对象处于不可达阶段是指该对象不再被任何强引用所持有。
与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。
5.收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。
这里要特别说明一下:不要重载finazlie()方法!原因有两点:
l 会影响JVM的对象分配与回收速度
在分配该对象时,JVM需要在垃圾回收器上注册该对象,以便在回收时能够执行该重载方法;在该方法的执行时需要消耗CPU时间且在执行完该方法后才会重新执行回收操作,即至少需要垃圾回收器对该对象执行两次GC。
l 可能造成该对象的再次“复活”
在finalize()方法中,如果有其它的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又重新变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用后续的代码管理。
6.终结阶段
当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。
7.对象空间重新分配阶段
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段”。
摘自:https://blog.csdn.net/moneyshi/article/details/53033578
无招胜有招之Java进阶JVM(七)对象模型相关推荐
- 【数据湖存储】数据湖的终极奥秘,无招胜有招
作为海量数据存储与分析的重要承载方式的数据湖,从2011年概念诞生至今,已经发展了9个年头.而数据湖是什么?又能为数字化经济带来什么?<阿里云数据湖存储解决方案蓝皮书>将为您揭开数据湖的终 ...
- 无招胜有招——面向对象设计模式随笔,
最近在学习面向对象设计模式,GOF的23种设计模式大概看了一遍,简单总结一下,设计模式主要分为三种模式,分别是创建模式,结构模式,行为模式. 回过头想一下具体有哪些模式,在什么情况下用什么设计模式,好 ...
- "无招胜有招"nbsp;史上最全的互…
课前秀:三个段子 第一个段子:一个毫无餐饮行业经验的人开了一家餐馆,仅两个月时间,就实现了所在商场餐厅坪效第一名;VC投资6000万,估值4亿元人民币,这家餐厅是雕爷牛腩. 只有12道菜,花了500万 ...
- Dirty Approach之无招胜有招
每个网站,几乎都有"新闻"的模块.在中国独有的ICP--Internet Copy and Past--模式下,多数站点也靠"转贴"手段汇集新闻信息.如果说新浪 ...
- Java进阶专题(七) 设计模式之委派模式与策略模式
一.前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...
- 无招胜有招之Java进阶JVM(五)垃圾回收
垃圾检测.回收算法 垃圾收集器一般必须完成两件事:检测出垃圾:回收垃圾.怎么检测出垃圾?一般有以下几种方法: 引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1:引用失效就减1. ...
- 无招胜有招之Java进阶JVM(九)HotSpot
Java 版本1.8.0_121 Java SE 运行环境:也就是我们所说的jre. 至于hotspot:(两个字 讲究) #翻译的官方文档 Java HotSpot虚拟机是Java SE平台的核心组 ...
- 无招胜有招之Java进阶JVM(八)类加载机制
6.1.ClassLoader的两个作用和一个任务 作用:1.将Class加载到JVM中2.审视每一个类应该由谁加载. 任务:将Class字节码重新解析成统一要求的对象格式 6.2上级委托接待机制又称 ...
- 无招胜有招之Java进阶JVM(四)内存模型plus
一.计算机内存模型: 在多CPU的系统中,每个CPU都有多级缓存,一般分为L1.L2.L3缓存,因为这些缓存的存在,提供了数据的访问性能,也减轻了数据总线上数据传输的压力,同时也带来了很多新的挑战,比 ...
最新文章
- Michael I. Jordan——计算思维、推断思维与数据科学
- javascript去掉字符串左右的空格
- 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水
- python画图x轴丢值_python-从pyplot绘图中擦除先前绘制的内容
- inner join 与 left join 之间的区别
- Springboot自定义注解实现用户登录状态校验(一)
- 海量图片去重算法-局部分块Hash算法
- 指针变量使用规则实例
- Linux 脚本开机自启的几种方法
- Python编写:好友管理系统
- springboot+社区购物小程序 毕业设计-附源码291720
- 心电电路算法滤波_心电信号噪声的数字滤波研究
- java毕业设计选题基于JavaWeb项目实现的高校学生在线选课系统
- SWUST OJ 1012: 哈希表(链地址法处理冲突)
- shell wait 等待命令
- mos管的rc吸收电路计算_RCD吸收电路
- MySQL 8.0 执行 insert 插入数据非常缓慢的问题及解决方法
- 使用 Python 地图绘制工具 -- folium 全攻略
- 大创项目前传——爬虫阶段(1)
- 在线重装Win11系统详细教程
热门文章
- SDUT - Mountain Subsequences(dp)
- HDU多校6 - 6831 Fragrant numbers(dfs爆搜+打表)
- HDU - 4635 Strongly connected(强连通缩点+数学+思维)
- POJ - 1475 Pushing Boxes(bfs套bfs)
- 【Boost】boost库中thread多线程详解8——call_once仅运行一次
- Python Type Hints 从入门到实践
- 第17讲:aiohttp 异步爬虫实战
- 用Python实现队列
- MySQL数据库的内连接,左外连接和右外连接查询
- 注意System.currentTimeMillis()潜在的性能问题