<
JVM摘抄第四节
>

没有上一篇咯
下一篇

JVM摘抄第三节

自动内存管理

对象内存分布与OOP-Klass模型

  1. 在HotSpot中对象实例化操作无非就是初始化对象头和实例数据。而存储对象实例信息内存布局也由这两部分组成。
    Sample Pic
  2. 先从对象头开始谈起,对象头主要用于存储MarkWord和元数据指针等数据。其中MarkWord主要用来存储对象运行时的数据信息,比如HashCodeGC分代年龄锁状态标识线程持有的锁偏向线程ID偏向时间戳等。而元数据指针则是用于指向方法区中目标类的类型信息,也就是说可以根据元数据指针来确定当前对象的具体目标类型。
  3. 除了对象头之外,内存布局的另一部分就是实例数据。实例数据具体用来存储定义在当前对象中的各种类型的字段信息(包括派生与超类的字段信息)
  4. OOP-Klass模型就是用于表示Java类以及对象实例的一种数据类型,其中OOP(Ordinary Object Pointer普通对象指针)用于描述对象的实例信息,而Klass用于描述对象实例的目标类型,也就是说,Klass实际上是一个与Java类对应的JVM中的内部对等体。我们也将其称为C++对等体。
  5. 在JVM中对象头就是用OOP对象instanceOopDesc来表示的(数组类型则用arrayOopDesc来表示),而对象头中的元数据指针指向的当前对象的目标类型则是由Klass对象的instanceKlass对象表示的(数组用arrayKlass表示)用于在JVM中表示一个类的对等体。
  6. JVM可以通过对象引用准确定位到Java堆区中的instanceOopDesc对象,这样可以成功访问到对象的实例信息,当需要访问目标对象的具体类型时,JVM会通过存储在instanceOopDesc中的元数据指针定位到存储在方法区的instanceKlass对象上。
    Sample Pic

GC的作用

1.GC的工作任务只要分为两大块,分别是内存的动态分配垃圾回收
2.目前所有的垃圾回收算法都是通过分代收集算法执行垃圾回收的。
3.垃圾回收不可避免的会产生一些内存碎片,因为被回收的内存空间极有可能是一些不连续的内存块,这将导致没有足够的连续可用的内存空间分配给新的较大的对象,不过可以使用压缩算法清除内存碎片。
4.评估一款GC的性能,要满足:
①吞吐量:程序运行的时间(程序的运行时间+内存回收时间)
②垃圾收集开销:吞吐量的补数,垃圾收集器所占时间与总时间的比例。
③暂停时间:执行垃圾收集时,程序的工作线程所被暂停的时间。
④收集频率:相对于程序的执行,垃圾手机操作发生的频率。
⑤堆空间:java堆区所占内存的大小。
⑥快速:一个对象从诞生到被回收的时间。

垃圾标记——根搜索算法

1.在GC进行垃圾回收之前,对对象存活或死亡的标记就叫做垃圾标记
2.目前有两种垃圾标记算法:引用计数算法根搜索算法
3.现在通常用根搜索算法,因为引用计数算法有一个较大的弊端:这种算法会为每个对象生成一个私有的引用计数器 如果有其他对象引用它时,计数器就会加1,不再引用则会减1,但也同时引发了一个问题:如果这些无用的对象互相引用 则计数器也不会为0,也同样不会被回收,这将导致大量的垃圾不会被回收。
4.跟搜索算法不仅包括了引用计数算法简单和执行高效的优点,也解决了其弊端。他通过以根对象集合为起始点,以从上到下的方式 搜索被根对象所连接的目标对象是否可达(使用根搜索算法后,内存中存货对象都会被根对象连接着),如果目标可达,则对象存活, 若不可达,则对象已死亡,便可以在instanceOopDesc的MarkWord中将其标记为垃圾对象。 Sample Pic 5.根对象那么重要,那么根对象的存储内容是什么呢?其包含:
①java栈中的对象引用
②本地方法栈中的对象引用
③运行时常量池中的对象引用
④方法区中类静态属性的对象引用
⑤与一个类对应的唯一数据类型的Class对象。

Top
Foot