我们可以使用Java命令行和UI工具来监控应用程序的垃圾收集活动。下面的例子中,我使用Java SE Downloads 中一个演示程序。

如果你想使用同样的程序,前往 Java SE Downloads  页面下载JDK 7 and JavaFX Demos and Samples 我使用的和序示例是Java2Demo.jar  可以在jdk1.7.0_55/demo/jfc/Java2D 目录中找到。当然了这步可选。你可以选用任何Java程序执行GC监控命令。

我使用的启动演示程序的命令是:

pankaj@Pankaj: ~/Downloads/jdk1.7.0_55/demo/jfc/Java2D$ java -Xmx120m -Xms30m -Xmn10m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar Java2Demo.jar

1、JSTAT

我们可以使用 jstat 命令行工具来监控JVM内存和GC活动。标准的JDK中含有此命令。因此可以直接使用。

运行 jstat 之前你需要知道程序的进程ID号。你可以运行 ps -eaf | grep java 命令来获取。

pankaj@Pankaj: ~$ ps -eaf | grep Java2Demo.jar
501 9582 11579 0 9:48PM ttys000 0:21.66 /usr/bin/java -Xmx120m -Xms30m -Xmn10m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseG1GC -jar Java2Demo.jar
501 14073 14045 0 9:48PM ttys002 0:00.00 grep Java2Demo.jar

我的Java程序的进程ID号为 9582.现在我们可以如下执行jstat 命令。

1 pankaj@Pankaj: ~$ jstat -gc 9582 1000
2 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
3 1024.0 1024.0 0.0 0.0 8192.0 7933.3 42108.0 23401.3 20480.0 19990.9 157 0.274 40 1.381 1.654
4 1024.0 1024.0 0.0 0.0 8192.0 8026.5 42108.0 23401.3 20480.0 19990.9 157 0.274 40 1.381 1.654
5 1024.0 1024.0 0.0 0.0 8192.0 8030.0 42108.0 23401.3 20480.0 19990.9 157 0.274 40 1.381 1.654
6 1024.0 1024.0 0.0 0.0 8192.0 8122.2 42108.0 23401.3 20480.0 19990.9 157 0.274 40 1.381 1.654
7 1024.0 1024.0 0.0 0.0 8192.0 8171.2 42108.0 23401.3 20480.0 19990.9 157 0.274 40 1.381 1.654
8 1024.0 1024.0 48.7 0.0 8192.0 106.7 42108.0 23401.3 20480.0 19990.9 158 0.275 40 1.381 1.656
9 1024.0 1024.0 48.7 0.0 8192.0 145.8 42108.0 23401.3 20480.0 19990.9 158 0.275 40 1.381 1.656

  

jstat命令的最后一个参数是每次输出的时间间隔,因此它会每隔一秒打印内存及垃圾回收数据。下面详细看看每列。

  • S0C and S1C: 这列显示当前 Survivor0 and Survivor1 区域的大小(KB)
  • S0U and S1U: 这列显示 Survivor0 and Survivor1 区域的使用情况(KB). 其中一个Survivor区域总是空的。
  • EC and EU: 这列显示Eden区的当前大小及使用情况(KB). 注意 EU 的大小逐渐增加,当达到EC大小, 最小化 GC 被调用 ,EU 的大小减小。
  • OC and OU: 这列显示了老年代的当前大小及使用情况(KB)
  • PC and PU: 这列显示了 持久化代(Perm Gen) 的当前大小及使用情况(KB)
  • YGC and YGCT: YGC 列显示年轻代发生GC事件的数量。 YGCT 列显示年轻代发生GC操作累计时间.  注意这两列值都在增加与EU值减少是在同一行。这主要是最小化GC的原因。
  • FGC and FGCT: FGC 列显示了FUll GC发生的数量. FGCT 列显示了FULL GC操作的累计时间. 注意Full GC 所用的时间相比年轻代GC所用的时间要大的多。
  • GCT:  这列显示了GC 操作总累计时间。 注意它是 YGCT 和 FGCT 值的总和。

jstat的优点在于它可以在无GUI的远程服务器上执行。注意S0C, S1C 和EC之和为 10M ,与我们通过JVM选项 -Xmn10m 设置的值一样。

2、Java VisualVM with Visual GC

如果你想在GUI下查看内存及GC操作。 那么你可以使用 jvisualvm 工具。Java VisualVM 也同样包含在JDK中,你不需要单独下载。

只需要运行在终端上执行jvisualvm 命令来启动Java VisualVM程序。一旦启动,你需要通过Tools--》Plugins选项安装Visual GC 插件,正如下图所示。

   Visual GC 安装完毕后,左边列中打开程序前往Visual GC 部分。你将会得到如下图所示的JVM内存及GC截图。

Java GC 调优是提高应用程序吞吐量的最后选择,只有当你发现长时间的GC导致性能下降而产生应用程序超时。

你会在日志中看到java.lang.OutOfMemoryError: PermGen space的错误信息。然后可以尝试监控并通过使用JVM 选项  -XX:PermGen and -XX:MaxPermGen  来增加Perm Gen内存空间。你或许也可以尝试使用-XX:+CMSClassUnloadingEnabled 来检查使用CMS垃圾收集的性能如何?

如果你发现大量的FUll GC操作,你可以试着增加老年代内存空间。

总之GC调优需要花费大量的精力和时间,这里绝没有什么硬性或者快速的规则。你需要尝试不同的选项,比较他们,并找对你应用程序来说最好的那个。

转自: http://www.cnblogs.com/tonyspark/p/3731696.html

JAVA 垃圾收集监控的更多相关文章

  1. [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)

    source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...

  2. 关于 Java 性能监控您不知道的 5 件事,第 1 部分

    责怪糟糕的代码(或不良代码对象)并不能帮助您发现瓶颈,提高 Java? 应用程序速度,猜测也不能帮您解决.Ted Neward 引导您关注 Java 性能监控工具,从5 个技巧开始,使用Java 5 ...

  3. Tomcat java zabbix 监控

    排除汤姆猫错误的步骤 ps-ef | grep java或jps –lvm 查看java pid进程 netstat –lntup | grep java 查看java 端口有没有启动 查看 tomc ...

  4. JAVA性能监控与调优参考文档链接

    JAVA性能监控与调优参考文档链接 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.htmlTroub ...

  5. Java系统监控(淘汰sigar)

    Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件.它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solaris, AIX, ...

  6. Fundebug后端Java异常监控插件更新至0.2.0,支持Spring及Maven

    摘要: 0.2.0支持监控Spring应用,并且支持使用Maven接入插件,请大家及时更新. 支持监控Spring应用 1. pom.xml配置fundebug-spring依赖 <depend ...

  7. Java 内存监控命令简介(零)

    一.Java性能监控与调优命令.工具简介 1.jps :查看当前运行的Java程序端口号,包括运行jps的程序端口号. 2.jinfo :查看Java进程的运行时信息. 3.jmap + MAT :通 ...

  8. Linux下Java性能监控

    Linux下Java性能监控 一.JVM堆内存使用监控 获取thread dump的3种方法: 1)使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun. ...

  9. Java性能监控

    Java性能监控 上次介绍了如何使用jvisualvm监控java,今天做进一步讲解!Java性能监控主要关注CPU.内存和线程. 在线程页中,点击线程Dump,可以生成threaddump日志,通过 ...

随机推荐

  1. 123.Best Time to Buy and Sell Stock III---dp

    题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ 题目大意:与122题类似,只是这 ...

  2. 部署weblogic 12c的几点收获

    最近刚编写完weblogic12c的部署脚本,这里将过程中的几点收获进行记录: 1.windows下编写的脚本在linux环境下运行需要dos2unix进行格式转换 2.weblogic安装环境检测需 ...

  3. Linux Supervisor的安装与使用入门---SuSE

    Linux Supervisor的安装与使用入门 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事 ...

  4. Effective C++学习进阶版

    记得前段时间又一次拿起<Effective C++>的时候,有种豁然开朗的感觉,所以翻出了我第一遍读时做的笔记.只做参考以及查阅之用.如有需要请参阅<Effective C++> ...

  5. Jenkins+Ant+SVN+Jmeter实现持续集成

     一.什么是持续集成? 待补充 二.说明: 本次框架介绍中不涉及到介绍框架的构建过程,介绍如何构建环境详细的构建见前篇文章: jmeter+Jenkins持续集成(邮件通知) Jmeter+Jenki ...

  6. [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器

    发布日期:2008.11.2 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 今天Artech兄在<关于Type Init ...

  7. JavaScript“并非”一切皆对象

    上一篇:<函数声明和函数表达式--函数声明和函数表达式的异同> p{font-size:14px; } 写在前面 网上非常多都在说"JavaScript一切皆对象",那 ...

  8. Linux性能工具

    Brendan Gregg 目前是 Netflix 的高级性能架构师 ,他在那里做大规模计算机性能设计.分析和调优.他是<Systems Performance>等技术书的作者,因在系统管 ...

  9. 移动端禁止图片长按和vivo手机点击img标签放大图片,禁止长按识别二维码或保存图片【转载】

    移动端禁止图片长按和vivo手机点击img标签放大图片,禁止长按识别二维码或保存图片 img{ pointer-events: none; } 源文地址:https://www.cnblogs.com ...

  10. 转:VMMAP内存查看工具

    转:http://blog.csdn.net/woddle/article/details/45337767 下面我根据VMMap来详细介绍一下内存的分类. 内存是一个很复杂的系统,其中的paging ...