在支持固定从本机代码访问的Java对象看来,Android使用的是GetByteArrayElements和好友。但这种情况有多久了?换句话说,如果可能的话,我的应用程序也会避免在旧设备上复制吗?
发布于 2015-06-11 17:50:21
Dalvik从来没有移动物体的GC。我们做了必要的准备工作,比如显式地固定对象,但是在复制收集器的开发变得非常严肃的时候(2011年年中),所有的开发工作都转移到了Art上。
“全局引用”列表包含所有JNI全局引用。在早期,VM分发原始指针,因此任何对JNI可见的引用都需要固定,这意味着由本地或全局JNI参考的所有对象都是不可移动的。在ICS(?)发布时,Dalvik的JNI切换到间接引用,这意味着我们只需要锁定被显式固定为直接访问的原语数组。(如果您从链接到的更改返回日志中的一些提交,您可以看到一些正在进行的工作。)
间接引用代码在几年内没有推出,因为一些代码深入到Android框架的核心,这些代码假定JNI引用是唯一不变的值。复制-收集器的工作还没有开始,间接引用会导致轻微的性能损失,因此没有太多的动机来扰乱平台的核心。
https://stackoverflow.com/questions/30777441
复制相似问题