为什么 JNI Global 引用有最大数量限制?

YXP*_*YXP 3 java-native-interface android

众所周知,JNI是Java和C++之间的桥梁。最近我正在编写一个Java项目,它的主要模块是基于C++的,需要存储大量的GlobalReference. 而且会随着活动的开展而增加。因此最大数量(65535)成为GlobalReferences一个严重的问题,我必须使用特殊的方法来解决这个问题。

所以我很感兴趣为什么有限制GlobalReferences正如其他人所说,它只是为了检测内存泄漏吗?

Ale*_*ohn 5

回答“为什么”这个问题很容易。Android JVM(无论是 Dalvik 还是 ART)中的全局引用表的条目数量有限,因为其架构师认为不会有人需要更多条目。

他们有不同的限制需要担心:内存限制、性能、稳定性、维护工作。

但毕竟,这更多的是一个反问,其答案并不像实际建议那么重要。如下:

  • Android JVM 中引用表的限制仍然存在。不要指望这些表在下一个 Android 版本中会变得更大(但也许其中一些会变得更大)

  • 无论 Android 的未来版本发生什么,当前版本都将保留。数百万人仍在使用搭载 2010 年发布的Gingerbread 的 Android 设备(占 20 亿人的 0.6%)。截至目前,超过 20% 的用户在其设备上安装了 Dalvik JVM。

  • 如果您达到或接近内部 JVM 表的限制,则必须重新考虑您的体系结构。当这些表溢出时,您不能信任系统的行为,即使这种情况不是每次都会发生。

  • 请记住,您的应用程序可用的内存也是有限的,您使用的内存越多,您的应用程序在多任务环境中遭受性能影响的可能性就越大:如果其他应用程序需要内存,内核可以随时杀死它。

  • 如果在 Java 端聚合对象,则可以避免表溢出。例如,您可以将它们放入 Java 映射或数组中,并在 C++ 中保留对集合的全局引用,而不是保留对数千个对象的全局引用。您可以使用 JNI 访问Map.put()Map.remove来管理 C++ 中的集合。