26

JVM&GC-通用术语

 3 years ago
source link: http://likeyou.cool/2020/07/19/jvm-gc-tong-yong-zhu-yu/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

G1是一个并行回收器,他把内存分割为很多不相关的区间(Region),每个区间可以属于老年代或者年轻代,并且每个年代区间可以是物理上不连续的。垃圾回收时都是需要停下应用程序,不然没有办法防止应用程序的干扰,然后G1 GC可以集中精力在垃圾最多的区间上,并且只费一点点时间就可以清空这些区间里的垃圾,腾出完全空闲的区间。由于这种方式的侧重点在于处理垃圾最多的区间,所以我们给G1取一个名字:垃圾优先(Garbage First).

G1内部主要有四个操作阶段:

  • 年轻代回收(A Young Collection)
  • 运行在后台的并行循环(A Background Concurrent Cycle)
  • 混合回收(A Mixed Collection)
  • 全量回收(Full GC)

java对象头

在HotSpot虚拟机中,对象在内存中的布局可以分为:对象头,实例数据,对齐填充三部分。

对象头:只要包括对象自身的运行行元数据,比如哈希码,GC分代年龄,锁状态标志,同事还包含一个类型指针,指向类元数据,表明该对象所属的类型。

实例数据:对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)。

对齐填充:他不是必要存在的,仅仅起着占位符的作用。

HotSpot

和其他虚拟机一样,Hotspot虚拟机为字节码提供一个运行时环境。

Hotspot主要负责以下三件事情:

  • 执行方法所请求的指令和运算。
  • 定位、加载和验证新的类型(即加载类)。
  • 管理应用内存,包括堆栈方法区等。

枚举根节点

可作为GC Roots的节点主要是在全局性的引用(例如常量或静态类属性)与执行上下文(例如栈帧中的本地变量表)中。

堆内存快照(java Heap Dump)

Java Heap是分配给实例类和数组对象运行的数据区,所有Java线程在运行期间共享Heap中的数据。Java Heap Dump相当于java应用在运行的时候在某个时间点上打了个快照(SnapShot)。

根集合

简单的讲就是栈里面的对象引用和堆内存里面的对象的集合。从这些对象开始就可以一级一级的追踪到所有存活的对象。

永久区(PermGen Space)

PermGen Space的全称是PermGen Generation Space 是指内存中永久保存的区域。这一部分用于存放Class和Meta的信息,Class在被加载的时候被放入PermGen Space区域。GC不会在主程序运行期间对PermGen Space进行清理。

Jdk8 Hotspot VM 开始使用本地化的内存空间来存放类的元数据,这个空间叫做元空间(Metaspace)。也就是说JDK8完成了对永久区的移除。

Stop the World

Stop the World简称STW,指的是GC事件发生过程中停止所有的应用程序线程的执行。

为了让垃圾回收器可以正常且高效的执行,大部分情况下会要求系统进入一个停顿的状态。只有这样,系统中才不会有新的垃圾产生,同时停顿保证了系统状态在某一个瞬间的一致性,也有益于垃圾回收器更好的标记垃圾对象。

元空间(Metaspace)

Jdk8 Hotspot VM 开始使用本地化的内存空间来存放类的元数据,这个空间叫做元空间(Metaspace)。默认情况下,大部分类元数据都在本地内存中分配,类元数据只受可用的本地内存限制(容量取决于是32位或是64位操作系统的可用虚拟机内存大小)。

混合GC事件(Mixed GC Event)

在这个事件内部,所有的年轻代Region和一部分老年代Region一起被回收。混合GC事件是跟在Minor GC之后的,并且混合GC只有在存活对象元数据存在的情况下才会触发。

Region

G1收集器将堆进行分区,划分为一个个区域,每次收集的时候,值收集其中几个区域,以此来控制垃圾回收产生的停顿时间。这个区域就是Region。G1通过将内存空间分成区域的方式避免了内存碎片问题。

Top-at-mark-start

每个区间记录这两个TAMS指针( Top-at-mark-start),分别为prevTAMS和nextTAMS,在TAMS以上的对象是新分配的,因而被视为隐式标记。

Evacuation Failure

可以理解为提升失败(Promotion Failure)。这个异常通常发生在对象提升时发现内存空间不足。对于这个异常,一般的做法是立即扩展堆内存,但是堆内存总有一个最大值,所以GC会让一些已经拷贝成功的引用进入老年代。而对于G1 GC拷贝不成功的对象会被立即放入老年代。

Root Region Scan

这个阶段从根区间的扫描开始,标记所有可达的存活对象,由于在并行标记的执行过程中移动数据会造成应用程序暂停,所以根区间扫描这个阶段需要在下一次评估中断开始执行直到结束。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK