我知道有一个应用程序正在执行显式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的堆栈跟踪。