结果 Idea启动时间 加载大项目花费的时间 在IDEA中打开两个微服务 再次使用jstat –gcutil 最后的角逐:重新加载Monolith 最后一次使用jstat-gcutil 总结 讨论 - 打开两个微服务项目(测试时间) 检查 jstat -gcutil 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间) 检查 jstat -gcutil jstat -gcutil jstat 它有许多选项来收集各种数据(完整的文档),但这里只会用到:-gcutil : -gcutil - Summary of garbage collection statistics. 如果我们执行: jstat -gcutil <IDEA_PID> 会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。 最后一次使用jstat-gcutil 因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。
打开两个微服务项目(测试时间) 检查 jstat -gcutil 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间) 检查 jstat -gcutil jstat -gcutil jstat 它有许多选项来收集各种数据(完整的文档),但这里只会用到: -gcutil : -gcutil - Summary of garbage collection statistics. 如果我们执行: jstat -gcutil <IDEA_PID> 会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。 ? 再次使用jstat –gcutil 加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。 ? 最后一次使用jstat-gcutil 因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。 ? IntelliJ IDEA 内存优化最佳实践 技术分享 第9张 ?
打开两个微服务项目(测试时间) 检查 jstat -gcutil 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间) 检查 jstat -gcutil jstat -gcutil jstat 它有许多选项来收集各种数据(完整的文档),但这里只会用到: -gcutil : -gcutil - Summary of garbage collection statistics. 如果我们执行: jstat -gcutil <IDEA_PID> 会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。 ? ? 再次使用jstat –gcutil 加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。 ? ? 最后一次使用jstat-gcutil 因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。 ? ?
打开两个微服务项目(测试时间) 检查 jstat -gcutil 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间) 检查 jstat -gcutil jstat -gcutil jstat 它有许多选项来收集各种数据(完整的文档),但这里只会用到: -gcutil : -gcutil - Summary of garbage collection statistics. 如果我们执行: jstat -gcutil <IDEA_PID> 会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。 ? 再次使用jstat –gcutil 加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。 ? 最后一次使用jstat-gcutil 因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。 ? IntelliJ IDEA 内存优化最佳实践 技术分享 第9张 ?
下面推荐几个常用的内存分析命令和工具 jstat命令 JDK自带的jstat命令用于查看虚拟机垃圾回收的情况,如下命令使用gcutil参数输出堆内存使用情况统计: jstat –gcutil -h 20 -gcutil表示显示JVM内存使用汇总统计: 列表显示了虚拟机各个代的使用情况,描述了堆内存的使用占比和垃圾回收次数,以及占用时间,具体含义如下: S0,第一个幸存区使用比值。 其他查看汇总信息的常用选项如下: -gc,类似gcutil,gcutil以百分比形式显示内存的使用情况,gc显示的是内存占用的字节数,以KB的形式输出堆内存的使用情况。 -gccause,类似gcutil,额外输出GC的原因。 jmap命令 jmap命令用于保存虚拟机内存镜像到文件中,然后可以使用JVisualVM或者MAT工具进行进一步分析。
Eden区、两个survivor区、老年代、永久代的容量、已用空间、GC时间合计等信息 -gccapacity 监视内容与 -gc 基本相同,但是输出主要关注Java堆各个区域使用到的最大、最小空间 -gcutil 监视内容与 -gc 基本相同,但是主要关注已使用空间占总空间的百分比 -gccause 与状况 -gcutil 功能一样,但是会额外输出导致上次gc产生的原因 -gcnew 监视新生代gc状况 -gcnewcapacity gcpermcapacity 输出永久代使用到的最大、最小空间 -compiler 输出 JIT 编译器编译过的方法、耗时等信息 -printcompilation 输出已经被 JIT 编译的方法 -gcutil 例子 ~ jstat -gcutil 2861 1000 2 S0 S1 E O M CCS YGC YGCT FGC FGCT
现象 jstat -gcutil 16796 发现频繁的发生full gc,显然full gc没有将内存清理掉 产品的query模块运行一段时间后,就不能正常提供服务,严重影响了服务的可用性 追查 jstat -gcutil 16796 发现频繁的发生full gc,显然full gc没有将内存清理掉 查看日志,发现读取Hbase时发生了OutOfMemory现象。 首先获取JVM的进程号,为16796 jstat -gcutil 16796 发现频繁的发生full gc,显然full gc没有将内存清理掉 图片 $jmap -histo 16796 查看进程中的对象
2. jstat 监视虚拟机各种运行状态,命令参数有: -gc:监视堆状况 -gcutil:与-gc一致,不同于显示百分比 jstat -gcutil pid 时间间隔 查询次数 jstat -gcutil
jstat命令 JDK自带的jstat命令用于查看虚拟机垃圾回收的情况,如下命令使用gcutil参数输出堆内存使用情况统计: jstat –gcutil -h 20 pid 1000 100 此命令显示进程为 -gcutil表示显示JVM内存使用汇总统计: 列表显示了虚拟机各个代的使用情况,描述了堆内存的使用占比和垃圾回收次数,以及占用时间,具体含义如下: S0,第一个幸存区使用比值。 其他查看汇总信息的常用选项如下: -gc,类似gcutil,gcutil以百分比形式显示内存的使用情况,gc显示的是内存占用的字节数,以KB的形式输出堆内存的使用情况。 -gccause,类似gcutil,额外输出GC的原因。 jmap命令 jmap命令用于保存虚拟机内存镜像到文件中,然后可以使用JVisualVM或者MAT工具进行进一步分析。
/java.log //查询前20占用内存大对象 jmap -histo:live 2837 | head -n 20 //查看Full GC情况 jstat -gcutil 2501 使用情况查看 jmap -heap 2501 ps aux --sort -rss | head lsof -i -P | grep LISTEN |grep java 查看应用端口 jstat -gcutil
class -compiler -gc -gccapacity -gccause -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccapacity 显示不同的generations相应的heap容量情况 -gccause 显示gc的情况,(同-gcutil gcoldcapacity 显示gc时,老年区heap容量 -gcpermcapacity 显示gc时,permanent区heap容量 -gcutil FailedType FailedMethod 263 0 0 2.92 0 显示垃圾收集信息 如: [root@dev18 ~]# jstat -gcutil
jstat --help:查看命令帮助 jstat -options:返回有哪些命令选项,如 -gcutil、-gc、-gccapacity、-gccause,另有 -class、-compiler、- 每几行输出标题行] 进程号 [持续输出间隔时长 [输出次数]] 持续输出间隔时长 默认毫秒,数字后面加 s 单位改为秒,-t 表示每行开头输出 相对应用启动时间的Timestamp 时间戳 2. jstat -gcutil 常用命令格式:jstat -gcutil 进程号 持续输出间隔毫秒数,下图每隔 1000毫秒输出一次 前6列 输出各个内存区域使用百分比 (没有容量大小),依次是 幸存区survivor0、1、新生代
survivor区、old区、永久区等的容量,已用空间和GC时间等信息; -gccapacity 监视内容与-gc基本是一致的,-gccapacity的输出包括heap各个区域使用到的最大最小空间; gcutil 监视内容同样与-gc基本一致,-gcutil的输出主要是heap各个区域使用空间占总空间百分比; gccause 与-gcutil功能一致,但是会额外输出导致上一次gc的原因; gcnew
class -compiler -gc -gccapacity -gccause -gcmetacapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcutil 包括eden区、两个Survivor区、老年代、永久代等的容量、已使用空间、GC时间合计等信息 -gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用的最大、最小空间 -gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 -gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 -gcnew 监视新生代GC状况 -gcnewcapacity ---- -gcutil 输出主要关注已使用空间占总空间的百分比 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 [root@artisan ~]# jstat -gcutil 5811 :压缩使用比例 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间 ---- -gccause 额外输出导致上一次GC产生的原因 与-gcutil
options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 参数解释: Options — 选项,我们一般使用 -gcutil 的次数 FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) 实例 jstat -gc [pid] 1000 -gcutil
metaspace的大小 -gcnew 显示新生代信息; -gcnewcapacity 显示新生代大小和使用情况; -gcold 显示老年代和永久代的信息; -gcoldcapacity 显示老年代的大小; -gcutil 显示垃圾收集信息; -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因; -printcompilation 输出JIT编译的方法信息 gccapacity 查看新生代、老生代及持久代的存储容量情况,可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小 gccause 查看垃圾收集的统计情况(这个和-gcutil CCSMX:最大压缩类空间大小 CCSC:当前压缩类空间大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间 总结垃圾回收统计 gcutil PS C:\> jstat -gcutil 6368 S0 S1 E O M CCS YGC YGCT FGC FGCT
需要监测的数据:(内存使用情况 谁使用了内存 GC的状况) 内存使用情况–heap&PermGen @ 表示通过jmap –heap pid 可以获取的值 表示通过jstat –gcutil pid 可以获取的值 loader行为信息 compiler 统计编译行为信息 gc 统计jdk gc时heap信息 gccapacity 统计堆内存不同代的heap容量信息 gccause 统计gc的情况(同-gcutil )和引起gc的事件 gcnew 统计gc时新生代的信息(相比gcutil更详细) gcnewcapacity 统计gc时新生代heap容量 gcold 统计gc时,老年区的情况 gcoldcapacity 统计gc时,老年区heap容量 gcpermcapacity 统计gc时,permanent区heap容量 gcutil 统计gc时,heap情况 printcompilation 统计编译行为信息 前面的字段与gcutil相同.
坚决不应该以root身份启动有固定用户的进程(属于误操作,应谨慎) 其他思路: 1.查日志,其实能看到很多删除失败的记录,这个应该留意,才能更好找到原因 2.利用jstat分析jvm状态 , jstat -gcutil pid(vmid) 间隔(毫秒) 次数,如: [root@service ~]# jstat -gcutil 14503 1000 4 S0 S1 E O P
jps 30054 Jps 29529 Launcher 28953 29530 SearchBusiestCPU 29295 RemoteMavenServer ~ ᐅ jstat -gcutil GCT 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000 ~ ᐅ jstat -gcutil 17.27 19.75 0 0.000 0 0.000 0.000 当然也支持-t,-h<num>,直接看一下效果即可,不是特别的重要: ~ ᐅ jstat -gcutil (新区统计) l gcnewcapacity (新区大小) l gcold (老区统计) l gcoldcapacity (老区大小) l gcpermcapacity (永久区大小) l gcutil perm代当前新生成的容量 (字节) PC Perm(持久代)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 5、jstat -gcutil
显示新生代信息; -gcnewcapacity 显示新生代大小和使用情况; -gcold 显示老年代和永久代的信息; -gcoldcapacity 显示老年代的大小; -gcutil 显示垃圾收集信息; -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因; -printcompilation :从应用程序启动到采样时old代(全gc)gc次数 FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT:从应用程序启动到采样时gc用的总时间(s) 示例十: - gcutil 统计gc信息 jstat -gcutil <pid> ? gc)gc次数 FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT:从应用程序启动到采样时gc用的总时间(s) 示例十一:-gccause 显示垃圾回收的相关信息(通-gcutil