网站建设与制作dw8教程,住房和城乡建设厅网站,flash网站免费源码带后台,高端网站建设公司服务好吗对于高并发访问量的电商、物联网、金融、社交等系统来说#xff0c;JVM内存优化是非常有必要的#xff0c;可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间#xff0c;以避免系统过多地暂停。FGC达到理想值后#xff0c;比如一天或者两天触发一次…对于高并发访问量的电商、物联网、金融、社交等系统来说JVM内存优化是非常有必要的可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间以避免系统过多地暂停。FGC达到理想值后比如一天或者两天触发一次FGC。FCT时间优化为100300毫秒后再减少YoungGC次数或者YoungGC时间YoungGC仍然会消耗CPU资源优化YoungGC调用次数和消耗的CPU资源可以提高系统的吞吐量。
优化GC前必须获取GC的实际使用情况最好的方式是通过CG Log收集垃圾回收日志通过一些可视化工具查看垃圾回收分析数据比如GCEasy。持续优化和对比优化前后的GC Log能确认吞吐量和性能是否得到提升。
下面推荐几个常用的内存分析命令和工具
jstat命令
JDK自带的jstat命令用于查看虚拟机垃圾回收的情况如下命令使用gcutil参数输出堆内存使用情况统计 jstat –gcutil -h 20 pid 1000 100
此命令显示进程为pid的内存使用汇总1000毫秒输出一次总共输出100行。-h 20表示每20行输出一次表头。-gcutil表示显示JVM内存使用汇总统计 列表显示了虚拟机各个代的使用情况描述了堆内存的使用占比和垃圾回收次数以及占用时间具体含义如下 S0第一个幸存区使用比值。 S1第二个幸存区的使用率。 E伊甸园区的使用比值。 O老年代。 M方法区、元空间使用率。 CCS压缩使用比值。 YGC年轻代垃圾回收次数。 YGCT年轻带垃圾回收占用时间。 FGC全局垃圾回收次数这对性能影响至关重要。 FGCT全局垃圾回收的消耗时间。 GCT总的垃圾回收时间。
可以看到S0、S1、E变化频率高说明程序在频繁创建生命周期短的对象FGC为0表示还未做过全局垃圾回收。如果FGC变化频率很高则说明系统性能和吞吐量将下降或者可能出现内存溢出。
其他查看汇总信息的常用选项如下 -gc类似gcutilgcutil以百分比形式显示内存的使用情况gc显示的是内存占用的字节数以KB的形式输出堆内存的使用情况。 -gccause类似gcutil额外输出GC的原因。
jmap命令
jmap命令用于保存虚拟机内存镜像到文件中然后可以使用JVisualVM或者MAT工具进行进一步分析。命令如下 jmap -dump:formatb,filefilename.hprof pid
需要注意实际系统会有2GB到8GB内存此命令会导致虚拟机暂停工作13秒。还有一种是被动获取方式当虚拟机出现内存溢出的时候会主动“dump”内存文件。添加虚拟机启动参数 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/heapdump.hprof
当虚拟机判断达到内存溢出触发条件的时候会有如下输出并保存镜像文件 java.lang.OutOfMemoryError: Java heap spaceDumping heap to heapdump.hprof ...
当获得镜像文件后打开JvisualVM工具选择菜单“File”点击装入选择我们保存过的dump文件这时面板会打开内存镜像文件。打开较大的内存镜像文件需要较长的时间需要耐心等候其他工具如MAT或者商业的YourKit Java Profiler打开镜像文件更快分析功能更强大。
GCeasy
GCeasy是一个分析GC日志文件的在线网站能根据上传的GC日志以图表形式显示GC回收过程和统计数据。下图显示的是GC性能的统计情况如吞吐量显示为99.935%说明只有少量CPU资源用于垃圾回收。最长的GC时间是20毫秒属于正常范围。在测试JVM参数调整是否能增加吞吐量减小垃圾回收占用的CPU时可以使用这个统计功能。 下图统计了GC总的时间和回收的字节数也显示了Full GC的统计情况。 JMC
Java Mission Control简称JMC是JDK自带的工具是一个高性能的对象监视、管理、产生时间分析和诊断的工具套件笔者主要用来追踪热点代码与热点线程是主要的内存优化调优工具。
类似JVisualVM通过JMX连接进入JMC控制台。
通过连接到远程JVM进程后可以执行飞行记录FlightRecord选择飞行记录存放的路径与执行时间即可如下图所示。需要注意的是执行飞行记录功能时会对当前JVM进程有一定的性能影响大约为5%10%所以建议JMC连接隔离环境中的服务器并执行飞行记录功能。 通过一段时间的记录飞行记录可以反映线程的繁忙程度以及CPU的热点方法。
使用热点方法可以直接找到最耗时的几个方法对热点方法重点优化就可以使CPU的使用率下降一大截。
飞行记录还可以反映内存增长的热点方法以及显示单位时间内创建的最多对象的方法。下图为找到的内存对象中创建的最多的char[]的方法一个是Fastjson另一个是Kryo。 小结通过JMC的热点方法的统计结果可以有针对性地进行优化笔者通过对线上系统进行优化使得CPU使用率下降了40%、内存GC频率下降了100%以上。
MAT
MAT是Memory Analyzer的简称它是一款功能强大的Java堆内存分析器可以分析具有数亿个对象的内存镜像快速计算对象大小自动找到嫌疑的泄漏对象并形成内存泄漏报告。MAT是基于Eclipse开发的是一款免费的内存镜像分析工具是笔者发现内存泄漏原因的主要工具。
通过File-Open Heap Dump可以打开内存镜像文件显示内容如下图所示。 它提供了Leak Suspects 报告输出有可能发生内存泄漏的对象。
OQL
OQL语句类似SQL语句可以在VisualVM、MAT等大多数内存镜像分析工具中执行完成对象查找任务。