美国上市公司,专注Java培训22年

JVM日志如何进行安全点分析


JVM的日志分析是对Java应用运行监控调试的关键依据,以最小的垃圾回收导致暂停时间获得最大吞吐量,针对不同应用类型有不同的目标,本文达内java培训(java.tedu.cn)专家为大家介绍通过JVM日志进行安全点分析的方式,希望对大家有帮助。

许多事件都可能会导致JVM暂停所有的应用线程。这类暂停又被称为"stop-the-world"(STW)暂停。触发STW暂停最常见的原因就是垃圾回收了(github中的一个例子),但不同的JIT活动(例子),偏向锁擦除(例子),特定的JVMTI操作,以及许多场景也可能会导致应用程序暂停。

应用程序线程可以被安全地停止掉的那个时间点,就叫做安全点。这一术语也通常用来指代SWT暂停。

通常来讲GC日志都是打开的。然而,并非所有安全点的信息都能完整地记录下来。想获取到完整的日志,可以使用下列的JVM选项:

-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

从参数名字来看你可能会觉得是与GC相关的,其实不然——打开这些选项能够记录下所有的安全点,而不止是GC暂停的。如果你用上述的选项来运行下这个例子(github源码)

你会在标准输出中看到如下信息:

Application time: 0.3440086 seconds

Total time for which application threads were stopped: 0.0620105 seconds

Application time: 0.2100691 seconds

Total time for which application threads were stopped: 0.0890223 seconds

很通俗易懂(和GC日志相比来说)——从中你可以得知应用程序在前344毫秒中是在处理实际工作的,然后将所有线程暂停了62毫秒,紧接着又工作了210ms,然后又暂停了89ms。

你还可以将这些选项与GC的选项结合起来使用,比如将上面这个程序加上-XX:+PrintGCDetails选项后再运行一次,输出则变成这样了;

[Full GC (Ergonomics) [PSYoungGen: 1375253K->0K(1387008K)] [ParOldGen: 2796146K->2049K(1784832K)] 4171400K->2049K(3171840K), [Metaspace: 3134K->3134K(1056768K)], 0.0571841 secs] [Times: user=0.02 sys=0.04, real=0.06 secs]

Total time for which application threads were stopped: 0.0572646 seconds, Stopping threads took: 0.0000088 seconds

综上可知,应用线程被强制暂停了57ms来进行垃圾回收。其中又有8ms是用来等待所有的应用线程都到达安全点。如果我们用同样的选项运行另一个例子(Github源码)的话,输出又变成这样的了:

Total time for which application threads were stopped: 0.0001273 seconds, Stopping threads took: 0.0000196 seconds

Total time for which application threads were stopped: 0.0000648 seconds, Stopping threads took: 0.0000174 seconds

光从这些信息我们无从得知是什么导致的暂停,因为看不出有任何的垃圾回收的活动。如果你想更详细地了解安全点的信息的话,可以使用这组JVM参数:

-XX:+PrintSafepointStatistics  -XX:PrintSafepointStatisticsCount=1

启用这些参数使得JVM会将一些额外的信息记录到标准输出中,大概类似这样:

5.141: RevokeBias                       [      13          0              2    ]      [     0     0     0     0     0    ]  0  

Total time for which application threads were stopped: 0.0000782 seconds, Stopping threads took: 0.0000269 seconds

关于安全点的信息是按照如下的顺序进行显示的:

JVM启动之后所经历的毫秒数(上例中是5.141)

触发这次暂停的操作名(RevokeBias)。 如果你看见"no vm operation",就说明这是一个"保证安全点"。JVM默认每秒会触发一次安全点来处理那些非紧急的排队的操作。GuaranteedSafepointInterval选项可以用来调整这一行为(设置为0的话就会禁用该功能)

停在安全点的线程的数量(13)

在安全点开始时仍在运行的线程的数量(0)

虚拟机操作开始执行前仍处于阻塞状态的线程的数量(2)

到达安全点时的各个阶段以及执行操作所花的时间(0)

因此我们可以看出,使用了偏向锁会导致大量的STW暂停,尽管它们只花了几十毫秒。在如今这个大量使用并发的年代,禁用它们也不是什么罕见的事情。

达内java培训(java.tedu.cn)专家认为,不管怎样,多打印些日志总会减少一些麻烦事的。你可以使用如下的JVM参数:

-XX:+LogVMOutput -XX:LogFile=vm.log


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • eclipse怎么建立Java项目?
    eclipse怎么建立Java项目?
    eclipse怎么建立Java项目?在使用Eclipse建立Java项目时,可以遵循以下步骤: 详情>>

    2024-05-10

  • Java关键词汇总-Java关键字有哪些及其作用?
    Java关键词汇总-Java关键字有哪些及其作用?
    Java关键词汇总-Java关键字有哪些及其作用?Java语言中的关键字(Keywords)是Java编程语言的核心组成部分,它们具有特定的意义,并被用于表示基本数据类型、控制语句、访问权限等。Java关键字总数大约有50个左右,下面列出了一些常用的Java关键字及其作用: 详情>>

    2024-04-08

  • Java编程工具用哪个最好
    Java编程工具用哪个最好
    Java编程工具用哪个最好?Java编程工具的选择取决于个人的偏好、项目需求和开发环境。以下是一些常用的Java编程工具: 详情>>

    2024-04-03

  • 好用的Java编写软件
    好用的Java编写软件
    Java是一种广泛使用的编程语言,因其跨平台、安全性和稳定性而受到许多开发者的喜爱。Java被用于开发各种类型的软件,从桌面应用程序到企业级服务器端应用程序。以下是一些常见的、用Java编写的软件示例: 详情>>

    2024-04-02

  • Java开班时间

    收起