ZGC深入学习
ZGC简介
本次调研目标选取的是jdk11(long-term support)下首次亮相的zgc。
zgc介绍简单翻译了zgc main page:ZGC简介
另外参考hotspot garbage collector team介绍zgc用的ppt:https://archive.fosdem.org/2018/schedule/event/zgc/attachments/slides/2211/export/events/attachments/zgc/slides/2211/ZGC_FOSDEM_2018.pdf
ZGC关键字
- region base:区别于G1,zgc支持动态决定region大小,region size schema:small(2m)、medium(32m)、large(2*n m)
- load barrier and color pointer:是zgc在回收的大部分步骤都能并发的原因 (跟其他垃圾回收器的store barrier有点区别,待深入)
- 10ms:STW只遍历GC root,因此不会随着heap变大而变慢,这也是为什么STW能维持在10ms以内的原因
- 64位指针:使用64位指针未使用的bit位来记录元数据,因此不支持指针压缩,不支持32位平台。目前,42位用于存储对象地址,4位存gc过程元数据,18位未开发
ZGC gc策略及回收过程相关参数(详细见:ZGC gc策略及回收过程-源码分析):
-XX:ZCollectionInterval
固定时间间隔进行gc,默认值为0。
-XX:ZAllocationSpikeTolerance
内存分配速率预估的一个修正因子,默认值为2。一般不需要更改
-XX:ZProactive
是否启用主动回收策略,默认值为true。一般建议开启
其他参数分析
本文仅对ZGC相关的参数进行分析,jdk相关参数不在本次研究范围
1、激活ZGC: -XX:UseZGC
2、配置并发线程数:-XX:ConcGCThreads=<number>
并发线程数,并发线程数太多会导致占用太多cpu时间分片,太少会导致回收速度跟不上垃圾生产速度。如果系统追求的是低时延,尽量不要让系统超负荷工作,cpu使用率尽量控制在70%以下
3、返还未使用的内存给OS:-XX:ZUncommit
这里指的是设置了xms和xmx且xmx>xms的情况,zgc默认会返回未使用的内存给操作系统,对于内存水位是重要指标的系统,返回未使用内存可以更好的观察内存使用情况。但如果要禁用这个功能,可以使用:-XX:-ZUncommit 。但无论使用哪种策略,jvm不会uncommit unsed memery导致堆大小小于xms。这也意味着如果配置xms=xmx,该特性会被隐式禁用
4、启用Large Pages:-XX:+UseLargePages -XX:ZPath
Large Pages在Linux称为Huge Pages,配置zgc使用Huge Pages可以获得更好的性能(吞吐量、延迟、启动时间),并且基本没有缺点,除了配置稍微复杂一点。配置Huge Pages大小,需要注意JVM除了堆以外其他需要使用到的内存也得算进去,一般配合ZPath使用。配置方法可以见:ZGC简介里的Enbling Large Page
5、启用NUMA Support:-XX:UseNUMA
zgc默认开启NUMA支持,意味着在分配堆内存时,会尽量使用NUMA-local的内存(比跨die访问快3倍)。但当jvm发现程序使用的只是cpu的一个子集(限定使用),则会自动禁用该特性。一般不需要关注这个特性
6、启用Transparent Huge Page(THP)
一般不建议在对延时敏感的系统下使用,THP一个使管理Huge Pages自动化的抽象层。
7、Relocate时,会根据当前region是否碎片化已大于ZFragmentationLimit,是则回收region,relocate至current candidate relocation set。
-XX:ZFragmentationLimit,默认值25
8、设置打印ZStat统计数据(cpu、内存等log)的间隔 -XX:ZStatisticsInterval
ZGC的不足
目前zgc还是被标记为实验性质的,说明还不够成熟,vm参数范围不断在调整。实验性质就是说ZGC在一些大内存的场景中表现了良好的性能,同时也说明ZGC还有一些不足,主要有:
- ZGC仅实现了单代内存管理,也就是说没有考虑热点数据与冷数据,这个在商业的C4已经支持。据说Auzl实现的分代内存管理器比没有分代的内存管理器效率高10倍(并没有找到相关的资料文献),也就是说ZGC还有巨大的进步空间;
- C2的支持还不够完善;
- 不支持Graal, HDSB等功能。
Deprecated
1.Deprecated in jdk12
-XX:ZConcurrentStringTable
-XX:ZConcurrentVMWeakHandles
-XX:ZMarkStacksMax
-XX:ZWeakRoots
-XX:ZOptimizeLoadBarriers
-XX:ZStallOnOutOfMemory
-XX:ZSymbolTableUnloading
2.Deprecated in jdk13
-XX:ZUnmapBadViews
其他
-XX:ZMarkStackSpaceLimit(jdk12才有的参数):Maximum number of bytes allocated for mark stacks
-XX:ZUncommit(jdk13才有的参数):Uncommit unused memory
-XX:ZUncommitDelay (jdk13才有的参数):Uncommit memory if it has been unused for the specified amount of time (in seconds)
资料与工具
jdk jvm参数查询工具:https://chriswhocodes.com
jdk11 源码:https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_src.zip
ZGC与G1一样都是region-base的垃圾回收器,G1 Paper: https://www.researchgate.net/publication/221032945_Garbage-First_garbage_collection
ZGC的实现参考了C4算法,Azul C4 Paper:https://www.azul.com/files/c4_paper_acm1.pdf
ZGC相关的书:《ZGC的设计与实现》
ZGC简介:https://wiki.openjdk.java.net/display/zgc/Main
R大博客:https://www.iteye.com/blog/rednaxelafx-362738
jvm调优参考了江南白衣的博客:http://calvin1978.blogcn.com/articles/jvmoption-7.html
其他参考资料:
什么是NUMA架构:http://cenalulu.github.io/linux/numa/
huge pages:https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html
linux memery commit: http://linuxperf.com/?p=102
Memery Barrier:https://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.html
什么是JEP、JSR、JLS:https://stackoverflow.com/questions/51282326/what-is-the-difference-or-relation-between-jls-jsr-and-jep
ZGC深入学习的更多相关文章
- Caffe学习系列(16):caffemodel可视化
通过前面的学习,我们已经能够正常训练各种数据了.设置好solver.prototxt后,我们可以把训练好的模型保存起来,如lenet_iter_10000.caffemodel. 训练多少次就自动保存 ...
- Git学习笔记-完全版
注意本文参考廖雪博客: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 一:Git ...
- JDK15正式发布,划时代的ZGC同时宣布转正
你发任你发,我用Java8.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...
- JVM学习笔记(一):JVM初探
1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第一章 本文是第一章的一些笔记整理. 2 Java里程碑 2.1 Java起源 1990年Sun公司决定开发一 ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
随机推荐
- 通过Service访问应用 (2)
目录 通过NodePort Service在外部访问集群应用 通过LoadBalancer Service在外部访问集群应用 Microsoft SQL Server数据库部署 为了便于理解和学习,请 ...
- .Net基础篇_学习笔记_第六天_类型转换和方法(函数)简介
类型转换:Convert.ToInt32(); int.Parse(); int.TryParse(); Convert.ToInt32(); 的本质就是在使用 int.Parse(); int. ...
- JAVA集合框架包含的内容
Java集合框架提供了一套性能优良.使用方便的接口和类,他们位于java.util包中. Collection接口 主要有List.Set等实现类,Map接口主要有HashMap.TreeMap等实现 ...
- 小斌之SpringCloud 开发某某交易所
最近一个月都在弄某某交易所,让之前学的东西能够用上,在这里分享一下收货的东西吧 #### 简介 系统是进行了二次开发,用的是ZTuo开源框架第一个版本,节省了很多时间(坑也挺多,哈哈哈),文章结尾贴源 ...
- VUE从入门到放弃(项目全流程)————VUE
VUE从入门到放弃(第一天)--整体流程 先想想一个项目,vue项目是从什么到什么,然后再什么的?那是什么呢? 搭建 ( vue-cli) 代码内容 运行 封装 成品 一.搭建(脚手架vue-cli) ...
- NIO入门-----01
package com.sico.pck01_nio; import java.nio.ByteBuffer; import org.junit.Test; /** * @author Sico ...
- .netCore+Vue 搭建的简捷开发框架
话不多说,上图: 整体项目结构如图所示,我的设计初衷是基于.netCore + DI + Vue 打造一个适合初学者的简捷开发框架. 架构模型采用基于RESTful API风格的前后台分离框架,总体分 ...
- Spring——面向切面编程(AOP)详解
声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...
- 【Java】SpringBoot 中从application.yml中获取自定义常量
由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...
- java数据结构——单链表、双端链表、双向链表(Linked List)
1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...