网站首页 > java教程 正文
概述
前面已经介绍了GC是如何工作的,什么是年轻代和老年代,GC的机制以及FULL GC等相关概念,对于系统运维,更重要的还是在怎么去监控GC和优化GC,接下来介绍下监控方面的内容。
什么是GC监控
GC监控指了解JVM是如何运行GC的过程,例如了解:
- 一个年轻代中的对象什么时候会被移动到老年代,这个过程会消耗多长时间
- 或者说 什么时候会发生 stop-the-world ,持续时间有多久
GC监控就是为了弄清JVM是否在进行高效的垃圾收集,并检查是否有必要进行GC优化。基于以上信息,可以考虑修改应用程序的代码或者调整GC种类(GC优化)。
如何监控GC
监控GC的方式有多种,唯一的区别是展示GC信息的方式不同。GC操作由JVM完成,由于GC监控工具获取的GC信息都是由JVM提供,所以无论使用何种工具监控GC都将得到相同的结果。不过由于了解每种GC监控方式只需少量的时间,多知道几种还是有助于你在不同场景和环境中选择合适的GC监控方式。
首先,根据访问接口的不同,GC监控方式可以分为CUI(命令行交互接口) 和 GUI(图形界面接口) 两种。典型的CUI GC监控方法包含了一个叫做 jstat 的独立CUI程序,或者在运行JVM时使用 verbosegc 选项。
GUI GC监控是通过独立的GUI程序来完成,使用最广泛的三种程序分别为:jsonsole、jvisualvm和Visual GC。
篇幅有限,这里主要介绍jstat是怎么监控GC的。
jstat
1、相关概念
jstat: JVM Statistics Monitoring Tool;jstatd: jstat detail
jstat 是HotSpot JVM中的一个监控工具,HotSpot JVM中其他的监控工具有 jps 和 jstatd。有时需要结合使用这三种方式来监控Java应用。
jstat 不仅可以提供GC操作信息,也可以提供class loader的操作信息或JIT编译器的操作信息。在jstat可以提供的所有信息中,我们将仅介绍监控GC操作信息的功能。
jstat 位于$JDK_HOME/bin下,所以如果 java 或 javac 可以运行,那么 jstat也可以直接使用。
2、实例
jstat –gc lt;vmidgt; 1000
运行jstat -gc <vmid> 1000(or 1s)将会每隔1s在控制台上输出一次GC数据。jstat -gc <vmid> 1000 10将会每隔1s输出一次GC数据,总共输出10次。
思路:首先通过jps命令找到你要监控的Java应用的vmid,并把它作为jstat的参数。当几个WAS实例运行在同一台设备上时,如果你只使用jps命令,将只能看到启动(bootstrap)信息。建议在这种情况下使用 ps -ef | grep java与 jps 配合使用。
GC性能数据需要持续的监测,因此,当运行jstat时,需要以一定的频率输出GC监控信息。
例如,运行 “ jstat -gc 1000 “ (or 1s) 命令将在控制台每次刷新一次监控数据。
使用频率最高的按顺序可能是:-gcutil(或gccause)、-gc 和 -gccapacity。
- -gcutil 用于检查堆区域内存使用情况,GC次数以及GC操作的总时间
- -gccapacity 和其他选项用于检查实际分配的内存大小
不同的jstat选项会展示不同的列,以下是列信息。
jstat 的好处是只要有控制台可以使用,就可以持续的监控本地或远程运行中Java应用的GC操作信息。当使用 -gcutil 时会输出以下结果,在进行GC优化时,要特别注意:YGC、YGCT、FGC、FGCT和GCT。
这些指标非常重要,它们展示了GC运行的时间。
在这个例子中,YGC一共217次,YGCT为0.928秒,通过计算算数平均值,可以知道每次Yong GC的平均时间为4ms,同样可以算出 Full GC的平均时间为33ms.
但是算数平均值对于分析实际的GC问题可能并没有太大作用,这是因为GC之间的时间差异很大(换句话说,如果Full GC平均时间为0.067s,其中有一次可能是将近1ms,而另一次可能是将近57ms)。为了了解每次GC的时间,而不是使用算术平均数来代替,最好使用 -verbosegc。
3、-verbosegc参数
-verbosegc 是在Java应用启动时指定的JVM选项。jstat 可以在不指定任何JVM参数的情况下使用,-verbosegc 需要在JVM启动时指定,因此这个选项可能认为没什么必要(因此可以使用jstat代替)。然而,当发生GC时 -verbosegc 展示的结果更加容易理解,对于监控GC操作也十分有用。
jstat-verbosegc监控对象本机Java应用可以将日志输出到终端,远程应用可以借助jstatd使用网络连接来进行监控仅在JVM启动时设置了-verbogc参数才有效输出信息堆状态信息(使用情况、最大size、GC次数、时间等)GC执行前后新生代和老年代的大小以及GC操作时间输出时间根据设定好的时间输出任何发生GC的时候都会输出什么时候有用尝试观察堆区空间变化时尝试监控单次GC时
以下选项可以和 -verbosegc 结合使用:
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -XX:+PrintHeapAtGC
- -XX:+PrintGCDateStamps (from JDK 6 update 4)
如果只使用了 -verbosegc,默认会加上 -XX:+PrintGCDetails 选项。其他选项也可以和 -verbosegc 结合使用。
下面是-verbosegc 输出minor GC的例子:
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
猜你喜欢
- 2024-11-02 Java堆内存又溢出了!看大师如何防范
- 2024-11-02 并发编程中常见的内存溢出的三种情况
- 2024-11-02 jmeter内存溢出解决方法(jmeter怎么清理缓存)
- 2024-11-02 JAVA服务实例内存高问题排查及解决!牛掰
- 2024-11-02 面试官:你知道JVM内存溢出问题的定位方法吗?
- 2024-11-02 简述 JVM 基础(二):Java内存区域与内存溢出异常
- 2024-11-02 一次大量出现Full GC、内存泄漏问题及内存溢出错误排查和分析
- 2024-11-02 如何识别Java中的内存泄漏(如何识别java中的内存泄漏情况)
- 2024-11-02 java 面试专题一:(Java基础)第三篇常见内存溢出异常问题
- 2024-11-02 JAVA 8 内存溢出总结(java内存溢出会导致应用停机吗)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)