ZGC
诞生原因
Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如
特性
-
ZGC(The Z Garbage Collector)为JDK11推出一款低延迟的垃圾回收器。STW即停顿时间低于1ms,且不会随着堆的大小增加而增加。
- 实现主要原理:全并发处理(仅对GC ROOTS进行遍历时会暂停)
-
高版本JDK16之后支持16TB级别的堆;
- 实现主要原理:Region分区管理、染色指针寻址
-
应用程序吞吐量最多减少15%。
-
为未来的GC新特性奠定基础。
- 实现主要原理:染色指针中未被使用预留的18 bits。
内存布局
ZGC采用堆空间分页模型的机制,堆空间分页模型也非常符合Linux Kernel2.6引入的标准大页(huge page)如4KB的处理方式。本质与G1一样,没有分代的概念,ZGC也采用基于Region的堆内存布局,不一样的是ZGC的Region具有动态性:动态创建销毁、动态容量大小。ZGC一共分为三种Region:
- 小型Region(小页面):容量固定为 2MB,存放小于256KB的对象。
- 中型Region(中页面):容量固定为 32MB,存放大于256KB小于4MB的对象。
- 大型Region(大页面):容量为 2*N MB,可以动态变化,每个大Region中只会存放一个大对象,并且不会被重分配(即后文介绍的对象的复制),因为大对象的复制代价高昂。
指针着色技术(Color Pointers)
- ZGC只支持64位的系统,也即是64位的指针。
- ZGC在JDK11的ZGC来分析中低42位即2的42次方来表示使用中的堆空间,也即是可管理的内存,而在JDK更高版本有所变化。
- ZGC借助几位高位来做GC相关的事情比如快速实现垃圾回收的并发标记、转移和重定位等。
- 预留用来给未来的GC新特性预留的扩展点
一段C程序mapping.c看下ZGC的64位虚拟地址空间的指针着色技术展示
编译执行,三个地址一样,也即是同一个实地址映射到3个虚地址。
整体流程
概述
主要分为两步
垃圾标记
- Remapped
- M0,发生两次GC为例,M0是1次GC。
- M1,发生两次GC为例,M0是2次GC。
- 本次垃圾回收中识别的活跃对象。
标记阶段,对象分配(Remapped)
标记结束后Remapped对象即为垃圾对象。而下次标记使用M1表示活跃。
ZGC转移
JVM调优概述
背景
-
生产环境中的问题
-
为什么要调优
- 防止出现 OOM
- 解决 OOM
- 减少 Full GC 出现的频率
-
调优场景
-
不同阶段的考虑
- 上线前
- 项目运行阶段
- 线上出现 OOM
调优概述
调优目标
JVM调优目标是使用较小的内存占用来获得较高的吞吐量或者较低的延迟,从这里也可以知道其重要指标有三个:
从上面我们也知道这三者如同分布式CAP理论一样不可完全兼得,对于一个Java程序同时保证内存占用小、延迟低、高吞吐量是不可能的;任何一个指标性能的提高,几乎都是以牺牲其他指标性能的损为代价的,不可兼得。程序的目标不同,调优时所考虑的方向也不同,因此需要结合实际场景,有明确的优化目标,找到性能瓶颈,对瓶颈有针对性的优化。
调优原则
- 90%也即是大多数的Java应用不需要进行JVM优化。
- 大多数导致GC问题的原因是代码层面的问题导致的(代码层面)。
- 上线之前,应先考虑将机器的JVM参数设置到最优。
- 减少创建对象的数量,减少使用全局变量和大对象(代码层面)。
- 优先架构调优和代码调优,JVM优化是不得已的手段。
- 分析GC情况优化代码比优化JVM参数更好。
调优步骤
性能评价/测试指标
- 停顿时间(或响应时间)
- 吞吐量
- 内存占用
- Java 堆区所占的内存大小
- 相互间的关系
- 以高速公路通行状况为例
- 吞吐量:每天通过高速公路收费站的车辆的数据
- 并发数:高速公路上正在行驶的车辆的数目
- 响应时间:车速
JVM监控及诊断命令行工具
无监控、不调优!命令行安装 jdk 的 bin 目录,这些工具用来获取目标 JVM 不同方面、不同层次的信息,帮助开发人员很好地解决 Java 应用程序的一些疑难杂症。
- 查看正在运行的Java进程:jps
- 查看JVM统计信息:jstat
- 实时查看和修改JVM配置参数:jinfo
- jinfo(Configuration Info for Java):查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数
- 基本使用语法为:jinfo [options] pid,比如jinfo -sysprops 进程id
- 导出内存映像文件&内存使用情况:jmap
- 获取 dump 文件(堆转储快照文件,二进制文件),它还可以获取目标 Java 进程的内存相关信息,包括 Java 堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
- 基本使用语法为:
- jmap [option]
- jmap [option] <executable
- jmap [option] [server_id@]
- jmap [option]
- 使用1:导出内存映像文件
- 手动的方式
- jmap -dump:format=b,file=<filename.hprof>
- jmap -dump:live,format=b,file=<filename.hprof>
- 使用2:显示堆内存相关信息
- jmap -heap 进程id
- jmap -histo 进程id
- 使用3:其他作用
- jmap -permstat 进程id
- 查看系统的ClassLoader信息
- jmap -finalizerinfo
- 查看堆积在finalizer队列中的对象
- JDK 自带堆分析工具:jhat
- jhat(JVM Heap Analysis Tool):Sun JDK 提供的 jhat 命令与 jmap 命令搭配使用,用于分析 jmap 生成的 heap dump 文件(堆转储快照)。jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 文件的分析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。
- 使用了 jhat 命令,就启动了一个 http 服务,端口是 7000,即 http://localhost:7000/,就可以在浏览器里分析。
- 说明:jhat 命令在 JDK9、JDK10 中已经被删除,官方建议用 VisualVM 代替。
- 基本适用语法:jhat
- 打印JVM中线程快照:jstack
- 多功能命令行:jcmd
- 远程主机信息收集:jstatd
JVM监控及诊断工具GUI
前面我们学习Arthas也是一种JVM监控及诊断工具GUI,本篇先抛出影子,后续在单独针对
- JDK自带的工具
- 第三方工具
此外针对JVM运行时参数和分析GC日志再单独增加专题文档
**本人博客网站 **IT小神 www.itxiaoshen.com
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。