Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何打印java类垃圾收集事件?_Java_Eclipse_Classpath - Fatal编程技术网

如何打印java类垃圾收集事件?

如何打印java类垃圾收集事件?,java,eclipse,classpath,Java,Eclipse,Classpath,我的假设是静态定义字段的类正在被垃圾收集。(接收类必须使用WeakReference或类似的东西,我真的不知道) 您建议如何调试这个? 我认为,如果我能够确切地知道JVM的GC何时卸载一个类/一个类的实例,那么我就可以缩小错误行为的原因。(如果不是事件发生的确切时间,至少要有发生事件的迹象) 谢谢,, Maxim.您有堆栈跟踪吗 您是否尝试进入“setGlobal”方法(假设您有代码)以查看发生了什么?要跟踪GC活动,请将此添加到java命令: -详细:gc -XX:+PrintGCTimeSt

我的假设是静态定义字段的类正在被垃圾收集。(接收类必须使用WeakReference或类似的东西,我真的不知道)

您建议如何调试这个? 我认为,如果我能够确切地知道JVM的GC何时卸载一个类/一个类的实例,那么我就可以缩小错误行为的原因。(如果不是事件发生的确切时间,至少要有发生事件的迹象)

谢谢,,
Maxim.

您有堆栈跟踪吗


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

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

-详细:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails


您得到的NPE可能是您传递的空值。

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

事实证明eclipse是这里的主要问题

我会解释:

为了测试性能,我将我们的webapp包装在main()方法中。我们使用了很多第三方代码,即ApacheCommons池

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

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

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

解决我运气问题的方法很简单,commons pool仅由我的webapp使用,因此我可以从所有引用的项目中删除它,否则我想我会尝试将它们全部升级到单个版本。如果我也做不到,我真的不知道我会做什么。这是eclipse的一个非常奇怪的默认值

谢谢你的阅读和帮助


//附言3天。这就是我花时间去理解我在servlet替换代码中到底做错了什么。事实证明我根本不是问题所在P

感谢您的回答,我已经使用-XX:+PrintGCDetails-verbose:gc-Xnoclassgc运行了,但是我仍然没有看到类加载/卸载信息。唯一的输出是[GC[PSYoungGen:4096K->630K(4736K)]4096K->790K(48064K),0.0032750秒]这样的行,因为这个答案最适合问题的初始主题,我接受它作为答案。谢谢。好问题,好跟进,好回答+仅供参考:如果您有奇怪的对象引用问题,请尝试记录
ProblemClass.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm()
这将返回加载类的jar或类文件。在调试web应用程序时,这是一个非常宝贵的技巧,web应用程序经常遇到不确定的类加载器问题。 java version "1.5.0_14" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03) Java HotSpot(TM) Server VM (build 1.5.0_14-b03, mixed mode)
workingMemory.setGlobal("log", workingMemorieslog);