gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:52:01 25 4
gpt4 key购买 nike

我希望我的问题有更多背景信息,但不幸的是,我出于绝望而发布了这个问题。我无法用较小的应用程序重现此内容,因为我希望我可以将其发布在这里。不幸的是,我所能做的就是尝试解释我的症状,并希望有人看到类似的情况。

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

虽然我有一个理论,但它不是基于我读过的任何内容,但我感觉终结器线程被阻塞。不幸的是,我没有线程转储来证明这一点。我的理论是,我的 jpanel 已排队等待垃圾收集,但是,一旦它进入队列,队列本身就无法处理它。

有人愿意分享他们的理论或直觉吗?由于我无法在我的机器上重现这一点,因此我在分析这个理论方面有点受限。不过,如果有人愿意给我另一条调查路线,我将不胜感激。

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

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

最佳答案

假设Java Native Interface代码不是您自己的,您可能需要 dispose()错误的图形上下文 "if it was created directly from a component or another Graphics object."这个RotatableImage是一个没有 dispose() 就会泄漏的示例.

关于java - JNI 全局引用持有的 JPanel 导致 OOM 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4348316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com