「字节跳动」厉害!代表Java未来的ZGC深度剖析


「字节跳动」厉害!代表Java未来的ZGC深度剖析
文章图片
「字节跳动」厉害!代表Java未来的ZGC深度剖析
文章图片
「字节跳动」厉害!代表Java未来的ZGC深度剖析
文章图片
「字节跳动」厉害!代表Java未来的ZGC深度剖析
文章图片
「字节跳动」厉害!代表Java未来的ZGC深度剖析
文章图片
「字节跳动」厉害!代表Java未来的ZGC深度剖析
文章图片
JAVA程序最爽的地方是它的GC机制 , 开发人员不需要关注内存申请和回收问题 。 同时 , JAVA程序最头疼的地方也是它的GC机制 , 因为掌握JVM和GC调优是一件非常困难的事情 。 在ParallelOldGC、CMS、G1之后 , JDK11带来的全新的「ZGC」为我们解决了什么问题?Oracle官方介绍它是一个Scalable、Low Latency的垃圾回收器 。 所以它的目的是「降低停顿时间」 , 由此会导致吞吐量会有所降低 。 吞吐量降低问题不大 , 横向扩展几台服务器就能解决问题了啦 。 在全面介绍ZGC介绍 , 先统计一下大家线上环境在用什么垃圾回收器:
ZGC目标
如下图所示 , ZGC的目标主要有4个:

  • 支持TB量级的堆 。 这你受得了吗?我们生产环境的硬盘还没有上TB呢 , 这应该可以满足未来十年内 , 所有JAVA应用的需求了吧 。
  • 最大GC停顿时间不超10ms 。 这你受得了吗?目前一般线上环境运行良好的JAVA应用Minor GC停顿时间在10ms左右 , Major GC一般都需要100ms以上(G1可以调节停顿时间 , 但是如果调的过低的话 , 反而会适得其反) , 之所以能做到这一点是因为它的停顿时间主要跟Root扫描有关 , 而Root数量和堆大小是没有任何关系的 。
  • 奠定未来GC特性的基础 。 牛逼 , 牛逼!
  • 最糟糕的情况下吞吐量会降低15% 。 这都不是事 , 停顿时间足够优秀 。 至于吞吐量 , 通过扩容分分钟解决 。
另外 , Oracle官方提到了它最大的优点是:它的停顿时间不会随着堆的增大而增长!也就是说 , 几十G堆的停顿时间是10ms以下 , 几百G甚至上T堆的停顿时间也是10ms以下 。
ZGC概述接下来从几个维度概述一下ZGC 。
  1. New GC
  2. Single Generation
  3. Region Based
  4. Partial Compaction
  5. NUMA-aware
  6. Colored Pointers
  7. Load Barriers
  8. ZGC tuning
  9. Change Log
New GCZGC是一个全新的垃圾回收器 , 它完全不同以往HotSpot的任何垃圾回收器 , 比如:PS、CMS、G1等 。 如果真要说它最像谁的话 , 那应该是Azul公司的商业化垃圾回收器:「C4」 , ZGC所采用的算法就是Azul Systems很多年前提出的Pauseless GC , 而实现上它介于早期Azul VM的Pauseless GC与后来Zing VM的C4之间 。 不过需要说明的是 , JDK11中ZGC只能运行在Linux64操作系统之上 。 JDK14新增支持了MacOS和Window平台:
如下图所示 , 是ZGC和Parallel以及G1的压测对比结果(CMS在JDK9中已经被标记deprecated , 更高版本中已经被彻底移除 , 所以不在对比范围内) 。 我们可以明显的看到 , 停顿时间方面 , ZGC是100%不超过10ms的 , 简直是秒天秒地般的存在:


推荐阅读