当前位置: 首页 > 编程日记 > 正文

Jdk11,Jdk12的低延迟垃圾收集器ZGC

https://wiki.openjdk.java.net/display/zgc/Main

Z垃圾收集器,也称为ZGC,是一种可扩展的低延迟垃圾收集器,旨在实现以下目标:

  • 暂停时间超过10毫秒
  • 暂停时间不会随堆或实时设置大小增加
  • 处理堆范围从几百M几T字节大小

一目了然,ZGC是:

  • 同时
  • 基于区域的
  • 压实
  • NUMA感知
  • 使用彩色指针
  • 使用负载障碍

ZGC的核心是并发垃圾收集器,这意味着所有繁重的工作都在Java线程继续执行时完成。这极大地限制了垃圾收集对应用程序响应时间的影响。

这个OpenJDK项目由HotSpot Group赞助。

JDK 11

  • ZGC的初始版本
  • 不支持类卸载(使用-XX:+ ClassUnloading没有效果)

JDK 12

  • 进一步暂停时间缩短
  • 增加了对类卸载的支持

JVM选项

启用ZGC

使用-XX:+UnlockExperimentalVMOptions -XX:+UseZGC选项启用ZGC。

设置堆大小

ZGC最重要的调整选项是设置最大堆大小(-Xmx<size>)。由于ZGC是并发收集器,因此必须选择最大堆大小,以便:1)堆可以容纳应用程序的实时集,以及2)堆中有足够的空间允许在GC处理时分配服务运行。需要多少空间取决于应用程序的分配率和实时设置大小。一般来说,你给ZGC的内存越多越好。但与此同时,浪费内存是不可取的,因此所有关于在内存使用和GC运行频率之间找到平衡点。

设置并发GC线程

可能要查看的第二个调优选项是设置并发GC线程数(-XX:ConcGCThreads=<number>)。ZGC具有自动选择此编号的启发式方法。这种启发式方法通常运行良好,但根据应用程序的特性,可能需要进行调整。此选项基本上决定了应该给出多少CPU时间。给它太多,GC将从应用程序中窃取过多的CPU时间。给它太少,应用程序可能比GC可以更快地分配垃圾。

注意!通常,如果低延迟(即低应用程序响应时间)对您的应用程序很重要,那么永远不要过度配置您的系统。理想情况下,您的系统的CPU利用率绝不应超过70%。

启用大页面

配置ZGC以使用大页面通常会产生更好的性能(在吞吐量,延迟和启动时间方面)并且没有真正的缺点,除了设置稍微复杂一点。设置过程通常需要root权限,这就是默认情况下未启用的原因。

大页面在Linux / x86上也称为“大页面”,大小为2MB。

假设你想要一个16G的Java堆。这意味着您需要16G / 2M = 8192个大页面。

首先将至少16G(8192页)的内存分配给大页面池。“至少”部分很重要,因为在JVM中启用大页面意味着不仅GC会尝试将这些用于Java堆,而且JVM的其他部分也会尝试将它们用于各种内部数据结构(代码堆,标记位图等)。在此示例中,我们将保留9216页(18G)以允许2G的非Java堆分配使用大页面。

启用透明大页面

使用显式大页面(如上所述)的替代方法是使用透明的大页面。对于延迟敏感的应用程序,通常建议使用透明的大页面,因为它往往会导致不必要的延迟峰值。但是,可能值得尝试查看您的工作负载是否/如何受其影响。但请注意,您的里程可能会有所不同。

请注意,使用启用了透明大页面的ZGC需要Linux内核> = 4.7

启用NUMA支持

ZGC具有基本的NUMA支持,这意味着它将尽力将Java堆分配引导到NUMA本地内存。默认情况下启用此功能。但是,如果JVM检测到它绑定到系统中CPU的子集,它将自动禁用。通常,您不必担心此设置,但如果要显式覆盖JVM的决策,则可以使用-XX:+UseNUMA-XX:-UseNUMA选项来执行此操作。

在NUMA计算机(例如多插槽x86计算机)上运行时,启用NUMA支持通常会显着提升性能。

https://www.boost.org/doc/libs/1_69_0/libs/fiber/doc/html/fiber/numa.html

NUMA

现代微处理器包含通过通道连接到存储器的集成存储器控制器。访问存储器可以分为两种:
统一存储器访问(UMA)和非统一存储器访问(NUMA)。

与UMA相比,UMA提供了一个集中的内存池(因此在一定数量的处理器之后无法扩展),NUMA架构将内存划分为相对于微处理器的本地和远程内存。
本地内存直接连接到处理器的集成内存控制器。连接到另一个微处理器(多插槽系统)的内存控制器的内存被视为远程内存。如果内存控制器访问远程内存,则必须遍历互连[8]并连接到远程内存控制器。
因此,访问远程内存会增加本地内存访问的额外延迟开销。由于存储位置不同,NUMA系统经验丰富非统一 内存访问时间。
因此,通过保持内存访问本地来实现最佳性能。

ZGC:低延迟的垃圾回收器

并行化处理阶段

  • 标记(Marking);
  • 重定位(Relocation)/压缩(Compaction);
  • 重新分配集的选择(Relocation set selection);
  • 引用处理(Reference processing);
  • 弱引用的清理(WeakRefs Cleaning);
  • 字符串常量池(String Table)和符号表(Symbol Table)的清理;
  • 类卸载(Class unloading)。

ZGC 垃圾回收过程

ZGC 的垃圾回收算法和传统的 Stop-The-World 式的垃圾回收算法不太一样,后者的标记阶段和内存压缩阶段会使得应用线程挂起。ZGC 和 C4(Continuously Concurrent Compacting Collector))算法比较类似。

一次完整的 ZGC 回收周期分为以下几个阶段(Phase):

  1. Pause Mark Start:标记根对象;
  2. Concurrent Mark:并发标记阶段;
  3. Concurrent Relocate:并发重定位;

    • 活动对象被移动到了一个新的 Heap Region B-region 中,之前旧对象所在的 Heap Region A-region 即可复用;如果 B-region 中对象之间的引用关系将会在这一阶段被更新;
    • 在重定位过程中,新旧对象的映射关系(同一对象在不同 Region 中的映射关系)被记录在了 Forwarding Tables 中。
  4. Pause Mark Start:这个阶段实际上已经进入了新的 ZGC Cycle,同样也是标记根对象;

  5. Concurrent Remap:并发重映射。 这个阶段除了标记根对象直接引用的对象外,还会根据上个 ZGC Cycle 中生成的 Forwarding Tables 更新跨 Heap Region 的引用;
  6. Concurrent Relocate……

从上面的垃圾回收过程可以看到,正是因为 ZGC 回收过程中各个 Phase 的并发性,才使得 GC Pause 不受垃圾回收周期内堆上活动数据数量和需要跟踪与更新的引用数量的影响,将暂停时间保持在较低的水平。

ZGC 的垃圾回收各阶段也不都是并发执行的,在 Pause Mark Start 阶段进行根对象扫描(Root Scanning)时会出现短暂的暂停。

ZGC 在内存整理和引用更新上采取了不同的策略,给垃圾回收过程带来了巨大的性能提升。内存整理和引用更新都是并发的,也是交替进行的(其他的垃圾回收算法在更新引用时需要所有的线程到达 safe-point )。但与此同时,我们也应该看到,并发带来的 GC 吞吐率的下降也是不可忽视的。

当响应时间比吞吐量占有更高的优先级时,ZGC 是个不错的选择。而对那些不能接受长时间暂停的应用程序来说,ZGC 是个理想的选择。而对于那些只是在后台进行密集计算的应用程序,G1 或者 Parallel 垃圾回收器可能具有更好的垃圾回收性能。

ZGC 的介绍 PPT:

The Z Garbage Collector: Low Latency GC for OpenJDK。

相关文章:

Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...

《Android项目驱动式开发教程》第一章开发入门1.4 项目框架分析 4 android:versionName"1.0" > 5 8 第9行代码android:icon用来声明整个APP的图标&#xff0c;图片一般都放在drawable文件夹下&#xff0c;使用资源引用的方式。 第10行代码android:label用来声明整…

getLocationInWindow getLocationOnScreen getLeft , getTop, getBottom,getRight

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 最近做项目时&#xff0c;发现在activity的onCreate()和onResume()方法里调用View.getLocationInWindow() 时&#xff0c;View.getLocationInWindow()返回空值&#xff0c;觉得很奇怪&#xff0c;因…

使用reflector对.NET反编译

reflector的下载地址&#xff1a;https://www.cr173.com/soft/355285.html 反编译后的结果&#xff1a; 转载于:https://www.cnblogs.com/ZaraNet/p/9848355.html

协程和Java实现

多线程的性能问题&#xff1a; 1.同步锁。 2.线程阻塞状态和可运行状态之间的切换。 3.线程上下文的切换。 协程&#xff0c;英文Coroutines&#xff0c;是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样&#xff0c;一个线程也可以拥有多个协程。 协程&a…

LoadRunner 技巧之 手动关联与预关联

上一节介绍了关联的原理与自动关联&#xff0c;除了自动关联还有另外两种关联方式&#xff1a;手动关联与 预关联。 手动关联 如果脚本很长&#xff0c;那么我们想找到一…

android app文档,android App项目需求描述文档.docx

本app是给外卖配送员用的&#xff0c;系统后台根据一定的逻辑生成或者建立运单&#xff0c;本App读到后台的运单讲外卖送到定外卖的手中本文档所需详细资料请到/s/1jGGgtLG下载与后台交互的地方不用实现&#xff0c;有数据显示的自己把交互函数写好 返回的测试数据写在交互函数…

如何利用微信小游戏的分包加载机制突破4M代码包体积限制

相信大家度过了一个不错的端午假期&#xff0c;在端午前夕&#xff0c;即6月15日晚上&#xff0c;微信小游戏宣布支持分包加载功能&#xff0c;白鹭引擎在端午节后第一天正式支持分包加载机制。在正式向开发者介绍如何使用前&#xff0c;我先为各位解读一下我对微信提供这个 AP…

一个会画图的工程师

发现小谢图画的很好&#xff0c;虽然有些也是他引用的&#xff0c;但是我觉得还是很好所以这里收集下。 【RocketMQ源码学习】2-Namesrv 3-Remoting模块 rocketmq-remoting 模块是 RocketMQ 中负责网络通信的模块&#xff0c;被其他所有需要网络通信的模块依赖。它是基于 Net…

2016百度实习编程题:括号序列

不知如何解决 1.感觉贪心或者动态规划&#xff0c;不知道如何解决 2.做过生成合法括号序列的题目&#xff0c;想到用DFS补成合法的括号&#xff0c;然而没有成功

html动画怎么隐藏,JQuery操作div隐藏和显示的4种动画

Jquery-Div动画显示body{font-family:"宋体";font-size:13px;color:#415973;}#ShowDiv{display:none;width:300px;height:100px;border:1px solid #ccc;border-right:2px solid #888;border-bottom:2px solid #888;background-color:#f9f9f9;text-align:center;paddi…

@芥末的糖----------《后端加密》

bcryptsession 生命周期 session 标识产生的时机和清除时机:&#xff08;权限验证&#xff09; 用户已经登录&#xff1a;这个唯一标识会在用户登录时产生&#xff0c;用户点击退出时或者关闭浏览器时清除。 …

Java中的ClassLoader和SPI机制

深入探讨 Java 类加载器 成富是著名的Java专家&#xff0c;在IBM技术网站发表很多Java好文&#xff0c;也有著作。 线程上下文类加载器 线程上下文类加载器&#xff08;context class loader&#xff09;是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextCl…

html在线缓存视频,javascript – 如何为HTML视频添加缓冲

给你的视频提供ID&#xff1a;用于缓冲&#xff1a;var vid document.getElementById("myVideoOne");alert("Start: " vid.buffered.start(0) " End: " vid.buffered.end(0));var vid document.getElementById("myVideoTwo");aler…

ComponentName(String pkg, String cls)

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/51279606 开发中因为改项目包名&#xff0c;用了全局替换&#xff0c;误操作把改构造函数的第二个参数只写了类名&#xff0c;不是完整的全路径…

mysql干货——数据库字符集和校对规则详解

2019独角兽企业重金招聘Python工程师标准>>> 一、什么是字符集 字符是多个文字和符号的总称&#xff0c;包括各个国家的文字、标点符号、图形符号、数字等。字符集多个字符的集合。 字符集合种类较多&#xff0c;每个字符集包含的字符的个数不同。对于字符集不支持的…

android监听器在哪里创建,[转载]android开发中创建按钮事件监听器的几种方法

第一种&#xff1a;匿名内部类作为事件监听器类Button button(Button)findViewById(R.id.button);button.setOnClickListener(newOnClickListener(){public void onClick(View v){System.out.println(“匿名内部类作为事件监听类”);}});大部分时候&#xff0c;事件处理器都没有…

Go语言源码分析CAS的实现和Java如出一辙

看了Go的源码CAS这块实现和java还是类似的。 关于Java的分析参考&#xff1a;Java使用字节码和汇编语言同步分析volatile&#xff0c;synchronized的底层实现 都是使用汇编指令&#xff1a;LOCKCMPXCHGL 原因很简单&#xff1a;单核肯定不能发挥Go的高并发性能&#xff0c;G…

python 的文件读写方法:read readline readlines wirte writelines

read()方法读入整个文件&#xff0c;把整个文件以字符串形式返回。readline() 方法每次只读一行&#xff0c;每运行一次只读一行。如果要读整个文件&#xff0c;需要结合循环判断文件结束。python判断文件末尾的标志是&#xff0c;读到空字符。比如&#xff1a;while str ! :r…

c# 模板方法模式

为什么80%的码农都做不了架构师&#xff1f;>>> 既然是模板肯定定义了相同的东西板式&#xff0c;提供了空白的地方自己添加进去就可以了 模板方法是把相同的部分抽象出来到抽象类中去定义&#xff0c;具体子类来实现具体的不同部分&#xff0c;这个思路也正式模板…

transient HashMap使用目的分析

看HashSet源码有这么一句&#xff1a; private transient HashMap<E,Object> map; 再看HashSet的Add方法&#xff1a; 实际上HashSet是复用HashMap了。 而我们去看看HashMap也会发现一样使用了transient 而不管是HashSet还是HashMapdou都要求是Serializable的&#xff…

4月29日监理师课程作业

软考信息系统监理师&#xff1a;2016年4月29日作业一、信息应用系统分析设计阶段监理1、需求分析的进入条件是什么&#xff1f;&#xff08;记&#xff09;答&#xff1a;①业主单位与承建单位正式签订建设合同&#xff0c;②并对初步的项目开发计划达成一致意见。2、需求分析的…

沉浸式导航栏html,混合开发 h5+ 沉浸式的适配

1.需要在mainfest.json plus对象里添加"statusbar": {"immersed": "true","style":"dark"}2.新建immersed.js注意 在里边不适用plus,因为plus.ready之后再js改变样式 必然造成页面闪烁跳动(function(w){document.addEventLi…

puppet yum模块、配置仓储、mount模块

转载&#xff1a;http://blog.51cto.com/ywzhou/1577335 作用&#xff1a;自动为客户端配置YUM源&#xff0c;为使用yum安装软件包提供便捷。 1、服务端配置yum模块 &#xff08;1&#xff09;模块清单 [rootpuppet ~]# tree /etc/puppet/modules/yum/ /etc/puppet/modules/yum…

最新技术选型解决方案列表

最新技术选型解决方案列表 1 概述 这是一份当前的技术选型方案&#xff0c;针对创业、中小型公司 2 目标2.1 产品目标2.1.1 SaaS 2.1.1.1 免安装 2.1.1.2 多租户 2.1.1.3 流量计费 2.1.2 可配置 2.1.2.1 需开通服务 2.1.2.2 服务自动组合 2.1…

合工大的计算机专业好不好,合肥工业大学计算机好,还是西电的好?差距有多大?...

合肥工业大学计算机好&#xff0c;还是西电的好?差距有多大?这两个大学都是教育部直属的工科院校&#xff0c;但是性质完全不一样&#xff0c;到底谁更厉害&#xff0c;结论是西电的计算机要比合肥工业大学强。首先因为西电本身就是比哈工大厉害的大学&#xff0c;学科评估方…

DataWorks V2使用PyUdf

在DataWorks上新建一个Python资源&#xff0c;命名为 test_udf.py 编辑pyudf的脚本代码&#xff0c;实现方法请参考Python实现MaxCompute UDF # -*- coding:utf-8 -*- from odps.udf import annotate #函数签名&#xff0c;SQL执行前所有函数的参数类型和返回值类型必须确定&a…

Java线程怎样映射到操作系统线程

先说多线程模型&#xff0c;参考经典教材《Operating System Concepts , Silberschatz ,9th edition》 中文版是《操作系统概念&#xff0c;第9版》 https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html 一个线程是CPU利用率的基本单元&#xff0c;包…

NSUserDefaults的用法

2019独角兽企业重金招聘Python工程师标准>>> NSDictionary* defaults [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; NSLog("Defaults: %", defaults); 是用来获取设备上的所有的NSUserDefaults的设置。 上面代码输出了 2013-06…

计算机在轻工行业中的应用,计算机在不同领域中的具体应用

计算机以其卓越的性能和强大的生命力&#xff0c;在科学技术、国民经济、社会生活等各个方面得到了广泛的应用&#xff0c;并且取得了明显的社会效益和经济效益。计算机的应用几乎包括人类生活的一切领域&#xff0c;可以说是包罗万象&#xff0c;不胜枚举。据统计&#xff0c;…

自动驾驶L3量产追梦:如何跨过车规级和低成本门槛?

雷锋网新智驾按&#xff1a;从人类设想到落地前行&#xff0c;智能驾驶领域在2018年声响不断。在频繁的融资、技术创新和商业应用等信息背后&#xff0c;无数车企在公司战略中加入“网联化”、“自动化”&#xff0c;前几年涌现的自动驾驶领域的初创公司&#xff0c;近年来也开…