经历了数千次改进,Java 的垃圾回收在吞吐量、延迟和内存大小方面有了巨大的进步。
1. 关于垃圾回收、度量和取舍
-
当应用程序请求分配内存时,GC 负责提供内存。提供内存的过程应尽可能快; -
GC 检测应用程序不再使用的内存。这个操作也应当十分高效,不应消耗太多时间。这种不再使用的内存称为“垃圾”; -
GC 将同一块内存再次提供给应用程序,最好是“实时”,也就是要快。
-
吞吐量指的是单位时间内能够完成的工作量。在此语境下,垃圾回收算法的优劣取决于能在单位时间内完成的回收工作量,这些算法可以让 Java 应用程序实现更高的吞吐量; -
延迟指的是单次操作所需时间。垃圾回收算法需要尽可能减小延迟。在垃圾回收的语境下,关键点就是垃圾回收期是否会导致暂停、暂停的范围,以及暂停的时长; -
在垃圾回收的语境下,内存大小指的是为了让垃圾回收期正常工作,需要在正常的应用程序堆内存之外,再额外占用多少内存。如果 GC(或更一般地,JVM)需要的内存很少,就可以给应用程序堆留出更多内存。
-
G1首先跟踪活跃对象,这一操作与Java应用程序并行进行。这样,从老年代回收内存的大量操作就不需要在垃圾回收暂停期间执行了,从而减小延迟。不过,实际的内存回收操作如果一次性完成的话,对于大型应用程序的堆而言,依然需要大量时间。 -
因此,G1会增量式地从老年代回收内存。在跟踪了活跃对象之后,在接下来的几次对青年代进行回收的同时,G1会额外对老年代中的一小部分进行压缩,这样长期即可达到对年长对象进行回收的效果。
-
maxjOPS 是系统能够提供的最大事务数量。这是吞吐量的度量指标; -
criticaljOPS 测量在几个特定的服务级别协议(SLA)下的吞吐量,比如从 10 毫秒到 100 毫秒的响应时间。