android - GREF 在多线程服务 (aidl) 中增加/减少 - 这是什么意思?

标签 android multithreading service ipc aidl

我有一个 android Activity 和一个使用 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 和垃圾收集的影响。

最佳答案

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

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

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

关于android - GREF 在多线程服务 (aidl) 中增加/减少 - 这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3499061/

相关文章:

java - 我如何从android中的数组内容值中获取(键,值)

android - Android 的同时定位和映射

Java线程循环卡住程序

c++ - 安全地同步 COM 线程

node.js - 在 NodeJS 中获取所有 Linux 系统服务的最佳方式?

java - android以编程方式从字符串更改背景图像

java - 如何导入第三方库

c# - 将Form.Owner设置为来自其他线程的表单

android - Activity 管理器崩溃

json - 如何将 Swift 对象转换为字典