网站建设服务合同缴纳印花税吗,航空摄影设计,网站设置快捷键,丽水网站建设明恩玉杰ZGC
诞生原因
Java生态非常强大#xff0c;但还不够#xff0c;有些场景仍处于劣势#xff0c;而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如
谷歌主导的Android手机系统显示卡顿。证券交易市场#xff0c;实时性要求非常高#xff0c;目前主要是C主…ZGC
诞生原因
Java生态非常强大但还不够有些场景仍处于劣势而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如
谷歌主导的Android手机系统显示卡顿。证券交易市场实时性要求非常高目前主要是C主导。大数据集群如HBase的性能。
特性
ZGCThe 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个虚地址。 整体流程
概述
主要分为两步
标记阶段标记垃圾转移阶段对象复制或移动 垃圾标记
垃圾标记算法采用可达性分析算法 RemappedGC前所有内存都是Remapped,或者标记后如果还是Remapped则是垃圾。M0发生两次GC为例M0是1次GC。前一次GC的标记阶段被标记过的活跃对象但是上次GC未对对象进行转移。M1发生两次GC为例M0是2次GC。本次垃圾回收中识别的活跃对象。标记阶段对象分配Remapped
初始标记标记根并发标记标记剩余再标记解决漏标
标记结束后Remapped对象即为垃圾对象。而下次标记使用M1表示活跃。 ZGC转移
如果是同一个页面则等同于标记整理。如果是不同页面等同于复制算法。
JVM调优概述
背景
生产环境中的问题生产环境中的问题。生产环境发生了内存溢出该如何处理生产环境应该给服务器分配多少内存合适如何对垃圾回收器的性能进行调优生产环境 CPU 负载飙高该如何处理生产环境应该给应用分配多少线程合适不加 log如何确定请求是否执行了某一行代码不加 log如何实时查看某个方法的入参与返回值为什么要调优防止出现 OOM解决 OOM减少 Full GC 出现的频率调优场景Full GC 次数频繁。GC 停顿时间过长超过1秒。应用出现OutOfMemory 等内存异常。系统吞吐量与响应性能不高或下降不同阶段的考虑上线前项目运行阶段线上出现 OOM调优概述
监控的依据运行日志异常堆栈GC 日志线程快照堆转储快照调优的大方向合理地编写代码充分并合理的使用硬件资源合理地进行 JVM 调优调优目标
JVM调优目标是使用较小的内存占用来获得较高的吞吐量或者较低的延迟从这里也可以知道其重要指标有三个
内存占用程序正常运行需要的内存大小。延迟由于垃圾收集而引起的程序停顿时间。吞吐量用户程序运行时间占用户程序和垃圾收集占用总时间的比值。
从上面我们也知道这三者如同分布式CAP理论一样不可完全兼得对于一个Java程序同时保证内存占用小、延迟低、高吞吐量是不可能的任何一个指标性能的提高几乎都是以牺牲其他指标性能的损为代价的不可兼得。程序的目标不同调优时所考虑的方向也不同因此需要结合实际场景有明确的优化目标找到性能瓶颈对瓶颈有针对性的优化。
调优原则
90%也即是大多数的Java应用不需要进行JVM优化。大多数导致GC问题的原因是代码层面的问题导致的代码层面。上线之前应先考虑将机器的JVM参数设置到最优。减少创建对象的数量减少使用全局变量和大对象代码层面。优先架构调优和代码调优JVM优化是不得已的手段。分析GC情况优化代码比优化JVM参数更好。
调优步骤
第 1 步性能监控GC 频繁cpu load 过高如top -hP 进程号top -d 2 -c等OOM内存泄露死锁程序响应时间较长第 2 步性能分析打印 GC 日志通过 GCviewer 或者 gceasy来分析异常信息灵活运用命令行工具、jstack、jmap、jinfo 等dump 出堆文件使用内存分析工具分析文件使用阿里 Arthas、jconsole、JVisualVM 来实时查看 JVM 状态jstack 查看堆栈信息第 3 步性能调优适当增加内存根据业务背景选择垃圾回收器优化代码控制内存使用增加机器分散节点压力合理设置线程池线程数量使用中间件提高程序效率比如缓存、消息队列等性能评价/测试指标
停顿时间或响应时间提交请求和返回该请求的响应之间使用的时间一般比较关注平均响应时间。数据库查询一条记录有索引十几毫秒。机械磁盘一次寻址定位。4毫秒从机械磁盘顺序读取 1M 数据。2毫秒从 SSD 磁盘顺序读取 1M 数据。0.3毫秒从内存读取 1M 数据。十几微妙Java程序本地方法调用。几微妙网络传输2Kb数据。1微妙吞吐量对单位时间内完成的工作量请求的量度在 GC 中运行用户代码的事件占总运行时间的比例总运行时间程序的运行时间内存回收的时间吞吐量为 1-1/(1n)其中-XX::GCTimeRation内存占用Java 堆区所占的内存大小相互间的关系以高速公路通行状况为例吞吐量每天通过高速公路收费站的车辆的数据并发数高速公路上正在行驶的车辆的数目响应时间车速JVM监控及诊断命令行工具
无监控、不调优命令行安装 jdk 的 bin 目录这些工具用来获取目标 JVM 不同方面、不同层次的信息帮助开发人员很好地解决 Java 应用程序的一些疑难杂症。
查看正在运行的Java进程:jpsjps(Java Process Status)显示指定系统内所有的 HotSpot 虚拟机进程查看虚拟机进程信息可用于查询正在运行的虚拟机进程。对于本地虚拟机进程来说进程的本地虚拟机 ID 与操作系统的进程 ID 是一致的是唯一的。基本使用语法为jps [options] [hostid]查看JVM统计信息:jstatjstatJVM Statistics Monitoring Tool用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。在没有 GUI 图形界面只提供了纯文本控制台环境的服务器上它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。(一般生产环境没gui工具简单可常用这个)基本使用语法为jstat - [-t] [-h] [ []]比如jstat -gc 进程id 1000 10jstat 还可以用来判断是否出现内存泄漏在长时间运行的 Java 程序中我们可以运行 jstat 命令连续获取多行性能数据并取这几行数据中 OU 列即已占用的老年代内存的最小值。然后我们每隔一段较长的时间重复一次上述操作来获得多组 OU 最小值。如果这些值呈上涨趋势则说明该 Java 程序的老年代内存已使用量在不断上涨这意味着无法回收的对象在不断增加因此很有可能存在内存泄漏。实时查看和修改JVM配置参数:jinfojinfo(Configuration Info for Java)查看虚拟机配置参数信息也可用于调整虚拟机的配置参数基本使用语法为jinfo [options] pid比如jinfo -sysprops 进程id导出内存映像文件内存使用情况:jmap获取 dump 文件堆转储快照文件二进制文件它还可以获取目标 Java 进程的内存相关信息包括 Java 堆各区域的使用情况、堆中对象的统计信息、类加载信息等。基本使用语法为jmap [option]jmap [option] executablejmap [option] [server_id]使用1导出内存映像文件手动的方式jmap -dump:formatb,filefilename.hprofjmap -dump:live,formatb,filefilename.hprof使用2显示堆内存相关信息jmap -heap 进程idjmap -histo 进程id使用3其他作用jmap -permstat 进程id查看系统的ClassLoader信息jmap -finalizerinfo查看堆积在finalizer队列中的对象JDK 自带堆分析工具:jhatjhat(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中线程快照:jstackjstackJVM Stack Trace用于生成虚拟机指定进程当前时刻的线程快照虚拟机堆栈跟踪。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。生成线程快照的作用可用于定位线程出现长时间停顿的原因如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时就可以用 jstack 显示各个线程调用的堆栈情况。基本语法 jstack [option] pid多功能命令行:jcmd在 JDK 1.7 以后新增了一个命令行工具 jcmd。它是一个多功能的工具可以用来实现前面除了 jstat 之外所有命令的功能。比如用它来导出堆、内存使用、查看 Java 进程、导出线程信息、执行 GC、JVM 运行时间等。jcmd -l列出所有的 JVM 进程jcmd pid help针对指定的进程列出支持的所有具体命令jcmd pid 具体命令显示指定进程的指令命令的数据远程主机信息收集:jstatd之前的指令只涉及到监控本机的 Java 应用程序而在这些工具中一些监控工具也支持对远程计算机的监控如 jps、jstat。为了启用远程监控则需要配合使用 jstatd 工具。命令 jstatd 是一个 RMI 服务端程序它的作用相当于代理服务器建立本地计算机与远程监控工具的通信。jstatd 服务器将本机的 Java 应用程序信息传递到远程计算机。JVM监控及诊断工具GUI
前面我们学习Arthas也是一种JVM监控及诊断工具GUI本篇先抛出影子后续在单独针对
JDK自带的工具jconsoleJDK 自带的可视化监控工具。查看 Java 应用程序的运行概况、监控堆信息、永久区或元空间使用情况、类加载情况等。从 Java5 开始在 JDK 中自带的 java 监控和管理控制台。用于对 JVM 中内存、线程和类等的监控是一个基于 JMXjava management extensions的 GUI 性能监控工具。Visual VMVisual VM 是一个工具它提供了一个可视界面用于查看 Java 虚拟机上运行的基于 Java 技术的应用程序的详细信息。VisualVM是–个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JDK命令行工具使用VisualVM可用于显示虚拟机进程及进程的配置和环境信息(jps ,jinfo)监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等替JConsole。在JDK 6 Update 7以后Visual VM便作为JDK的一 部分发布(VisualVM 在JDK/bin目录下)。此外Visual VM也可以作为独立的软件安装。JMCJava Mission Control内置 Java Flight Recorder。能够以极低的性能开销收集 Java 虚拟机的性能数据。第三方工具MATMATMemory Analyzer Tool是基于 Eclipse 的内存分析工具是一个快速、功能丰富的 Java heap 分析工具它可以帮助我们查找内存泄漏和减少内存消耗。MAT 不是一个万能工具它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式例如 SunHPSAP 所采用的 HPROF 二进制堆存储文件以及 IBM 的 PHD 堆存储文件等都能被很好的解析。最吸引人的还是能够快速为开发人员生成内存泄漏报表方便定位问题和分析问题。虽然 MAT 有如此强大的功能但是内存分析也没有简单到一键完成的程度很多内存问题还是需要我们从 MAT 展现给我们的信息当中通过经验和直觉来判断才能发现。JProfiler商业软件需要付费。功能强大。Flame Graphs火焰图在追求极致性能的场景下了解你的程序运行过程中 cpu 在干什么很重要火焰图就是一种非常直观的展示 CPU 在程序整个生命周期过程中时间分配的工具和调用找中的 CPU 消耗瓶颈。此外针对JVM运行时参数和分析GC日志再单独增加专题文档