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

Android:Native进程在一段时间后引发ReferenceTable溢出(android-ndk)

Android: Native进程在一段时间后引发ReferenceTable溢出(android-ndk)

在Android开发中,Native进程是指使用C/C++语言编写的代码,通过Android NDK(Native Development Kit)进行编译和构建的应用程序。ReferenceTable溢出是指Native进程中的引用表(Reference Table)达到了其容量上限,导致内存溢出的情况。

引用表是用于管理Java对象在Native层的引用关系的数据结构,它记录了Java对象在Native层的引用数量和位置。当Native进程中使用Java对象的数量超过了引用表的容量限制时,就会发生ReferenceTable溢出。

ReferenceTable溢出可能导致应用程序崩溃或性能下降。为了解决这个问题,可以采取以下措施:

  1. 优化Native代码:检查Native代码中是否存在内存泄漏或不必要的对象引用,及时释放不再使用的对象,减少引用表的负荷。
  2. 增加引用表容量:可以通过增加引用表的容量来解决溢出问题。在Android NDK中,可以通过调整JNI_OnLoad函数中的JavaVMAttachArgs结构体的jni_versionmax_reference_table_size字段来增加引用表的容量。
  3. 减少Native层对象的使用:尽量减少在Native层使用Java对象的数量,可以考虑将一些操作移至Java层来处理,减少对引用表的依赖。
  4. 使用更高效的数据结构:可以考虑使用更高效的数据结构来管理Java对象的引用关系,例如使用稀疏数组或哈希表等。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

C++ 和 Android 本地 Activity 初探

Android 使用一个名为 Zygote 的进程来加速 Android Runtime 内部启动的应用或服务的过程。...这对 Android 内所有面向用户的进程都适用,因此你的代码首次运行的地方是一个虚拟机内。然后代码必须加载一个含有你的逻辑的共享库文件,如果你使用了本地 Activity,该共享库将为你处理。...如此,我找到了 native_app_glue 的实现:android_native_app_glue.c。 将代码与目标关联,我想说一下目标是在哪里找到它的头文件的。... add_library 之前的 set 也确保 helloworld-c 不会实现名为 ANativeActivity_onCreate 的方法,该方法由 android_native_app_glue...准备 OpenGL 谷歌的示例库中已有优秀的 OpenGL 示例程序了: googlesamples/android-ndk: Android Studio 下的 NDK 示例程序。

1.4K30

quickCocos2dx编译生成apk

毕业开始做游戏,一直都是做的ios端的,最近换份新工作,做android端游戏开发。 android端+quickCocos这简直就是个坑啊,都2天了,一个开发环境都还没有搭建好。...废话不多说,开始介绍博主遇到的坑吧~ 首先就是各种插件的安装 什么jdk、android-ndk、adt什么的,网上有教程,这里就不细说了,但是千万要注意版本~ 生成os库 插件安装好,就可以开始生成...\build_native.py 执行报错,说ndk-build不是内部或外部命令,将其加入环境变量即可。 然后再执行python ....\build_native.py命令就可以啦 更新编译环境 os库生成好,执行android update project -p ....-t 1 关于这个网上有不同的说法,有的说不用执行这行命令,有的说是frameworks\runtime-src\proj.android目录下执行。博主都试了,至少博主这里行不通。

39920
  • frameworksml引发的思考

    Android Neural Networks API的App使用demo https://github.com/googlesamples/android-ndk/tree/master/nn_sample...简单的翻译一下: TensorFlow Lite是TensorFlow的轻量级的解决方案,用于移动手机和可穿戴设备,它可以设备上以低延迟,小体积的方式来实现机器学习的接口,TensorFlow Lite...APP:使用Tensorflow lite的应用 Framework:Tensorflow lite这类的ML库 Native Framework:Android Neural Networks API...,而且整个功能贯串HAL-Native-Framework-APP,非常有助于程序员对整个Android架构设计的理解,通过对Android架构的学习,我感觉开发一套基于linux的手机操作系统并没有想象中的那么不可能...CPU的矩阵的加法,但是由于CPU无法高效的并行运算,矩阵的加法效率并不高,tensorflow lite的高级工程师说可以优化,他通过代码的优化,让基于CPU的矩阵加法比我等初级工程师更加高效,过了一段时间

    47920

    【团队分享】刀锋铁骑:常见Android Native崩溃及错误原因

    2、Native Crash 通过NDK,使用C/C++开发,导致进程收到错误信号,发生Crash,Android 5.0之前进程直接退出(闪退) , Android 5.0之后会弹“程序已崩溃”的对话框...如果访问的地址为可写,而且通过野指针修改了该处的内存,那么很有可能会等一段时间(其它的代码使用了该处的内存)才发生Crash。...该功能会在编译的汇编代码中插入堆栈检测的代码,并在运行时能够检测到栈破坏并输出报告。 Bug评述 缓冲区溢出是一种非常普遍、非常危险的漏洞,各种操作系统、应用软件中广泛存在。...缓冲区溢出,调试生成的core,可以看见调用栈是混乱的,因为函数的返回地址已经被修改到随机的地址上去了。...服务器宕机,如果core文件和可执行文件是匹配的,但是调用栈是错乱的,那么很大的可能性是发生了缓冲区溢出

    4.2K62

    Android | 关于 OOM 的那些事

    指向该进程打开文件的记录表,例如当我们用输出流文件打开文件的时候,系统就会返回我们一个FD,FD是可能出现泄露的,例如输入输出流没有关闭的时候,详细可参考 Android FD泄露问题 虚拟内存不足 新建线程的时候...Zygote 是一个虚拟机进程,同时也是一个虚拟机实例孵化器,zygote 堆是 Zygote 进程启动时预加载的类,资源和对象,除此之外我们代码中创建的实例,数组等都是存储 Active 堆中的...为什么要将 Dalvik 堆分为两块,主要是因为 Android 通过 fork 方法创建一个新的 zygote 进程,为了尽量避免父进程和子进程之间的数据拷贝。...,无需手动初始化,就能实现内存泄露检测,当内存发生泄露,会自动发出一个通知,点击就可以查看具体的泄露堆栈信息 LeakCannary 只能在 debug 环境使用,因为他是在当前进程 dump 内存快照...,会冻结当前进程一段时间,所以不适于正式环境使用。

    1.3K20

    android-studio安装及android开发环境搭建

    提取码:8mvx android-sdk、android-ndk、jdk这些软件包我“Qt-android开发环境搭建”的博客中已经提供了下载方式,这里就不赘述了,需要的可以去找一下。...二、安装 关于jdk、android-SDK、android-ndk这些的安装也不再赘述,这里详细说一下android-studio的安装。...: 等待安装完毕,大概5-10分钟左右: 这里我们不导入已有配置,如果经常开发android的话,那么可以将自己对android-studio的配置保存下来,以后直接在新安装直接在此导入即可:...对于虚拟机我们一般也是选上的,如果没选上菜单栏也可以再去选择并创建。...使用真机时需要打开手机的开发者选项,否则无法连接到手机,此外,adb程序只能有一个在运行,一般采用手机助手连接手机安装驱动,之后就可以通过USB连接线连接到手机了,再接着需要退出手机助手(因为手机助手连接电脑占用了adb程序),一段时间通过任务管理器检测

    99920

    android studio2.3如何编译动态库的过程详解

    前言 最近在工作中需要编译android下的动态库,本以为是一件简单的事,没想到因为工具,以及google本身被墙的原因,折腾了好久。 windows外的平台搞事情,寿命都得缩短。...1、下载android-ndk,安装。...3、安装好启动,界面上第一行是创建新工程,创建后会卡上10几分钟进不去,因为android studio需要下载gradle,而国内是下载不了的,于是她妹的卡了,连个提示都没有,vpn重连也没用。...6、下载,经常会便秘,你很可能需要重启android studio, 不然新下的库找不到,同步是没有用的。 7、接下来需要配置路径了。...首先左边是project视图,文件树下找到local.properties,追加ndk的路径,虽然你已经创建工程时选过,但这里还是得填: ndk.dir=D\:\sdk\Android\android-ndk-r14b

    64241

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

    如果太大就会影响到可创建栈的数量,如果是多线程应用,就会导致内存溢出。 - 本地方法栈 与 java 栈的效果基本类似,区别只不过是用来服务于 native 方法。...Zygote 是一个虚拟机进程,同时也是一个虚拟机实例孵化器,zygote 堆是 Zygote 进程启动时预加载的类,资源和对象,除此之外我们代码中创建的实例,数组等都是存储 Active 堆中的...为什么要将 Dalvik 堆分为两块,主要是因为 Android 通过 fork 方法创建一个新的 zygote 进程,为了尽量避免父进程和子进程之间的数据拷贝。...,无需手动初始化,就能实现内存泄露检测,当内存发生泄露,会自动发出一个通知,点击就可以查看具体的泄露堆栈信息 LeakCannary 只能在 debug 环境使用,因为他是在当前进程 dump 内存快照...,会冻结当前进程一段时间,所以不适于正式环境使用。

    96630

    性能优化测试中的相关名词

    注:物理内存与系统策略有关,关注意义不大 Swap Memory Swap Memory,部分设备支持Swap功能,启用Swap功能,系统会对PSS内存进行压缩,Swap增加,PSS会相应减少,由于压缩会占用...内存溢出可以引发很多的问题:     1.程序卡顿,响应速度慢(内存占用高时JVM虚拟机会频繁触发GC)     2.莫名消失(当你的程序所占内存越大,它在后台的时候就越可能被干掉。...反之内存占用越小,在后台存在的时间就越长)     3.直接崩溃(OutOfMemoryError) ANR Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应...因此,程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。...CTemp CPU温度 BTemp 电池温度 Battery Power 整机实时Current电流、Voltage电压、Power功耗(注:PerfDog目前Android平台每秒获取多次;iOS

    2.8K00

    Android内存泄漏的轻松解决方法

    Android 中的差异: 2.3 以后版本中,即使内存够用,Android 系统会优先将 SoftReference 的对象提前回收掉, 其他和 Java 中是一样的。...内存泄漏的危害 运行性能的问题: Android在运行的时候,如果内存泄漏将导致其他组件可用的内存变少,一方面会使得GC的频率加剧,发生GC的时候,所有进程都必须进行等待,GC的频率越多,从而用户越容易感知到卡顿...由于占用的都是Native 堆内存,所以实际占用的内存大小不会显示常用的 DDMS Heap 工具中( DMS Heap 工具看到的只是Java虚拟机分配的内存,即使Native堆内存已经占用了几百兆...系统检测到应用占用内存过大有可能被系统干掉 也可以它所在的 Activity(或者 Service) 结束,调用 System.exit(0),主动Kill掉进程。...由于系统的内存分配是以进程为准的,进程关闭,系统会自动回收所有内存。

    1.4K30

    由多线程内存溢出产生的实战分析

    无法还原问题发生时候系统内存被各个进程使用的占比,CPU的占比。 日志没有异常堆栈信息。 解决思路 1、要能够验证Tomcat配置内存溢出时打印堆栈并验证可行性,并保证在上线和重启不被擦除。...3、实现JVM内存监控,JVM内存紧张的时候提前报警,人工干预。 现状:无 4.、监控或者实现脚本收集java进程OOM的时候,各个进程对内存的占比等,以及监控cache, buffer等。...5、研究底层,寻找java.lang.OutOfMemoryError: unable to create new native thread错误的引发原因有哪些。 6、针对项目进行压测发现问题点。...压测分析 压测环境中配置与生产环境一样的硬件环境和配置环境进行压测,可以看到如下的测试图: 通过压测分析,程序并发线程达到1010个的时候,就报出unable to create new native...回顾总结 我们排查整个内存溢出问题的过程中,其实耗费了挺长时间,而且报错的时间基本都是晚上,分析交易量看到这个时间段的并发量确实比白天要高,给我们最大的启示是发生问题的时候,不能很快的定位问题原因,

    1K50

    一步一步学习androidNDK编程(hello world)

    首先需要去android的官网下载android-ndk压缩包,之后解压,进入解压的目录,我们发现有一个ndk-build的脚本文件,这个脚本文件就是我们用交叉编译的文件。我们通过 “....,括号后边不能添加大括号,因为我们只是声明而并未实现该方法,native关键字,表明该方法的实现是c语言层面实现的。...该目录下新建一个hello.c文件,在编写hello.c文件之前,我们需要用javah生成public native String helloWorldNdk(); 方法对应的头文件,由于我们MainActivity...记住,需要编译该android工程中的c文件,我们还需要编写Android.mk文件,同样jni目录下,新建一个Android.mk文件,内容如下: LOCAL_PATH := $(call my-dir...,我们发现在helloworld的android工程中,生成了以下文件: libs目录下生成的libhello.so文件就是一个可以执行的二进制文件。

    75420

    微信小游戏的内存调优指南

    前言 开发微信小游戏的过程中,开发者往往会遇到很多内存问题,如内存泄漏或者内存溢出等。对目前几款微信创意小游戏进行测试发现,微信小游戏运行时的异常Crash多是由于内存占用过多造成的。...通过时间轴记录可视化一段时间内的内存使用情况。 使用堆快照识别分离的DOM树(导致内存泄漏的常见原因)。 使用“分配时间轴”记录找出何时JS堆中分配新内存。...Snapshot,界面弹出如下图所示的提示,从手机中的提示的位置把 Heap Snapshot 拷贝到电脑上。...Step 3: 微信小游戏的各个场景中进行游戏操作,观察右侧Memory Usage的变化。 Android设备下微信小游戏与微信处于不同进程,需要在PerfDog中选取小游戏进程。...选取小游戏进程方式如下图所示:鼠标放置区域“1”上,会弹出右侧浮动框,其中深色区域是当前微信内活跃的进程。如果此时微信正在运行小游戏,则该进程为微信小游戏进程。点击深色进程,即选中了小游戏进程

    2.4K40

    你想要的Android性能优化系列:内存优化 !

    引起GC的原因3.垃圾收集六、常见的内存问题七、常见的内存泄漏场景 Android系统中,系统为每个App分配的内存都是有限的,如果不合理的使用,就有可能造成一系列的内存问题,如:内存泄漏,内存溢出和内存抖动...} Android应用的开发中,为了防止内存溢出处理一些占用内存大而且生命周期较长的对象时候,可以尽量应用软引用和弱引用技术。...比如我们回收,如果我需要创建一个占了10个格子的内存大小的对象,这种情况,就会触发新的一次垃圾收集回收,如果回收的内存还是不够,就内存溢出了。...而ARTApp安装的时候,会进行一次预编译(AOT),并把编译的机器码存储本地。...内存溢出(OOM)可分为以下两种场景: 内存真正不足:例如 APP 当前进程最大内存上限为 512 MB,当超过这个值就表明内存真正不足了。

    1.3K30

    由多线程内存溢出产生的实战分析

    3、实现JVM内存监控,JVM内存紧张的时候提前报警,人工干预。 现状:无 4.、监控或者实现脚本收集java进程OOM的时候,各个进程对内存的占比等,以及监控cache, buffer等。...5、研究底层,寻找java.lang.OutOfMemoryError: unable to create new native thread错误的引发原因有哪些。...Paste_Image.png 通过压测分析,程序并发线程达到1010个的时候,就报出unable to create new native thread异常,查看上面这张图其实不难看出,应用程序中并没有使用线程...,但是Log4j中却大量的使用了synchronized这个关键字,并发非常高的时候会产生非常多的阻塞,最终内存资源耗尽报出内存溢出错误。...八、回顾总结 我们排查整个内存溢出问题的过程中,其实耗费了挺长时间,而且报错的时间基本都是晚上,分析交易量看到这个时间段的并发量确实比白天要高,给我们最大的启示是发生问题的时候,不能很快的定位问题原因

    1.2K60

    Android进程永生技术终极揭秘:进程被杀底层原理、APP应对被杀技巧

    1、引言 上个月知乎上发表的由“袁辉辉”分享的关于TIM进程永生方面的文章(即时通讯网重新整理的标题是:《史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术》),短时间内受到大量关注,...可惜短短的几十个小时,就在一股神秘力量的干预下被强行删除了。。。...▲ 该文知乎上从发布到删除的时间历程(中间省略了N条读者的评论) 《史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术》一文重新整理发布的数小时内,作者田维术(博客名:Weishu)...▲ 这台手机,应该能勾起很多老Android程序员的回忆 譬如说 Android 5.0 以前,App 内部通过 native 方式 fork 出来的进程是不受系统管控的,系统杀 App 进程的时候...Android 6.0 引入了待机模式(doze),一旦用户拔下设备的电源插头,并在屏幕关闭一段时间内使其保持不活动状态,设备会进入低电耗模式,该模式下设备会尝试让系统保持休眠状态。

    3.9K11

    Android 黑科技保活实现原理揭秘

    譬如说 Android 5.0 以前,App 内部通过 native 方式 fork 出来的进程是不受系统管控的,系统杀 App 进程的时候,只会去杀 App 启动的 Java 进程;因此诞生了一大批...“毒瘤”,他们通过 fork native 进程 App 的 Java 进程被杀死的时候通过 am命令拉起自己从而实现永生。...Android 5.0 以上,系统杀进程以 uid 为标识,通过杀死整个进程组来杀进程,因此 native 进程也躲不过系统的法眼。...Android 6.0 引入了待机模式(doze),一旦用户拔下设备的电源插头,并在屏幕关闭一段时间内使其保持不活动状态,设备会进入低电耗模式,该模式下设备会尝试让系统保持休眠状态。...通过 native 层给 ams 发送 binder 消息拉起进程,我们算是解决了「快速拉起进程」这个问题。但是这个还是不够。

    1.5K30

    HIDL学习笔记之HIDL C++(第二天)

    如果在发生溢出但在下一次读取之前,系统查看可供读取的数据,则会显示可供读取的数据超出了队列容量,这表示发生了溢出。...分散-集中 之前的 Android 版本中,Binder 调用中的每条数据都会被复制 3 次: 一次是调用进程中将数据序列化为 Parce 一次是在内核驱动程序中将 Parcel 复制到目标进程 一次是目标进程中对...添加 /dev/vndbinder Android 现在拥有以下 3 个 IPC 域: IPC 域 说明 /dev/binder 框架/应用进程之间的 IPC,使用 AIDL 接口 dev/hwbinder...单一客户端执行线程可能会通过以下两种方式具有多个线程的服务器上引发并行运行: oneway 调用不会阻塞。...handle handle 类型由 C++ 形式的 hidl_handle 结构表示,该结构是一个简单的封装容器,用于封装指向 const native_handle_t 对象的指针(该对象已经 Android

    1.9K30
    领券