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

Jakarta ee 如何在Oracle JRE中跟踪方法System.gc(),jakarta-ee,garbage-collection,Jakarta Ee,Garbage Collection,我知道有一个应用程序正在执行显式GC调用:System.GC()或Runtime.GC()。我已经通过使用-XX:+DisableExplicitGC禁用显式地面军事系统验证了这一点,完整的地面军事系统将消失 我已经检查了代码,似乎没有在任何地方找到System.gc()或Runtime.gc()调用。这是一个大项目,所以我可能错过了它,或者它正在某个图书馆被调用 我知道使用IBMJRE可以在方法上运行 例如: -Xtrace:trigger=method{java/lang/System.gc

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

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

我知道使用IBMJRE可以在方法上运行

例如:

-Xtrace:trigger=method{java/lang/System.gc,javadump}
是否可以对Oracle JRE执行同样的操作,以帮助找到调用它的位置?我无法在带有断点的调试模式下运行此操作:(


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

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

您可以:

  • 使用例如jProfiler评测应用程序,然后您可以搜索收集的跟踪以找到
    System.gc()
    调用
  • 在预期发生完全GC时收集线程转储,这可能会显示触发系统GC的堆栈跟踪

哪个操作系统正在运行JVM?