JVM G1源码分析和调优
上QQ阅读APP看书,第一时间看更新

1.2 本书常见术语

JVM系统非常复杂,市面上有很多中英文书籍从不同的角度来介绍JVM,其中都用到了很多术语,但是大家对某些术语的解释并不完全相同。为了便于读者的理解,在这里统一定义和解释本书使用的一些术语。这些术语有些是我们约定俗成的叫法,有些是JVM里面的特别约定,还有一些是G1算法引入的。为了保持准确性,这里仅仅解释这些术语的含义,后续会进一步解释相关内容,本书将尽量使用这里定义的术语。

·并行(parallelism),指两个或者多个事件在同一时刻发生,在现代计算机中通常指多台处理器上同时处理多个任务。

·并发(concurrency),指两个或多个事件在同一时间间隔内发生,在现代计算机中一台处理器“同时”处理多个任务,那么这些任务只能交替运行,从处理器的角度上看任务只能串行执行,从用户的角度看这些任务“并行”执行,实际上是处理器根据一定的策略不断地切换执行这些“并行”的任务。

在JVM中,我们也常看到并行和并发。比如,典型的ParNew一般称为并行收集器,CMS一般称为并发标记清除(Concurrent Mark Sweep)。这看起来很奇怪,因为并行和并发是从处理器角度出发,但是这里明显不是,实际上并行和并发在JVM被重新定义了。

JVM中的并行,指多个垃圾回收相关线程在操作系统之上并发运行,这里的并行强调的是只有垃圾回收线程工作,Java应用程序都暂停执行,因此ParNew工作的时候一定发生了STW。本书提到的***ParTask(例如G1ParTask)指的就是在这些任务运行的时候应用程序都必须暂停。

JVM中的并发,指垃圾回收相关的线程并发运行(如果启动多个线程),同时这些线程会和Java应用程序并发运行。本书提到的***Concurrent***Thread(例如ConcurrentG1RefineThread)就是指这些线程和Java应用程序同时运行。

·Stop-the-world(STW),直译就是停止一切,在JVM中指停止一切Java应用线程。

·安全点(Safepoint),指JVM在执行一些操作的时需要STW,但并不是任何线程在任何地方都能进入STW,例如我们正在执行一段代码时,线程如何能够停止?设计安全点的目的是,当线程进入到安全点时,线程就会主动停止。

·Mutator,在很多英文文献和JVM源码中,经常看到这个单词,它指的是我们的Java应用线程。Mutator的含义是可变的,在这里的含义是因为线程运行,导致了内存的变化。GC中通常需要STW才能使Mutator暂停。

·记忆集(Remember Set),简称为RSet。主要记录不同代际对象的引用关系。

·Refine,尚未有统一的翻译,有时翻译为细化,但是不太准确,本书中不做翻译。G1中的ConcurrentG1RefineThread主要指处理RSet的线程。

·Evacuation,转移、撤退或者回收,简称为Evac,本书中不做翻译。在G1中指的是发现活跃对象,并将对象复制到新地址的过程。

·回收(Reclaim),通常指的是分区对象已经死亡或者已经完成Evac,分区可以被JVM再次使用。

·Closure,闭包,本书中不做翻译。在JVM中是一种辅助类,类似于我们已知的iterator,它通常提供了对内存的访问。

·GC Root,垃圾回收的根。在JVM的垃圾回收过程中,需要从GC Root出发标记活跃对象,确保正在使用的对象在垃圾回收后都是存活的。

·根集合(Root Set)。在JVM的垃圾回收过程中,需要从不同的GC Root出发,这些GC Root有线程栈、monitor列表、JNI对象等,而这些GC Root就构成了Root Set。

·Full GC,简称为FGC,整个堆的垃圾回收动作。通常Full GC是串行的,G1的Full GC不仅有串行实现,在JDK10中还有并行实现。

·再标记(Remark)。在本书中指的是并发标记算法中,处理完并发标记后,需要更新并发标记中Mutator变更的引用,这一步需要STW。