如何在Oracle JRE中跟踪System.gc()方法



我知道有一个应用程序正在执行显式GC调用:System.gc()Runtime.gc()。我已经通过使用-XX:+DisableExplicitGC禁用显式gc来验证这一点,并且完整的gc消失了。

我已经检查了代码,似乎没有找到System.gc()Runtime.gc()调用任何地方。这是一个很大的项目,所以有可能我错过了它,或者它正在某个库中被调用。

我知道在IBM JRE中可以对方法运行跟踪。

的例子:

-Xtrace:trigger=method{java/lang/System.gc,javadump}

是否有可能对Oracle JRE做同样的事情来帮助找到它被调用的位置?我无法在带有断点的调试模式下运行此程序。(

而且,我知道这不是NIO或RMI进行这些GC调用。

您可以尝试使用AOP为这些方法定义一个@Before切入点,然后创建一个Exception对象并抛出它或记录/邮寄它的堆栈跟踪。注意,你可以检查stacktrace,只在相关的情况下采取行动(例如,在本地进行一些实验,以找出"正常的"非显式stacktrace可能是什么样子)。

你可以:

  • 使用jProfiler来配置应用程序,然后你可以通过收集的跟踪来搜索System.gc()调用。
  • 在预期发生完整GC时收集线程转储,这可以向您显示触发系统GC的堆栈跟踪。

最新更新