繁体   English   中英

JNI全局引用持有的JPanel导致OOM异常

[英]JPanel held by JNI Global reference causing OOM Exceptions

我希望我对这个问题有更多的了解,但是不幸的是,我出于绝望地发布了这个问题。 我无法使用较小的应用程序重现此内容,因为我希望可以在此处发布。 不幸的是,我所能做的就是尝试解释我的症状,并希望外面有人看到过类似的东西。

我有一个纯Java应用程序,它在某些客户端计算机上会出现OutOfMemoryExceptions。 我提供了400mb的Java堆空间,但是不幸的是,我们仍然看到这个问题。 在崩溃之前从我的应用程序中获取堆转储,我可以看到有异常多的JPanel对象。 查看堆转储,有趣的是,面板的唯一传入引用是“ JNI全局引用”。 让我感到困惑的是,为什么首先会有JNI全局引用JPanel? 我只有一个框架。 在什么情况下,java需要创建对JPanel的全局JNI引用?

尽管我有一个理论,但它并不是基于我所读的任何东西,但是我感觉到终结器线程被阻塞了。 不幸的是,我没有线程转储来证明这一点。 我的理论是,我的jpanel被排入队列以进行垃圾收集,但是,一旦它进入队列,队列本身就无法处理它。

有没有人愿意分享他们的理论或内心的直觉? 由于我无法在计算机上重现此信息,因此在分析此理论时我有些束手无策。 但是,如果有人愿意给我另一条调查路线,我将不胜感激。

编辑:我对此有一个小更新。 我的应用程序还使用了拖放操作,并进一步分析了堆转储,我注意到有许多java.awt.datatransfer.Transferable对象(将我的JPanel传递为transferable的一部分),因为有些JPanels并没有被清理了。 有趣的是,对Transferable对象的唯一引用还是JNI Global。 这让我想知道终结器是否在清理JPanels时不会被阻塞,而在清理拖放式可移动对象时是否被阻塞。

编辑:因此,如果有人感兴趣,我相信我已经确定了问题。 因此,我在原始文章中遗漏的是应用程序使用Windows IE COM库(使用某些第三方库)嵌入HTML页面。 无论如何,事实证明,在发生拖放时,第三方库或IE COM库本身都将获取JNI全局引用。 不幸的是,我没有解决此问题的方法,但是我想感谢所有在调查此问题时向我发送建议的人员。

假设Java本机接口代码不是您自己的,则可能需要dispose()一个错误的图形上下文( 如果它是直接从组件或另一个Graphics对象创建的)。 这个RotatableImage是一个示例,如果没有dispose() ,它将泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM