【问题标题】:Howto print java class garbage collection events?如何打印java类垃圾收集事件?
【发布时间】:2010-10-09 02:34:15
【问题描述】:
java版本“1.5.0_14” Java(TM) 2 运行时环境,标准版(内部版本 1.5.0_14-b03) Java HotSpot(TM) 服务器虚拟机(内部版本 1.5.0_14-b03,混合模式)

我正在尝试调试一个 NullPointerException,因为我将引用传递给静态定义的字段。更具体地说,我在 Drools3 工作内存实例上设置了一个全局变量。

workingMemory.setGlobal("log", workingMemorieslog);

我的假设是静态定义字段的类正在被垃圾收集。 (接收类肯定是用了 WeakReference 之类的,我不太清楚)

您建议如何调试它? 我认为,如果我能准确地知道 JVM 的 GC 何时卸载类/类的实例,那么我可以缩小错误行为的原因。 (如果不是事件的确切时间,至少可以表明确实发生了某些事情)。

谢谢你, 马克西姆。

【问题讨论】:

  • 好问题,好后续,你自己的好答案。对问题和答案都 +1。

标签: java eclipse classpath


【解决方案1】:

你有堆栈跟踪吗?

您是否尝试过进入“setGlobal”方法(假设您有代码)以查看发生了什么?

【讨论】:

    【解决方案2】:

    要跟踪 GC 活动,请将其添加到 java 命令:

    -详细:gc -XX:+PrintGCTimeStamps -XX:+PrintGC详情

    你得到的 NPE 可能是你传递了 null 值。

    【讨论】:

    • 感谢您的回答,我已经在使用 -XX:+PrintGCDetails -verbose:gc -Xnoclassgc 运行,但仍然看不到类加载/卸载信息。我唯一的输出是这样的行:[GC [PSYoungGen: 4096K->630K(4736K)] 4096K->790K(48064K), 0.0032750 secs]
    • 因为这个答案最适合问题的初始主题,所以我接受它作为答案。谢谢。
    • -XX:+PrintGCTimeStamps 在最新的 Java 版本中不再可用。有关详细信息和替换,请参阅 this SO answer。
    【解决方案3】:

    为什么不将类保存在内存中,然后看看它是否仍然发生,如果是,那么你的问题出在其他地方。如果不是,那么您就知道问题出在垃圾收集上。

    【讨论】:

      【解决方案4】:

      事实证明,日食是这里的主要问题。

      我会解释:

      为了测试性能,我将我们的 webapp 封装在 main() 方法中。我们使用了大量的 3rd 方代码,即 Apache commons-pool。

      事实证明,我们有多个版本的 jar 分布在项目(eclipse 项目)中。我使用这些项目的应用程序有 commons-pool-1.3,另一个项目有 commons-pool-1.2。

      当使用 servlet 容器 (Tomcat6) 加载时,webapp 类加载器具有第一优先级,因此它始终加载 webapp 版本。当我使用 main() eclipse 启动应用程序时,将依赖的项目 jars 导出到当前项目中的 -classpath 中并不是很明智的行为。

      冲突发生在 2 个版本的 commons-pool 之间,这导致了未定义的行为 - 在对象借用时,有时决定创建一个新对象。我没有查看实现代码,我认为这与 GenericKeyedObjectPool (有问题的类)持有的静态映射有关。因为创建了一个新实例,所以它确实包含对上述全局的空引用。

      我的运气解决方案相当简单,commons-pool 仅由我的 web 应用程序使用,因此我可以从所有引用的项目中删除它,否则我想我会尝试将它们全部升级到一个版本。如果我不能做任何一个,我真的不知道我会做什么。这是 eclipse 的一个非常奇怪的默认设置。

      感谢您的阅读和帮助。

      // ps。 3天。那是我花时间来理解我在 servlet 替换代码中到底做错了什么。原来我什至不是问题。 :P

      【讨论】:

      • 仅供参考:如果您有奇怪的对象引用问题,请尝试记录 ProblemClass.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm() 这将返回加载类的 jar 或类文件。在调试 Web 应用程序时,这是一个非常宝贵的技巧,它通常会遇到非确定性类加载器问题。
      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 2016-08-16
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2011-01-26
      • 2014-05-13
      • 1970-01-01
      相关资源
      最近更新 更多