JNI全局引用与JFrame.dispose()方法

问题描述

用 jProfiler 分析 Java swing 程序中的内存泄漏问题时, 我发现内存中 JFrame 实例的数量一直在增加。

各个 frame 被打开(opened),然后被关闭(closed)。

通过 jProfiler, 并查看GC Root时, 只找到一项: ‘JNI Global reference’。

这是什么意思? 为什么他 hang 住了所有的 frame 实例?

回答1

请查看《维基百科》中关于 Java本地接口 的介绍, 本质上它允许 Java程序 和系统库之间进行通信。

JNI全局引用很容易造成内存泄漏, 因为它们不能被自动垃圾收集所清理, 程序员必须显式地释放它们. 如果你没有编写任何JNI代码, 那么狠可能是使用的库中存在内存泄漏。

修正: 请参考关于 local vs. global references 的更多信息. 其中介绍了为什么要使用全局引用(以及如何进行释放)。

回答2

JNI全局引用(JNI global reference), 是从 “native” 代码指向堆内存中Java对象的引用. 其存在的目的是阻止垃圾收集器, 不要误将 native 代码中仍在使用的对象给回收了, 假如这些Java对象没有Java代码引用到他们的话。

一个 JFrame 实例就是一个窗口(java

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值