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(七)对象模型相关推荐

  1. 【数据湖存储】数据湖的终极奥秘,无招胜有招

    作为海量数据存储与分析的重要承载方式的数据湖,从2011年概念诞生至今,已经发展了9个年头.而数据湖是什么?又能为数字化经济带来什么?<阿里云数据湖存储解决方案蓝皮书>将为您揭开数据湖的终 ...

  2. 无招胜有招——面向对象设计模式随笔,

    最近在学习面向对象设计模式,GOF的23种设计模式大概看了一遍,简单总结一下,设计模式主要分为三种模式,分别是创建模式,结构模式,行为模式. 回过头想一下具体有哪些模式,在什么情况下用什么设计模式,好 ...

  3. "无招胜有招"nbsp;史上最全的互…

    课前秀:三个段子 第一个段子:一个毫无餐饮行业经验的人开了一家餐馆,仅两个月时间,就实现了所在商场餐厅坪效第一名;VC投资6000万,估值4亿元人民币,这家餐厅是雕爷牛腩. 只有12道菜,花了500万 ...

  4. Dirty Approach之无招胜有招

    每个网站,几乎都有"新闻"的模块.在中国独有的ICP--Internet Copy and Past--模式下,多数站点也靠"转贴"手段汇集新闻信息.如果说新浪 ...

  5. Java进阶专题(七) 设计模式之委派模式与策略模式

    一.前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  6. 无招胜有招之Java进阶JVM(五)垃圾回收

    垃圾检测.回收算法 垃圾收集器一般必须完成两件事:检测出垃圾:回收垃圾.怎么检测出垃圾?一般有以下几种方法: 引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1:引用失效就减1. ...

  7. 无招胜有招之Java进阶JVM(九)HotSpot

    Java 版本1.8.0_121 Java SE 运行环境:也就是我们所说的jre. 至于hotspot:(两个字 讲究) #翻译的官方文档 Java HotSpot虚拟机是Java SE平台的核心组 ...

  8. 无招胜有招之Java进阶JVM(八)类加载机制

    6.1.ClassLoader的两个作用和一个任务 作用:1.将Class加载到JVM中2.审视每一个类应该由谁加载. 任务:将Class字节码重新解析成统一要求的对象格式 6.2上级委托接待机制又称 ...

  9. 无招胜有招之Java进阶JVM(四)内存模型plus

    一.计算机内存模型: 在多CPU的系统中,每个CPU都有多级缓存,一般分为L1.L2.L3缓存,因为这些缓存的存在,提供了数据的访问性能,也减轻了数据总线上数据传输的压力,同时也带来了很多新的挑战,比 ...

最新文章

  1. Michael I. Jordan——计算思维、推断思维与数据科学
  2. javascript去掉字符串左右的空格
  3. 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水
  4. python画图x轴丢值_python-从pyplot绘图中擦除先前绘制的内容
  5. inner join 与 left join 之间的区别
  6. Springboot自定义注解实现用户登录状态校验(一)
  7. 海量图片去重算法-局部分块Hash算法
  8. 指针变量使用规则实例
  9. Linux 脚本开机自启的几种方法
  10. Python编写:好友管理系统
  11. springboot+社区购物小程序 毕业设计-附源码291720
  12. 心电电路算法滤波_心电信号噪声的数字滤波研究
  13. java毕业设计选题基于JavaWeb项目实现的高校学生在线选课系统
  14. SWUST OJ 1012: 哈希表(链地址法处理冲突)
  15. shell wait 等待命令
  16. mos管的rc吸收电路计算_RCD吸收电路
  17. MySQL 8.0 执行 insert 插入数据非常缓慢的问题及解决方法
  18. 使用 Python 地图绘制工具 -- folium 全攻略
  19. 大创项目前传——爬虫阶段(1)
  20. 在线重装Win11系统详细教程

热门文章

  1. SDUT - Mountain Subsequences(dp)
  2. HDU多校6 - 6831 Fragrant numbers(dfs爆搜+打表)
  3. HDU - 4635 Strongly connected(强连通缩点+数学+思维)
  4. POJ - 1475 Pushing Boxes(bfs套bfs)
  5. 【Boost】boost库中thread多线程详解8——call_once仅运行一次
  6. Python Type Hints 从入门到实践
  7. 第17讲:aiohttp 异步爬虫实战
  8. 用Python实现队列
  9. MySQL数据库的内连接,左外连接和右外连接查询
  10. 注意System.currentTimeMillis()潜在的性能问题