如何知道JVM当前是否正在进行垃圾回收?

5

我有一个使用场景,需要在Java Restful服务的JVM执行GC时停止发送请求。如何/哪个API可以帮助我找到这个信息?


2
为什么你要那样做? - Shanu Gupta
3
您可以使用简单的请求对服务进行ping,如果没有回应,则表示它正在忙碌。如果您想进行预测,可以让服务向负载均衡器流式传输心跳,并且如果暂停,则假定该服务正在忙碌。 - Peter Lawrey
是的,我同意那个方法可以行得通。但是我正在探索是否能找到更简洁的方法,比如我的JMX/监控代理可以告诉我的负载均衡器JVM将要启动GC。因此,在我说完成之前,请不要发送任何请求。 - Oceanvijai
3
如果正在进行“停顿式垃圾回收(GC)”,那么JMX或任何其他Java API将无法工作,因为它也会受到GC的影响。如果正在进行“并发式GC”,则你不需要担心,因为应用程序仍然能够响应。 - apangin
1
这只是检查-执行反模式的另一个应用。在您检测到当前没有垃圾收集之后,什么阻止垃圾收集在您开始提交请求时立即启动? - Holger
显示剩余2条评论
2个回答

2
有不同的方式来监视GC,但唯一的区别在于GC操作信息如何显示。GC由JVM完成,由于GC监视工具公开由JVM提供的GC信息,因此无论如何监视GC,您都将获得相同的结果。
GC监视方法可以根据访问接口分为CUI和GUI。典型的CUI GC监视方法涉及使用名为“jstat”的单独CUI应用程序,或在运行JVM时选择称为“verbosegc”的JVM选项。
jstat是HotSpot JVM中的监视工具。其他HotSpot JVM的监视工具包括jps和jstatd。有时,您需要使用这三个工具来监视Java应用程序。
-verbosegc是运行Java应用程序时指定的JVM选项之一。虽然jstat可以监视未指定任何选项的任何JVM应用程序,但-verbosegc需要在开始时指定,因此可以视为不必要的选项(因为可以使用jstat代替)。

0

你可以使用VisualVM及其API来完成这个任务。VisualVM是GC过程的可视化工具,但它也有自己的API。 Visual VM


很抱歉,您能否详细说明一下,因为当您说VisualVm有自己的API时,听起来很有趣。根据我的了解,我认为VisualVM基本上是一个客户端,使用JMX和其MBeans来获取信息,通过轮询实现。但是,当发生例如Major GC时,第三方应用/客户端如何利用它来执行某些操作呢?如果有任何文章参考,也将非常有用。 - Oceanvijai
我看到他们有自己的API你需要去搜索它。我还没有尝试过。 - Juliyanage Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接