7

我有一个 android 活动和一个使用aidl 实现的服务。像冠军一样工作,我有一个回调设置将一些线程通知传递回 UI,这似乎工作正常,除了很多

GREF 已增加到 101、201,301,401、501.. 等,而 GREF 已减少。我在网上做了一些搜索,发现它必须使用全局参考。

08-17 02:31:19.735: DEBUG/dalvikvm(2558): GREF has increased to 301
...
08-17 02:31:25.823: DEBUG/dalvikvm(2558): GREF has increased to 401
...
08-17 02:31:36.772: DEBUG/dalvikvm(2558): GREF has increased to 501
...
08-17 02:31:42.694: DEBUG/dalvikvm(2558): GREF has increased to 601
...
08-17 02:31:48.695: DEBUG/dalvikvm(2558): GREF has increased to 701
... 
08-17 02:31:59.883: DEBUG/dalvikvm(2558): GREF has decreased to 599
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 499
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 399
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 299
08-17 02:31:59.912: DEBUG/dalvikvm(2558): GREF has decreased to 199

我做了一些搜索,发现大多数关于此的评论都相当陈旧。我担心的是我正在正确地实现我的客户端/服务,并且想知道如何追踪导致 GREF 增加的原因。欢迎任何想法/建议。谢谢!

基本程序流程

Client -> Creates Callback
Client -> Starts Service
Service -> Inits & Starts CountDownTimer
Service.CountDownTimer.onFinish() -> DownloadAndParse()
DownloadAndParse() -> initialize new saxRequest(), new Handler for this request.
Service.Handler->beginBroadcast()
Client.CallbackStub -> updateUI()
Client.CallbackStub -> service.startCountDownTimer()

希望这是有道理的。我会在这里发布代码,但是在这么多不同的文件中有这么多。我想我会尝试将流程向上看是否有任何明显的东西......我唯一能看到的可能是重新使用 saxRequest() 而不是创建一个新实例......我现在实际上会尝试,但我真的很想知道 GREF 和垃圾收集的影响。

4

1 回答 1

18

这些是 JNI 全局引用。如果您不编写本机代码,则无法直接控制它们。启用 CheckJNI 时会显示日志消息,工程构建和模拟器默认启用。

这些消息只是意味着本机代码告诉 VM 不允许丢弃某些对象。本质上,全局引用是原生代码添加对 GC 根集的引用的一种方式。假设本机代码编写正确,当本机代码不再需要全局 refs 时,它们将被清除。

唯一令人担忧的原因是全局引用计数是否继续攀升,因为这表明全局引用泄漏。由于 VM 无法释放对象,全局 ref 泄漏最终会导致 VM 内存不足。为了帮助识别此类问题,启用 CheckJNI 时对全局引用的数量设置了上限(当前限制为 2000)。

于 2010-08-17T21:43:52.220 回答