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