开发者社区> 问答> 正文

JNI与GC可以保证一致性吗?

JNI与GC可以保证一致性吗?

展开
收起
1358896759097293 2021-05-04 15:27:32 869 0
1 条回答
写回答
取消 提交回答
  • 45271990@qq.com

    透过几个JNI管中窥豹,了解这个机制:

    void * GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy); 
    void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode);
    
    

    这个函数叫做GetPrimitiveArrayCritical。Critical作用是把一段内存返回给用户,用户可以直接编辑里面的数据,这时如果发生GC被移动,编辑肯定会导致 heap乱掉,有Critical这段时间里锁住heap,没法发生GC。假如 critical状态发生期间,基本上不会影响GC,会等待,直ReleasePrimitiveArrayCritical发出,这是比较巧妙的互相协作。 下图所示的二级指针模型,还是前面Java调到Native,参数通过jobject到handle保存使用,jobject指向handle,handle指向oop。

    28.png

    java heap时候,假如OOP对象被移动handle,同时会更新 handle里面的地址。所以只要C程序都是通过JNI访问对象,每次对象被移动它都可以被感知,不会出现数据布局之后突然情况。

    “GC: handle_are->oops_do(f)”
    
    

    指有区域专门存放handle,里面所有handle在GC里,都会进行一次指针修正,保证数据一致性。

    2021-05-05 22:55:04
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多