ZGC是一种Java虚拟机的垃圾回收器,也是Java SE 11版本中的一项新增功能。它的目标是提供在任何规模的内存上都可以最大程度地缩短垃圾收集的暂停时间,并在延长的暂停时间下限内最大化应用程序的吞吐量。
ZGC能够在小型堆内存配置下运行(例如几百MB)和超大堆内存配置下运行(例如几TB)。对于Java应用程序来说,这是一种非常强大的特性,因为它可以缩短暂停时间,并且不会影响应用程序的吞吐量。
使用ZGC非常简单。如果您正在运行Java 11或更高版本,请在Java命令行上设置以下参数即可启用ZGC:
-XX:+UseZGC
ZGC除了可以缩短暂停时间,还有不少其它好处,例如:
1.全停顿时间短:ZGC的GC暂停时间与堆大小无关,为数毫秒左右。这意味着应用程序可以使用超大堆大小并仍保持响应性能。
2.回收时没有停靠线程:ZGC在运行时不需要停靠应用程序线程。这是一种非常重要的能力,因为它有助于推动应用程序可用性和性能。
3.默认内存地址分配高效:ZGC使用了一种新的内存地址分配算法,称为TLAB,它可以作为默认内存地址分配器在ZGC和其它收集器之间进行切换。TLAB会根据应用程序规模的不同而自动调整大小,提高了内存利用率并且在多线程应用程序中提高了并发性能。
除了上述好处外,ZGC还有以下优点:
1.可切换性:与其它Collectors配合使用
2.可观察性:提供了许多基于事件的GC通知
3.许多重要的GC(例如清除压缩)在ZGC中并不适用
4.可扩展性:基于Linux cgroup技术,支持Linux内核线程控制
现在我们来看看ZGC是如何帮助一个真实的Java应用程序提高性能的。
在线电子商务业务是需要在大型Java应用程序中支持高性能,高可用性的代表。让我们看看在早期没有使用ZGC时,一个常见的电子商品应用程序的垃圾收集统计数据。
1.应用程序中GC暂停的平均时间为7秒。
2.最长的一次GC暂停达到28秒。
3.堆大小为4096MB。
4.应用程序总共创建了超过301万个对象。其中大约有1.2万个对象的生命周期超过了5秒。
5.在峰值负载期间,应用程序的吞吐量下降了百分之30左右。
这些数据告诉我们一个事实,那就是一个大型Java应用程序的GC性能会极大地影响应用程序的吞吐量和响应性能。
现在,让我们使用ZGC启动同样的应用程序,并且使用VisualVM分析一下表现差异。
1.该应用程序中GC暂停的平均时间为36毫秒。
2.最长的一次GC暂停仅为90毫秒。
3.堆大小为16GB。
4.应用程序总共创建了超过147万个对象。其中大约有2.2万个对象的生命周期超过了5秒。
5.在峰值负载期间,应用程序的吞吐量下降不到百分之3。
这些数据告诉我们,使用ZGC,应用程序的GC性能得到了极大的改善,并且在峰值负载期间仍然可以保持高吞吐量。这确实是一个非常强大的功能,因为它允许大型Java应用程序在面对高负载时保持高性能,并且不会影响应用程序的用户体验。
在大型Java应用程序运行时,垃圾收集性能尤为重要。使用ZGC可以帮助您缩短GC的暂停时间,从而提高应用程序的性能和用户体验,确保您的应用程序在大规模负载下保持高性能。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复