JVM虚拟机系列1---中对象的存储,以及判断对象已死的2种方法

Dos命令下输入java–X 可以查看所有的可以配置的jvm参数

Hotspot虚拟机内存中的对象布局:对象在内存中的存储布局可以分为三个区域1、对象头(Header)2、实例数据(InstanceData)和对齐填充(Padding)。

1、Hotspot虚拟机的对象头包括2部分:

1、存储对象运行时数据

如:哈希码(Hashcode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分在32位和64为虚拟机中分别占32bit和64bit,官方称之为“MarkWord”。由于对象头存储的数据往往超过限制,所以MarkWord被设计成一个特定的数据结构,以便于在极小的空间存储更多的信息,会根据对象的状态复用自己的存储空间。

2、存储类型指针

即对象指向它的类元数据的指针,虚拟机可以通过它来判断这个对象是哪个类的实例。

2、实例数据

其中存储的是对象的真正需要存储的信息,也是代码中所定义的各种类型的字段内容。

3、对齐填充

其实在虚拟机并不是必须的。仅仅起着占位符的作用

 

垃圾回收集(GarbageCollection GC)

GC的三个问题:

§ 哪些内存需要回收

§ 什么时候回收

§ 如何回收

针对哪些对象需要回收,可以当做就是有哪些对象已经死亡:

1、引用计数法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器的值就减1;任何时刻计数器为0的对象就不能再被使用。大多数情况下可以使用引用计数法,但是引用计数最大的问题是无法解决对象之间的循环引用的问题。示例:对象A中有一个引用指向对象B,同时对象B中有一个引用指向对象A,这样对象A和对象B之间就会循环引用。

2、可达性分析算法

目前主流的商用程序语言都是通过可达性分析来判断兑现是否已经死亡。算法的基本思想:通过一系列的“GCroots”的对象作为起始点,从这些起始点往下搜索,走过的路径称为引用链(ReferenceChain),当一个对象到GCRoots没有任何引用链时,证明此对象是不可用的。

Java语言中,可以作为GCRoots的对象包括以下几种:

§ 虚拟机栈(栈帧中的本地变量表)中引用的对象

§ 方法区中类静态属性引用的对象

§ 方法区中常量引用的对象

§ 本地方法栈中JNI(即一般说的native方法)引用的对象

还有一些问题就是,无法理解为什么选取这些对象,还有就是可达性分析是如何处理循环引用的?期待后续可以解决

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值