我们可以使用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. 数据库与sql注入的相关知识

    数据库与sql注入的相关知识 sql语句明显是针对数据库的一种操作,既然想通过sql注入的方法来拿取数据那么就要先了解一下如何的去操作数据库,这方面并不需要对数据库有多么的精通但是如果了解掌握了其中的 ...

  2. linux下的僵尸进程处理SIGCHLD信号【转】

    转自:http://www.cnblogs.com/wuchanming/p/4020463.html 什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打 ...

  3. Mac OS X 编译android内核 error: elf.h: No such file or directory 的解决方法

    1. 从网上下个elf.h放到scripts/mod/文件夹(http://www.rockbox.org/tracker/9006?getfile=16683) 2. 修改两个文件mk_elfcon ...

  4. C中常用格式格式码

    一.常用printf格式码 二.常用scanf格式码

  5. 用js实现图片连播和联级菜单的实现

    <!DOCTYPE html> <html> <head> <title>图片轮播</title> <style> div{ b ...

  6. Linux下var目录介绍

    var目录 /var 包括系统运行时要改变的数据.其中包括每个系统是特定的,即不能够与其他计算机共享的目录,如/var/log,/var/lock,/var/run.有些目录还是可以与其他系统共享,如 ...

  7. CNN基础

    CNN一般结构 卷积层作用: 1) 提取不同维度的特征,组合不同维度特征,其本质是卷积核,因此,学习一个有效的总卷积核是训练卷积层主要工作 2)寻找不同位置,不同大小的特征 3) 根据卷积核参数计算上 ...

  8. [转载]DirectX SDK (June 2010)安装错误S1023,解决方法

    导致这个错误的原因是在安装DirectX SDK (June 2010)之前.我就安装了VS2010 . 所以也就安装了: Microsoft Visual C++ 2010 x86 Redistri ...

  9. sharepoint2013搜索

    参考http://www.cnblogs.com/jianyus/p/3272692.html 最小权限http://www.cnblogs.com/awpatp/archive/2011/08/16 ...

  10. Linux下进程信息/proc/pid/status的深入分析

    https://blog.csdn.net/beckdon/article/details/48491909