【问题标题】:How to know if the JVM is currently doing GC ?如何知道JVM当前是否在做GC?
【发布时间】:2018-06-25 11:29:14
【问题描述】:

我有一个用例,如果服务的 JVM 当前正在执行 GC,我需要停止将请求发送到 java restful 服务。如何/哪个 API 可以帮助我找到这个?

【问题讨论】:

  • 你为什么要这样做?
  • 您可以通过一个简单的请求 ping 服务,如果它没有响应,则说明它很忙。如果您想预测性地执行此操作,您可以让服务流向负载均衡器发送心跳,如果暂停,则假设它很忙。
  • 是的,我同意这行得通。但是我正在探索是否可以找到一种更清洁的方法,例如我的 JMX/监控代理可以告诉我的负载均衡器 JVM 将开始其 GC。所以在我说完成之前不要发送任何请求。
  • 如果 stop-the-world GC 正在进行 - 那么 JMX 或任何其他 Java API 将无法工作,因为它也会受到 GC 的影响。如果一个并发 GC 正在进行 - 你不应该关心,因为应用程序仍然能够响应。
  • 这只是 check-then-act 反模式的另一个应用。在您检测到目前没有垃圾收集后,是什么阻止了垃圾收集在您开始提交请求时立即开始?

标签: java garbage-collection jvm load-balancing


【解决方案1】:

监控 GC 的方式有很多种,唯一不同的是 GC 操作信息的显示方式。 GC是由JVM完成的,由于GC监控工具会公开JVM提供的GC信息,所以无论你怎么监控GC都会得到相同的结果。

根据访问接口的不同,GC监控方式可以分为CUIGUI。典型的 CUI GC 监控方法包括使用名为“jstat”的单独 CUI 应用程序,或者在运行 JVM 时选择名为“verbosegc”的 JVM 选项。

jstat 是 HotSpot JVM 中的一个监控工具。 HotSpot JVM 的其他监控工具是 jps 和 jstatd。有时,您需要全部三个工具来监控 Java 应用程序。

-verbosegc 是运行 Java 应用程序时指定的 JVM 选项之一。虽然 jstat 可以监控任何未指定任何选项的 JVM 应用程序,但需要在开头指定 -verbosegc,因此可以将其视为不必要的选项(因为可以使用 jstat 代替)。

【讨论】:

    【解决方案2】:

    您可能可以通过使用 visualVM 及其 API 来做到这一点。 visual vm是GC过程的可视化。但它也有自己的 API。 Visual VM

    【讨论】:

    • 很抱歉你能详细说明一下,因为当你说 VisualVm 有自己的 API 时听起来很有趣。据我所知,我认为作为客户端的 VisualVM 基本上使用 JMX 及其 MBean 来获取其信息,我想是通过池化。但是,当发生重大 GC 时,第三个应用程序/客户端如何使用它来做某事?参考任何文章也很有用。
    • 我看到他们有自己的 API,您需要搜索它。我还没试过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2019-09-21
    相关资源
    最近更新 更多