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

使用Pdfium库时,Android JNI在垃圾收集期间发生本机崩溃

是由于JNI引用未正确管理导致的问题。JNI(Java Native Interface)是Java提供的一种机制,用于在Java代码中调用本地(C/C++)代码。

在Android中,JNI的使用通常涉及到Java对象和本地对象之间的转换。当Java对象不再被引用时,垃圾收集器会回收该对象的内存。然而,如果JNI中的本地对象仍然持有对Java对象的引用,而垃圾收集器不知道这一点,就会导致本机崩溃。

为了解决这个问题,可以采取以下几个步骤:

  1. 确保JNI引用的正确释放:在JNI代码中,当不再需要Java对象时,需要手动释放对该对象的引用。可以使用DeleteLocalRef()函数释放本地引用。
  2. 使用全局引用:如果需要在JNI代码中持久地引用Java对象,可以使用全局引用。全局引用不会受到垃圾收集器的影响,直到显式释放为止。可以使用NewGlobalRef()函数创建全局引用,并使用DeleteGlobalRef()函数释放全局引用。
  3. 使用弱全局引用:如果JNI代码只需要临时引用Java对象,可以使用弱全局引用。弱全局引用不会阻止垃圾收集器回收对象,并且在对象被回收后,弱全局引用会自动变为无效引用。可以使用NewWeakGlobalRef()函数创建弱全局引用。
  4. 避免在垃圾收集期间访问本地对象:在JNI代码中,应避免在垃圾收集期间访问本地对象。可以通过在JNI代码中使用局部引用来避免这个问题。局部引用只在JNI函数的生命周期内有效,并且在JNI函数返回后会自动释放。

总结起来,解决JNI在垃圾收集期间发生本机崩溃的问题需要正确管理JNI引用,包括释放本地引用、使用全局引用或弱全局引用,并避免在垃圾收集期间访问本地对象。

关于Pdfium库的具体使用和相关问题,可以参考腾讯云的文档和产品介绍:

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

相关·内容

Java HotSpot 执行引擎架构

在内存回收期间重新定位对象垃圾收集器负责查找和更新对该对象的所有引用。 Two-Word 对象头 Java HotSpot VM使用两个机器对象标题,而不是Classic VM中的三个字。...一旦Java HotSpot自适应优化器执行期间收集关于程序热点的信息,它不仅将热点编译为本机代码,而且还对该代码执行广泛的方法内联。 内联有重要的好处。...JNI错误检查:一个命令行选项 -Xcheck: jni,用于执行其他JNI检查。这样可以开发期间运行参数有效性的检查,部署之前可以检测到它们,并减慢生产运行速度。...具体来说,Java HotSpot VM处理JNI请求之前验证传递给JNI函数的参数以及运行时环境数据。遇到的任何无效数据表示本机代码出现问题,并且在这种情况下,VM将以致命错误终止。...错误报告:如果JVM检测到本机代码中的崩溃,例如由开发人员编写的JNI代码,或者JVM本身崩溃,它将打印并记录有关崩溃的调试信息。

1K31

如何排查Java内存泄漏?看完我给跪了!

这些“Java堆空间”OOM的另一个潜在来源是使用finalizers。如果类具有finalize方法,则在垃圾收集该类型的对象不会被回收。而是垃圾收集之后,稍后对象将排队等待最终确定。...此消息与上一个消息之间的区别在于,JNI本机方法中检测到Java内存分配失败,而不是Java VM代码中检测到。 如果抛出此类型的OOM,您可能需要在操作系统上使用实用程序来进一步诊断问题。...Application Crash Without OOM 有时,应用程序可能会在从本机堆分配失败后很快崩溃。如果您运行的本机代码不检查内存分配函数返回的错误,则会发生这种情况。...如果未检查malloc的返回,则应用程序尝试访问无效的内存位置可能会崩溃。根据具体情况,可能很难定位此类问题。 某些情况下,致命错误日志或崩溃转储的信息就足以诊断问题。...但是,如果应用程序处理相同类型的数据稳定地增加其内存利用率,则可能会发生内存泄漏。 3.2. 启用详细垃圾收集 断言确实存在内存泄漏的最快方法之一是启用详细垃圾回收。

1.3K20

如何排查Java内存泄漏?看完我给跪了!

这些“Java堆空间”OOM的另一个潜在来源是使用finalizers。如果类具有finalize方法,则在垃圾收集该类型的对象不会被回收。而是垃圾收集之后,稍后对象将排队等待最终确定。...此消息与上一个消息之间的区别在于,JNI本机方法中检测到Java内存分配失败,而不是Java VM代码中检测到。 如果抛出此类型的OOM,您可能需要在操作系统上使用实用程序来进一步诊断问题。...Application Crash Without OOM 有时,应用程序可能会在从本机堆分配失败后很快崩溃。如果您运行的本机代码不检查内存分配函数返回的错误,则会发生这种情况。...如果未检查malloc的返回,则应用程序尝试访问无效的内存位置可能会崩溃。根据具体情况,可能很难定位此类问题。 某些情况下,致命错误日志或崩溃转储的信息就足以诊断问题。...但是,如果应用程序处理相同类型的数据稳定地增加其内存利用率,则可能会发生内存泄漏。 3.2. 启用详细垃圾收集 断言确实存在内存泄漏的最快方法之一是启用详细垃圾回收。

5.5K10

Android | 关于 OOM 的那些事

Dalvik 的 Zygote 对存放的预加载类都是 Android 核心类和 Java 运行时,这部分很少被修改,大多数情况下子进程和父进程共享这块区域,因此这部分类没有必要进行垃圾回收,而 Active...分代垃圾回收中,内存被分为不同的年代,每个年代使用不同的垃圾回收算法进行处理,年轻代使用标记复制算法,老年代使用标记清除法,这样可以更好的平衡内存分配效率和垃圾回收效率 ART ART 是 Android...程序的执行过程中,更多的代码被编译缓存,由于 JIT 只翻译一部分代码,它消耗更少的内存,占用更少的物理内存空间 Ahead Of Time ART 内置了一个 AOT 编译器,应用安装期间,...她将 dex 字节码编译成机器码存储设备的存储器上,这个过程旨在应用安装到设备的时候发生,由于不在需要 JIT 编译,代码的执行速度回快很多 ART运行时堆 与 DVM 不同的是,ART 采用了多种垃圾收集方案...,每个方案会运行不同的垃圾收集器,默认是采用了 CMS (Concurrent Mark-Sweep) 方案,也就是并发标记清除,该方案主要使用了 sticky-CMS 和 partial-CMS。

91320

【玩转 Cloud Studio】Android 中关于 OOM 的那些事

Dalvik 的 **Zygote 对存放的预加载类都是 Android 核心类和 Java 运行时,这部分很少被修改,大多数情况下子进程和父进程共享这块区域,因此这部分类没有必要进行垃圾回收**,而...> > 分代垃圾回收中,内存被分为不同的年代,每个年代使用不同的垃圾回收算法进行处理,年轻代使用标记复制算法,老年代使用标记清除法,这样可以更好的平衡内存分配效率和垃圾回收效率 #### ART ART...是 Android 5.0 中引入的虚拟机,与 DVM 相比,**ART 使用的是 AOT(Ahead of Time) 编译技术**,这意味着他将应用程序的字节码转换为本机机器码,而不是在运行时逐条解释字节码...程序的执行过程中,更多的代码被编译缓存,由于 JIT 只翻译一部分代码,它消耗更少的内存,占用更少的物理内存空间 - Ahead Of Time ART 内置了一个 AOT 编译器,应用安装期间...采用了多种垃圾收集方案,每个方案会运行不同的垃圾收集器,默认是采用了 CMS (Concurrent Mark-Sweep) 方案,也就是并发标记清除,该方案主要使用了 sticky-CMS 和 partial-CMS

85130

你真的会用JNI吗?这些小技巧99%的人都不知道

使用它您可以很容易地实现常见的音视频需求,目前只支持Android,当然也可以很方便的移植到IOS。欢迎查阅学习和使用,如有BUG或建议,欢迎Issue。   ...使用Java类中缺失的功能。例如,您可能需要使用Java语言实现ping的功能,这需要实现ICMP协议,但是Java基本类没有提供这个协议的实现。 解决不能使用Java代码的特殊情况。...例如,核心类的实现可能需要跨包调用或需要绕过其他Java安全检查。   对于以上列举的这些例子,我们可以使用JNI来实现。...当Java代码执行时,这些异常会导致执行流程发生改变,从而自动调用异常处理代码。当本地调用JNI方法,可能引发异常,这时候需要本地去检查异常,并采取适当的操作。...如果本地代码没有检查异常的情况下继续进行并使用它认为正确的字段ID,就可能发生崩溃

97720

「音视频直播技术」JNI编程常见问题

如果没有分配复制缓冲区,则原始内存必须被固定,并且不能被垃圾收集器移动。另请注意,JNI_COMMIT标志不会释放数组,您需要再次使用不同的标志调用Release。...注意,被解释的代码抛出的异常不能解开本机堆栈帧,因为Android不支持C++异常。JNI Throw和ThrowNew指令在当前线程中设置了一个异常指针。...扩展检查 JNI几乎没有错误检查,错误通常会导致崩溃Android提供了一种称为CheckJNI的模式,调用标准实现之前,将JavaVM和JNIEnv函数表指针切换到执行扩展系列检查的函数表。...Exceptions:异常挂起进行JNI调用。 JNIEnv* :错误的线程中使用 JNIEnv* 。...在这种情况下,你能在下次应用程序启动logcat输出中看到下面的信息: D Late-enabling CheckJNI 您还可以应用程序的manifest中设置android:debuggable

1.5K20

Android开发多年每天Crud不清楚自己的技术?来刷刷大厂的高端技术面试题就知道了

19、一个文件中有100万个整数,由空格分开,程序中判断用户输入的整数是否在此文件中。...八.NDK、jni、Binder、AIDL、进程通信有关 1、请介绍一下NDK 2、什么是NDK? 3、jni用过吗? 4、如何在jni中注册native函数,有几种注册方式?...13、Android 上的 Inter-Process-Communication 跨进程通信如何工作的? 14、多进程场景遇见过么? 15、Android进程分类?...(提示:Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程) 17、大体说清一个应用程序安装到手机上发生了什么 18、简述Activity启动全部过程 19、App...这里再分享一下我之前面试期间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的) 最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统

73400

Java 22 正式发布,一文了解全部新特性

性能:提供对外部函数和内存的访问,其开销与 JNI 和 sun.misc.Unsafe 相当(如果不是更好的话)。 广泛的平台支持:允许 JVM 运行的每个平台上发现和调用本机库。...一致性:提供在多种内存(例如本机内存、持久内存和托管堆内存)中操作无限大小的结构化和非结构化数据的方法。 健全性:保证没有释放后使用错误,即使多个线程之间分配和释放内存也是如此。...Regional Pinning for G1 - JEP 423 G1 的区域固定 - JEP 423,通过 G1 中实现区域固定来减少延迟,以便在 Java 本机接口 (JNI) 关键区域期间无需禁用垃圾收集...价值 使用 JNI ,Java 线程无需 G1 GC 操作完成之前等待,从而提高开发人员的工作效率。...垃圾收集器吞吐量的提高,尤其是与“年轻”垃圾相关的情况。 更好的系统模块描述符版本报告。 改进了本机代码的“wait”处理选项。 Unicode 通用区域设置数据存储已更新至版本 44。

50210

Java内存泄漏检测LeakCanary介绍,了解?

这个位图是设备屏幕的大小,我们创建它发生了大量的内存不足(OOM)崩溃。 ? Java内存泄漏检测LeakCanary介绍,了解?...当他们的工作完成后,他们会被垃圾收集起来。如果一个引用链一个对象的预期生存期结束后将其保存在内存中,这将导致内存泄漏。当这些漏洞累积起来时,应用程序的内存就会耗尽。...例如,调用 Activity.onDestroy() ,其视图层次结构及其关联的位图都应该是可垃圾回收的。如果在后台运行的线程持有对活动的引用,则无法回收相应的内存。...您可能需要购买、借用或窃取发生崩溃的特定设备。(并非所有设备都会出现泄漏!)您还需要弄清楚是什么导航序列触发了泄漏,可能是暴力造成的。 当OOM发生转储堆。...用MAT或YourKit垃圾堆周围搜索,找到一个应该被垃圾收集的对象。 从强引用计算最短路径。 找出路径中不应存在的引用,并修复内存泄漏。

95220

去公司的第一天老大问我:内存泄露检测工具你知道几个?

然而,使用Java飞行记录可以及早发现内存泄漏,甚至问题发生之前。 观察应用程序的实时集是否随着时间的推移而增加。live set是旧集合(所有非活动对象都已被垃圾回收)之后使用的Java堆量。...此错误的另一个潜在来源是过度使用终结器的应用程序。如果类具有finalize方法,则该类型的对象垃圾收集不会回收其空间。取而代之的是,垃圾回收之后,这些对象将排队等待最后确定,这将在以后发生。...垃圾收集之后,如果Java进程花费了大约98%的时间进行垃圾收集,并且它恢复的堆不到2%,并且最近5次(编译时常数)连续的垃圾收集中一直这样做,那么 java.lang.OutOfMemoryError...操作:当抛出此错误消息,VM调用致命错误处理机制(即,它生成一个致命错误日志文件,其中包含有关崩溃线程、进程和系统的有用信息)。本机堆耗尽的情况下,日志中的堆内存和内存映射信息可能很有用。...这条消息与前一条消息的区别在于,分配失败是Java本机接口(JNI)或本机方法中检测到的,而不是JVM代码中检测到的。

28520

深入 Android 系统 - AndroidJNI

程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。...JNI 用法介绍 JNI 头文件位于libnativehelper/include_jni/jni.h 从Java到C/C++ 装载 JNI 动态 为了使用JNI调用本地方法前必须把C/C++代码所编译生成的动态装载到进程的内存空间中...,可以使用任何类型作为参数,包括: 基础数据类型 数组类型 复杂对象 native方法使用上和普通的Java方法没有区别, 编写JNI 动态 JNI 动态和非 JNI 动态的区别是:JNI 动态中定义了一个名为...JNI 中的异常处理 JNI 中检查Java层产生的异常 首先要明确的是,Android的C++层不支持try-catch机制 如果JNI调用Java层的方法发生了异常 JNI调用会正常返回 但是...,如果继续调用其他JNI函数,可能会导致进程崩溃 为此,JNI中提供了一组函数来检查Java方法是否抛出了异常,方法原型如下: // 检查是否有异常发生 jthrowable ExceptionOccurred

1.7K40

Android性能优化(一)

被 low memory killer 杀掉、从系统的任务管理器中划掉等 ANR 我们可以应用启动的时候设定一个标志,主动自杀或崩溃后更新标志,这样下次启动通过检测这个标志就能确认运行期间是否发生过异常退出...JNI使用 JNI ,如果不注意很容易出现引用失效、引用爆表等一些崩溃。 应用信息 除了系统,其实我们的应用更懂自己,可以留下很多相关的信息。崩溃场景。...所需的内存空间会在编译期间完成分配,进入一个方法帧中局部变量表的空间是完全确定的,不需要运行时改变 若线程申请的栈深度大于虚拟机允许的最大深度,会抛出SatckOverFlowError错误 虚拟机动态扩展...Local – JNI方法的local变量或参数 JNI Global – 全局JNI引用 Monitor Used – 用于同步的监控对象 垃圾回收算法 标记清除算法 标记清除算法有两个阶段,首先标记出需要回收的对象...分代收集算法 当代虚拟机垃圾回收算法都采用分代收集算法来收集,根据对象存活周期不同将内存划分为新生代和老年代,再根据每个年代的特点采用最合适的算法。

2.5K20

JVM体系结构的解释

本文中,我们将更深入地了解Java中的JVM体系结构以及JVM的不同组件。 JVM是什么? 虚拟机是物理机的软件实现。 Java是WORA(随处运行一次写入)的概念下开发的,它在VM上运行。...执行引擎将使用解释器的帮助来转换字节代码,但是当它找到重复的代码,它使用JIT编译器,它编译整个字节码并将其更改为本机代码。此本机代码将直接用于重复的方法调用,从而提高系统的性能。...中间码发生器-生成中间代码 代码优化器-负责优化上面生成的中间代码 目标代码生成器-负责生成机器代码或本机代码 Profiler-一个特殊组成部分,负责查找热点,即是否多次调用该方法。 3....垃圾收集器:收集和移除未引用的对象。可以通过调用“System.gc()”来触发垃圾收集,但不保证执行。JVM的垃圾收集创建的对象。...Java原生接口(JNI): JNI将与本机方法库交互,并提供执行引擎所需的本机库。 本地方法库:它是执行引擎所需的本机库的集合。

69620

Android 面试之必问高级知识点

ART 还具有比 Dalvik 更严格的安装验证。安装,ART 使用设备自带的 dex2oat 工具来编译应用。...ART模式从以下几个方面优化了垃圾回收的策略: 只有一次(而非两次)GC 暂停 GC 保持暂停状态期间并行处理 清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短 优化了垃圾回收的工效...,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件典型用例中极为罕见 压缩 GC 以减少后台内存使用和碎片 1.2.3 开发和调试方面的优化 支持采样分析器 一直以来,开发者都使用...优化了异常和崩溃报告中的诊断详细信息 当发生运行时异常,ART 会为您提供尽可能多的上下文和详细信息。...具体来说,我们可以使用 Gradle 将 C \ C++ 代码 编译到原生中,然后将这些代码打包到我们的应用中, Java 代码随后可以通过 Java 原生接口 ( JNI ) 调用 我们原生中的函数

58320

Android 面试必问高级知识点(2021)

ART 还具有比 Dalvik 更严格的安装验证。安装,ART 使用设备自带的 dex2oat 工具来编译应用。...ART模式从以下几个方面优化了垃圾回收的策略: 只有一次(而非两次)GC 暂停 GC 保持暂停状态期间并行处理 清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短 优化了垃圾回收的工效...,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件典型用例中极为罕见 压缩 GC 以减少后台内存使用和碎片 1.2.3 开发和调试方面的优化 支持采样分析器 一直以来,开发者都使用...优化了异常和崩溃报告中的诊断详细信息 当发生运行时异常,ART 会为您提供尽可能多的上下文和详细信息。...具体来说,我们可以使用 Gradle 将 C \ C++ 代码 编译到原生中,然后将这些代码打包到我们的应用中, Java 代码随后可以通过 Java 原生接口 ( JNI ) 调用 我们原生中的函数

35530

Android NDK开发完全剖析

例如Windows上可执行的文件是.exe,但是.exe文件是不能在Android上面运行的,我如果想编译一个文件,让这个文件Android平台上被加载,那这个编译的过程就是交叉编译。...CMake用于使用简单的平台和编译器独立配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用本机 makefile 和工作区。...和上层交互的类型标识,不同的字符标识不同的类型。...至于崩溃栈是怎么手机的,建议大家了解一下google-breakpad的开源,这儿贴一下,大家有兴趣了解一下。...其核心思想就是linux的终端就是通过signal发生给系统的,系统接收到崩溃的中断信号,就知道当前发生了不可扭转的问题,开始收集堆栈信息。

1.7K10

Java JDK 22全新发布 - 猫头虎博主带你一起深入了解JDK22!

JEP 423: G1垃圾收集器的优化 G1垃圾收集器引入了区域固定机制,这一改进旨在降低GC(垃圾收集)延迟,使得使用Java本机接口(JNI垃圾收集操作更加高效。...这些改进涉及 Java 语言、API、性能以及 JDK 中包含的工具: JEP 423:G1 引入区域固定机制,降低 GC 延迟 G1 的区域固定旨在减少延迟,从而无需 Java 本机接口 (JNI)...关键区域期间禁用垃圾收集 (GC)。...这意味着使用 JNI ,Java 线程无需 G1 GC 操作完成之前等待,从而提高开发人员的工作效率。...性能——提供对外部函数和内存的访问,其开销可与 JNI 和 sun.misc.Unsafe 相媲美,甚至更好。 广泛的平台支持—— JVM 运行的每个平台上都能发现和调用本地

37110
领券