首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果调用JNI DeleteGlobalRef(),相应的java对象是否会被垃圾回收?

调用JNI的DeleteGlobalRef()函数会删除全局引用,但不会直接触发Java对象的垃圾回收。垃圾回收是由Java虚拟机自动管理的过程,它会根据对象的引用计数和可达性分析等算法来确定对象是否可以被回收。

当调用DeleteGlobalRef()函数删除全局引用时,只是将JNI中的引用计数减一,如果该对象的引用计数变为零,说明没有其他JNI对象引用该Java对象,此时Java对象变为不可达状态。当Java虚拟机执行垃圾回收时,会检测到该对象不可达,并将其标记为可回收对象。最终,在合适的时机,Java虚拟机会回收该对象的内存空间。

需要注意的是,垃圾回收的具体时机是由Java虚拟机决定的,不同的虚拟机实现可能会有不同的策略和算法。因此,调用DeleteGlobalRef()函数并不直接触发垃圾回收,而是间接地影响了Java对象的可达性,从而可能导致垃圾回收的发生。

推荐的腾讯云相关产品:腾讯云函数(云原生Serverless计算服务),腾讯云数据库(云原生数据库服务),腾讯云CDN(内容分发网络服务),腾讯云安全产品(如DDoS防护、Web应用防火墙等)。

腾讯云函数:https://cloud.tencent.com/product/scf

腾讯云数据库:https://cloud.tencent.com/product/cdb

腾讯云CDN:https://cloud.tencent.com/product/cdn

腾讯云安全产品:https://cloud.tencent.com/solution/security

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JNI:全局引用&局部引用&弱全局引用

Java虚拟机创建对象传到本地 C/C++ 代码时就会产生引用。根据Java垃圾回收机制,只要有引用存在就不会触发该引用指向Java对象垃圾回收。...实际上局部引用存在,就会防止其指向对象垃圾回收。...尤其是当一个局部引用指向一个很庞大对象,或是在一个循环中生成了局部应用;最好做法就是在使用完该对象后,或在该循环尾部把这个引用释放掉,以确保在垃圾回收器被触发时候被回收。...全局引用存在期间会防止在Java垃圾回收回收。...(jobject obj1, jobject obj2); IsSameObject 函数对于弱引用全局应用还有一个特别的功能,把NULL传入要比较对象中,就能够判断弱全局引用所指向Java对象是否回收

1.2K20

JNI线程相关

尽可能减少需要接触 JNI 或被 JNI 接触线程数。如果您确实需要使用 Java 和 C++ 这两种语言线程池,请尽量保持在池所有者之间(而不是各个工作器线程之间)进行 JNI 通信。...通过 JNI 附加线程在退出之前必须调用 DetachCurrentThread()。如果直接对此进行编码会很棘手....会阻止GC回收所引用对象,不能在本地函数中跨函数使用,不能跨线前使用。 函数返回后局部引用所引用对象会被JVM自动释放....通过NewLocalRef创建局部引用,如果不通过函数返回,需要调用DeleteLocalRef释放。 全局引用 调用NewGlobalRef基于局部引用创建,会阻GC回收所引用对象。...JVM不会自动释放,必须调用DeleteGlobalRef手动释放 弱全局引用 调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用对象,可以跨方法、跨线程使用。

1.4K20
  • NDK 开发中几个重要知识点

    在 Native 层访问 Java 对象一般步骤 在 Native 层中通过 JNI 可以自由地访问 Java 对象,访问 Java 对象一般分为 3 步。 I....对象会被回收掉,但可能不会被立即回收,需要注意其生命周期,强制立即回收调用 env->DeleteLocalRef(obj);。...Global Reference 称为全局引用,其特点是如果不主动释放,在进程生命周期里其对应对象一直不会被回收。...//释放 env->DeleteGlobalRef(g_obj); 其使用场景是,在 JNI 调用完成后,想要继续使用 jobject 对象,需要将其设置为 Global Reference 。...Weak Global Reference 称为弱全局引用,其特点是在程序运行期间,该引用对应对象随时可能会被 GC 回收(如内存不足时),需要谨慎使用。 3.

    1K20

    JVM--JNI运行机制

    这些 Java 对象显然也会受到垃圾回收影响。因此,Java 虚拟机需要一种机制,来告知垃圾回收算法,不要回收这些 C 代码中可能引用到 Java 对象。...对于这种应用场景,我们需要借助 JNI 函数NewGlobalRef,将该局部引用转换为全局引用,以确保其指向 Java 对象会被垃圾回收。...相应,我们还可以通过 JNI 函数DeleteGlobalRef来消除全局引用,以便回收被全局引用指向 Java 对象。...当发生垃圾回收时,如果 Java 对象被移动了,那么句柄指向指针值也将发生变动,但句柄本身保持不变。 实际上,无论是局部引用还是全局引用,都是句柄。...JNI引用可分为局部引用和全局引用。这两者都可以阻止垃圾回收回收被引用Java 对象。不同是,局部引用在 native 方法调用返回之后便会失效。

    46620

    Android JNI引用管理

    在编写 Native 代码时,要注意这个代表 Java 数据结构类型引用在使用时会被 GC 回收可能性。...Native 代码并不能直接通过引用来访问其内部数据接口,必须要通过调用 JNI 接口来间接操作这些引用对象,就如在之前系列文章中写那样。...并且 JNI 还提供了和 Java 相对应引用类型,因此,我们就需要通过管理好这些引用来管理 Java 对象,避免在使用时被 GC 回收了。...局部引用在 Native 函数返回后,所引用对象会被 GC 自动回收,也可以通过 DeleteLocalRef 函数来手动回收。...同时,还可以用 isSameObject 来比较弱全局引用所引用对象是否被 GC 了,返回 JNI_TRUE 则表示回收了,JNI_FALSE 则表示未被回收

    1.4K10

    Android 进阶解密笔记-JNI 基础

    ->D,void -> V; 如果是类类型:L+类全名,类名中.用/代替,比如java.lang.String就是Ljava/lang/String; 如果是数组类型:则在前面加上然后加类型签名,几位数组就加几个...,它只在创建它线程有效,不能跨线程传递,因此不同是独立 作用: 调用Java方法 操作Java(操作Java变量和对象等) 局部引用、全局引用与弱引用比较 和Java引用类型一样,JNI也有引用类型...会阻止GC回收所引用对象,不在本地函数中跨函数使用,不能跨线前使用。函数返回后局部引用所引用对象会被JVM自动释放,或调用DeleteLocalRef释放。...全局引用 全局引用:只能调用NewGlobalRef基于局部引用创建,会阻GC回收所引用对象。可以跨方法、跨线程使用。...可以跨线程使用 不受JVM管理 弱引用与全局引用类型不同,它可以被GC回收 弱全局引用 弱全局引用:调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用对象,可以跨方法

    53130

    深入 Android 系统 - Android JNI

    JNIEnv对象是和线程绑定在一起,那我们考虑几个问题: 当我们在Java线程中调用native层JNI函数时,线程所属JNIEnv对象已经生成了吗? 如果生成了,在什么时候生成呢?...,如果继续调用其他JNI函数,可能会导致进程崩溃 为此,JNI中提供了一组函数来检查Java方法是否抛出了异常,方法原型如下: // 检查是否有异常发生 jthrowable ExceptionOccurred...JNI位于C/C++和Java之间,虽然JNI函数代码使用C/C++语言编写,但是通过JNI创建Java对象和在Java世界里创建一样,都会被虚拟机进行垃圾回收。...)表中删除 此时不会立刻回收对象,等到下次垃圾回收时才会释放 弱全局引用(WeakGlobalReference) 弱全局引用 (WeakGlobalReference) 引用下对象如果没有其他引用类型时...,下次垃圾回收会被回收掉。

    1.8K40

    JNI 从入门到实践,万字爆肝详解!

    、数组)传递到 JNI只是一个指针,为避免该对象垃圾回收虚拟机会固定住(pin)对象,在 JNI 方法返回前会阻止其垃圾回收。...: 对象在堆 / 方法区上分配,由垃圾回收器扫描对象可达性进行回收。...C/C++: 栈上分配对象会在方法返回时自动回收,而堆上分配对象不会随着方法返回而回收,也没有垃圾回收器管理,因此必须手动回收(free/delete)。...提示: 我们这里所说 ”置空“ 只是将指向变量值赋值为 null,而不是回收对象Java 对象回收是交给垃圾回收器处理。...NULL 对象; 弱全局引用与 NULL 比较: 用于判断引用指向对象是否回收

    2.1K21

    【Android NDK 开发】JNI 引用 ( 全局引用 | NewGlobalRef | DeleteGlobalRef )

    全局引用 内存回收 : 全局引用 与 局部引用 均不会被 JVM 自动回收 , 如果内存不足 , JVM 宁可抛出 OOM 异常 , 也不会回收这些内存 ; 3 ....JNI 方法 默认创建 Java 引用类型对象 都是局部引用 ; struct _JNIEnv { /* _JNIEnv 结构体中封装了 JNINativeInterface 结构体指针 *.../ const struct JNINativeInterface* functions; ... // 最终 调用 还是 JNINativeInterface 结构体中封装...全局引用代码示例 ---- 全局引用代码示例: // 全局引用 // 访问时如果局部变量也有同名变量 , 可以使用 域作用符 访问 // ::class_teacher 表示访问全局变量 jclass...class_teacher_global; extern "C" JNIEXPORT void JNICALL Java_kim_hsl_jni_MainActivity_jniGlobalReferenceTest

    1.1K20

    JNI开发中,你需要知道一些建议

    如果正在进行垃圾回收,或者调试器已发出了中止请求,Android会在下一次调用JNI函数时候中止线程。...如果与一个类加载器(ClassLoader)相关所有类都能够被垃圾回收,但是这种情况在Android上是罕见甚至不可能出现,只有这时类才被卸载。...不论哪种方式,返回原始指针在相应Release调用之前都保证有效(这意味着,如果数据没被拷贝,实际数组对象将会受到牵制,不能重新成为整理堆空间一部分)。...拷贝:备份空间将会被释放;里面所有的变更都会丢失。 检查isCopy标识一个原因是对一个数组做出变更后确认你是否需要传入JNI_COMMIT来调用Release函数。...如果没有分配备份空间,那么初始内存空间会受到牵制,位置不能被垃圾回收器移动。 另外注意JNI_COMMIT标识没有释放数组,你最终需要使用一个不同标识再次调用Release。

    1.4K30

    JNI之路径初探---6

    本篇文章讲解JNI下属性内存释放问题,众所周知,JAVA有四大引用,1,强引用2,弱引用3,软引用4,虚引用。JNI有三大引用,1,普通全局引用2,弱全局引用3,局部引用。...1,Native方法执行完最后一行代码完毕后,方法内所有局部对象全部自动释放内存。...2,弱、普通全局引用是跨线程、方法,不同是全局引用必须手动调用(env)->DeleteGlobalRef(env, 引用);才能释放内存,而弱全局适用于包装那些使用不频繁属性,它是不稳定,因为它不会阻止垃圾回收机制释放其内存...3,引用比较用(env)->IsSameObject(env, obj_1, obj_2),特殊一点如果比较是NULL,NULL是JVM下对象如果你比对对象是null,尽管"相同",但是会不同

    29720

    Android JNI学习(四)——JNI常用方法中文API

    (八)、弱全局引用 弱全局引用是一种特殊全局引用,不像一般全局引用,一个弱全局引用允许底层Java对象能够被垃圾回收。弱全局引用能够应用在任何全局或局部引用被使用地方。...当垃圾回收器运行时候,如果对象只被弱引用所引用时,它将释放底层变量。一个弱阮菊引用指向一个被释放对象相当于等于NULL。...当Native方法正在运行时候,垃圾回收器可能正在工作,被弱引用所指向对象可能在任何时候被释放。...); 测试obj是否是clazz一个实例 参数: env:JNI接口指针 obj:一个Java对象 clazz:一个Java类 返回: 如果obj是clazz实例,则返回JNI_TRUE;...直接缓冲区内容可能存在于普通垃圾回收器以外本地内存。有关直接缓冲区信息,可以参考 NIO和java.nio.ByteBuffer类规范。

    3.2K20

    谁创建谁销毁,谁分配谁释放——JNI调用内存管理

    因此,我们使用了大量JNI调用,来实现Java层和Native层(主要是C++)代码通信。...一个重要问题是JVM不会帮我们管理Native Memory所分配内存空间,本文就主要介绍如何在JNI调用时,对于Java层和Native层映射对象内存管理策略。 1....在Java层利用JNI调用Native层代码 如果Java层尝试调用Native层代码,我们通常用Java对象来封装C++对象。...对象和Native对象生命周期保持一致,当Java对象Java Heap中,被GC判定为回收时,同时会将Native Heap中对象回收。...在Native层利用JNI调用Java层代码 上一种情况,是以Java层为主导,Native层对象生命周期受Java对象控制。

    4.4K60

    你应该了解JNI知识(三)——注意点

    native层打印logcat日志 native层打印logcat日志,有两种方式: 调用JavaLog.i/v()之类方法,可以参考你应该了解JNI知识(二)——JavaJNI互相调用,里面介绍了如何在...另外,由于Java代码和Native有互操作性,因此如果在native代码中操作Java代码,之前说过这种方式是类似Java反射,也会根据classname去找到Class类等步骤,因此如果用到了这个功能也不能混淆对应类和方法...会阻止GC回收所引用对象,不在本地函数中跨函数使用,不能跨线程使用。函数返回后局部引用所引用对象会被JVM自动释放,或调用DeleteLocalRef释放。...全局引用:调用NewGlobalRef基于局部引用创建,会阻止GC回收所引用对象。可以跨方法、跨线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放。...弱全局引用:调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用对象,可以跨方法、跨线程使用。

    1.2K70

    java小心机(3)| 浅析finalize()

    预备知识 JNI(Java Native Interface),它提供了若干API实现了Java和其他语言通信(主要是C&C++) 概念 finalize()是Object类中一个方法,垃圾回收器准备释放对象占用内存时...析构函数:在C++中没有垃圾回收器,当对象需要被销毁时,需要手动调用delete()方法释放内存,而析构函数会在内存释放前被调用,用于释放对象使用资源,比如在其中经常做一些文件保存之类收尾工作。...对象一定会被销毁。 finalize():会在垃圾回收器准备释放对象内存时被调用,但垃圾回收并不一定发生,只有在濒临内存溢出时才会被调用;若内存一直充足,则永远不会被调用。...如果这个程序结束了,垃圾回收器一直没有释放掉你创建任何对象存储空间,则随着程序退出,那些资源也会全部交还给操作系统。 finalize()并不会确保对象会被销毁,所以它不是析构函数。...作用 1.释放那些不是通过new分配内存 在JNI技术中,可能会通过C语言malloc()分配内存,这部分内存无法通过垃圾回收器释放,只能通过在finalize()中调用本地方法释放。

    35740

    「音视频直播技术」JNI注意事项(一)

    今天我们就为大家讲讲使用JNI都需要注意些什么。 JNI JNI(Java Native Interface), 用于 Java 代码与 C/C++ 代码之间相互调用。...如果GC正在做回收,或者debugger发起了暂停请求,Android将在下一次进行JNI调用时暂停该线程。...所有与ClassLoader关联类被GC回收之前类是不会被卸载。类被卸载情况很少出现,但在Android下还是有可能发生。...全局引用一直是有效,除非你主动调用DeleteGlobalRef。...引用同一个对象有两个不同引用值也是有可能。例如,在同一对象上连续调用NewGlobalRef返回值可能不同。查看两个引用是否指向同一个对象必须使用 IsSameObject 方法。

    1.8K20
    领券