在运行时开启GC日志

关于GC的一些参数
-verbose.gc开关可显示GC的操作内容。打开它,可以显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等

打开-xx:+ PrintGCDetails开关,可以详细了解GC中的变化。

打开-XX: + PrintGCTimeStamps开关,可以了解这些垃圾收集发生的时间,自JVM启动以后以秒计量。最后,

通过-xx: + PrintHeapAtGC开关了解堆的更详细的信息。

为了了解新域的情况,可以通过-XX:=PrintTenuringDistribution开关了解获得使用期的对象权。

其中 PrintGCTimeStamps比较重要 可以使用下面的办法开启

 

root@Server:/# jps
7638 Jps
31820 Jstatd
3910 Bootstrap

root@Server:/# jinfo -flag +PrintGCDetails 3910

root@Server:/# jinfo -flag +PrintGC 3910
root@Server:/# jinfo -flag +PrintGCTimeStamps  3910

 

如果使用tomcat 生成日志在对应的 tomcat/logs 文件夹下面 就和普通的tomcat 日志一样

eg 

494325.929: [GC494325.929: [DefNew: 288620K->8249K(314560K), 0.0205520 secs] 419294K->139080K(1013632K), 0.0207500 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 

 

 

以下转载

我们经常会遇到JVM运行时出错的情况。若能在启动时加入一些启动选项(startup option),便可以获取与bug相关的重要线索,从而有希望根治它们。但在实际操作时,我们总是忘记添加-XX:+HeapDumpOnOutOfMemoryError 或 -XX:+PrintGCDetails这样必要的flag。

每当面对如此窘境,我们只能关闭JVM,修改启动参数(startup parameter),然后默默祈祷,希望问题场景(problematic situation)能在重启之后得以重现。这种方法偶尔奏效,在场景重现后你或许还能收集到足够的证据,以便动手根治潜在的问题。

不难看出,前文所述的方法问题显著——你必须执行一次额外的重启才能加入那烦人的debug选项,而不能借助中断(outage)实现。事实上,JDK bundle提供了一种可行的变通方案,如果将之收入麾下,偶尔还能从中获益。

jinfo

在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:

1

2

3

4

5

6

7

8

9

10

11

my-precious me$ java -XX:+PrintFlagsFinal -version|grepmanageable

     intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}

     intx CMSWaitDuration                           = 2000                                {manageable}

     bool HeapDumpAfterFullGC                       = false                              {manageable}

     bool HeapDumpBeforeFullGC                      = false                              {manageable}

     bool HeapDumpOnOutOfMemoryError                = false                              {manageable}

     ...cutfor brevity ...

     bool PrintGC                                   = false                              {manageable}

     bool PrintGCDateStamps                         = false                              {manageable}

     bool PrintGCDetails                            = false                              {manageable}

     bool PrintGCTimeStamps                         = false                              {manageable}

通过选项-XX:+PrintFlagsFinal可以列出所有的JVM flag,而其中的标注为manageable 的flag则是值得我们关注的部分。这些flag可通过JDK management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。

如何使用jinfo

让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:

1

2

3

4

5

6

7

my-precious me$ jps

12278 HighAllocationRate

12279 Jps

12269 JConsole

my-precious me$ jinfo -flag +PrintGCDetails 12278

my-precious me$ jinfo -flag +PrintGC 12278

my-precious me$

在jinfo中需要打开-XX:+PrintGC和 -XX:+PrintGCDetails两个选项才能开启GC日志,这与用命令行参数的方式实现有着细微的差别——如果你通过启动脚本(startup script)来设置参数,仅需-XX:+PrintGCDetails即可,因为-XX:+PrintGC会被自动打开。

不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:

1

2

3

4

5

...

[GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs] [Times: user=0.74 sys=0.00, real=0.22 secs]

...

[GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs] [Times: user=0.82 sys=0.01, real=0.25 secs]

...

同理,若想关闭GC日志功能,只需要执行jinfo -flag -PrintGCDetails 12278和 jinfo -flag -PrintGC 12278命令即可。

在我看来,学会使用jinfo,只能让你在故障排除的工作中少花一到两天的时间。若打一开始就使用Plumbr这类性能监控工具,你可能从未有过这样的烦恼。

原文链接: JavaCodeGeeks 翻译: ImportNew.com elviskang
译文链接: http://www.importnew.com/15722.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值