| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> JVM调优及调优工具汇总,GC垃圾收集器总结 -> 正文阅读 |
|
[Java知识库]JVM调优及调优工具汇总,GC垃圾收集器总结 |
最近朋友小B说想一份GC优化的资料内容,JVM内存分析以及性能调优的时候方便查询。可是文章太多根本看不过来,那么今天指北君就为大家带来这份,GC垃圾收集器总结及其优化指南,让你的JVM从此不再寂寞。文末更有惊喜。 1 垃圾收集器1.1 Serial/Serial Old 收集器:Serial 收集器作用于年轻代中, 采用 复制算法 , 属于串行回收方式 Serial Old 收集器 采用串行回收, STW机制, 采用 标记-压缩 算法 ,
? “-XX:+PrintGCDetails” 年轻代串行收集器的工作日志开关 1.2 ParNew 收集器ParnNew 可以说是Serial收集器的多线程版本, ParNew 收集器在 年轻代 中同样才用的也是复制算法 和 STW 机制 并行回收机制。 ParnNew 收集器的优势体现在多CPU,多核心的环境中, 在某些注重低延迟的应用场景下ParNew 和 CMS 收集器的组合模式, 在Server 模式下的内存回收效果很好。 使用 “-XX:+UserParNewGC” 手动指定使用ParNew收集器 " -XX:+UserParallelGC" 表示 年轻代使用并行垃圾回收器, 老年代使用串行收集器 1.3 Parallel/Parallel Old 收集器Parallel收集器是并行回收 采用复制算法 年轻代 STW , 和ParNew不同Parrllel收集器可以控制程序的吞吐量大小 , 被称为-吞吐量优先的垃圾收集器. Parallel Old采用标记整理算法,用于老年代的垃圾回收。 常用参数:“-XX:+GCTimeRatio:N” 设置执行内存回收的时间所占JVM运行总时间的比例, 1/(1+N) 默认N为99 “-XX:+MaxGCPauseMills” 设置执行内存回收STW 的暂停时间阈值, 若指定该值,则尽可能地在设定的时间内完成内存回收。 “-XX:+UseAdaptiveSizePolicy” 选项用于设置GC的自动分代大小调节策略。 "-XX:UseParallelOldGC"可在年轻代和老年代都是用并行回收收集器, 此收集器重点关注吞吐量 “-XX:ParallelGCThreads” 可用于设置垃圾回收时的线程数量 Parallel Old 收集器采用了 标记-压缩算法 , 用于老年代垃圾回收 , 并行回收 STW Parallel 和 Parallel Old 收集器的组合 在Server 模式下的内存回收性能较好。 1.4 CMS(Concurrent-Mark-Sweep) 收集器基于低延迟的考虑 , 是并行垃圾回收器, 而且是老年代垃圾收集, 低延迟, 采用标记清除算法。会有短暂的STW 基本步骤如下 :
常用参数:“-XX:+UseCMS-CompactAtFullCollection” 用于指定在执行完FullGC 之后 是否对内存空间进行压缩整理, “-XX:+CMSFullGCs-BeforeCompaction” 设定在执行多少次FullGC 之后对内存空间进行压缩整理 “-XX:+CMSInitiatingOccupanyFraction” 设置老年代中的内存使用率达到多少百分比的时候执行内存回收 JDK1.6之前默认值为68% JDK1.6 之后默认92% , CMS垃圾收集器在回收过程中程依然可能会产生垃圾,所以需要设定一个阈值来进行垃圾回收,如果CMS回收失败,JVM则会启动老年代串行收集器进行垃圾回收,程序的STW时间会较长, 所以可以在内存增长缓慢的程序里面设置较大阈值,在内存增长快速的程序里面设置较小的阈值, 避免触发老年代串行收集器。 “-XX:UseConMarkSweepGC” 表示年轻代使用并行收集器,老年代使用CMS 年轻代 并行收集器工作时的线程数量可以使用 “-XX:ParallelGCThreads” 选项指定, 一般最好与CPU的数量相当. 1.5 G1(Garbage-First) 收集器G1将整个堆划分为若干个大小相等的区间(1-32MB),Region类型分为Unused Region、Eden Region 和 Survivor Region组成了年轻代空间,Old Region, Humongous Region(里面的对象超过每个Region的50%), 每个Region都会有一个Region Set (RS),RS的数据结构是Hash表,里面的数据是CardTable (堆中没512Byte 映射在 card table 1 byte ) , 简单说 RS 里面存的是Region种存活对象的指针。 当Region中数据发生变化的时候 ,首先反映到Card Table 中的一个或者对个card上,RS通过扫面内部的Card Table 得知Region中内存使用情况和存活对象,在使用Region过程中,如果一个Region被填满了,分配内存的线程会重新选择一个新的Region,空闲Region被组织到一个基于链表的数据结构(LinkedList )中,这样可以快速找到Region. G1 GC 可以分为 Young GC 和Mixed GC 年轻代GC:当年轻代达到一定的阈值,就开始年轻代的并发收集。将Eden Region中存活对象copy转移到Survivor的Region中,同时释放Eden Region 。 存活的时间够久就移到Old Reagion。 Mixed GC: 当Old Region占比达到一定的比例(通过 -XX:InitantingHeapOccupancyPercent 设置,默认45%)之后,会触发并行标记,然后就会进行Mixed GC。 Mixed GC 对一个叫做CSet的Region集合进行垃圾回收,其中包含了所有的年轻代Region和选取的一部分回收效益最好的Old Region。 并发标记的过程类似于CMS中的标记过程。 G1 可选优化参数
可以根据上述三个参数的调整来优化年轻代的垃圾回收
-XX:+PrintAdaptiveSizePoliy 开启后会输出完成的GC生态日志, -XX:G1HeapWastePercent 表示最大可忍受的垃圾总量,默认是堆空间的5%,如果Mixed GC占用的时间过多,可以将此值调整大一点。 -XX:G1MixedGCCountTarget 默认为8,表示Mixed GC过程中入选的Old Region的最小阈值,用于控制入选的Old Region的数量 -XX:G1OldCSetRegionThresholdPercent 默认值100% ,表示加入到CSet中的Old Region的最大数量。 -XX:G1MixedGCLiveThresholdPercent 默认值 85% ,表示设置的每CSet中每个区间最多存活对象的百分比。 2 JVM的一些常用参数
3 JVM常用调优分析工具JVM内存分析调优,如果能多多利用调优的一些工具,那将会事半功倍。那么指北君问大家介绍比较好用的一些调优工具,包括Java自带的和第三方的一些好用工具。 jpsJVM Process Status Tool,查询当前运行状态的Java 进程 语法格式
具体 [options]选项: jinfoJVM Configuration info ,查询Java进程运行时的详细信息以及JVM的参数详细信息 命令格式
具体 [options]选项: -flag name : prints the name and value of the given command line flag. -flag [+|-]name : enables or disables the given boolean command line flag. -flag name=value : sets the given command line flag to the specified value. -flags prints : command line flags passed to the JVM. pairs. -sysprops :prints Java System properties as name, value pairs. 示例:
jstatJVM Statistics Monitoring Tool 可查看JVM的性能统计信息,能显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。可参考官网详情:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html 命令格式
generalOption 通用命令行参数, outputOptions 一个过多个输出选项, vmid 虚拟机定位标识,确定虚拟机运行的机器端口等 interval 查询并显示信息的时间间隔 count 需要查询信息的数量 关于jstat的参数选项有如:
示例:
jmapJVM Memory Map 输出对象内存信息,Java堆信息等 命令格式
options选项 -dump:[live,]format=b,file= 将Java堆生成dump文件, -finalizerinfo 输出等待执行finalizer方法的对象 -heap 输出堆的详细信息,GC算法,堆参数等等 -histo[:live] 输出堆的统计信息,包括Java类,对象数量,内存size等 -permstat Prints class loader wise statistics of permanent generation of Java heap -F 强制生成dump,与jmap -dump / jmap -histo 等一起使用,如果进程id没有响应则强制生成dump文件 示例:
生成Java 堆dump文件
jstack主要输出 Java线程的堆栈信息
示例:
JConsoleJConsole 是Java自带的可视化程序,可以监控一些内存线程等信息,使用也比较方便。 VisualVMVisualVM在在Java8之后就被从JDK中拿走,如果想使用可以去VisualVM官网(文末贴出下载地址)下载,它有标准版和基于GraalVM的版本,同时还有IDEA的插件用起来也比较方便。我们下载标准版VisualVM2.07先看一下。还是熟悉的味道。 Memory Analyzer (MAT)Eclipse 出品的一款Java堆内存分析程序,可以帮助我们找到内存泄漏和减少内存消耗。可在其官网下载,文末贴出下载地址 总结本篇总结了一些常用GC的垃圾回收流程,GC调优可以参考的一些参数。另外还介绍了一些分析Java性能的一下Java命令及可视化分析工具,在实际生产环境使用的话肯定会比所介绍的还要复杂,所以看官们还不快快动起手来操练一下。让你的JVM不再寂寞。由于每一个工具的详细使用都需要大篇幅,那么指北君后面将会为大家一一带来这些工具如何进行JVM性能调优。敬请期待! 后记VisualVM 官网 :https://visualvm.github.io/ GraalVM 官网 : https://www.graalvm.org/ Memory Analyzer (MAT) 下载 官网: https://www.eclipse.org/mat/downloads.php (选择国内中科大的镜像,下载会快许多) 最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,我连日加班好多天,终于整理好了,16000+ 道,295多份,多份面试题大全,我会持续更新中,马上就会整理更多! 微信搜索 【Java技术指北】回复【面试题】即可获取 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 9:53:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |