android Jni AttachCurrentThread 内存泄露

本文讲述了在Android开发中遇到的一个JNI内存泄露问题,详细分析了由于频繁调用AttachCurrentThread导致的内存不足情况。通过复用内存块和排除法,最终定位到问题是由于每次从C到Java传递数据时都调用AttachCurrentThread,而不是全局存储env导致的。解决方案是设置全局env变量,避免重复附加线程,从而解决了内存泄露问题,但这也需要对线程调用接口有清晰了解,防止程序崩溃。

说起这个问题来就牛逼大了,俺弄了差不多两天才定位到。

 

jni内存泄露定位起来真特么麻烦,受不鸟

 

现象

先说一下结果吧,我是做在线视频应用的,数据得由C往Java层抛。俺在测试的时候发现拿一台机器跑几个小时候就木有内存了,报如下错误:

07-10 19:31:46.871: E/dalvikvm-heap(3756): Out of memory on a 126-byte allocation.
07-10 19:31:46.871: I/dalvikvm(3756): Can't dump thread 5041: threadObj not set
07-10 19:31:46.871: E/dalvikvm(3756): Out of memory: Heap Size=32775KB, Allocated=29914KB, Bitmap Size=0KB, Limit=32768KB
07-10 19:31:46.871: E/dalvikvm(3756): Extra info: Footprint=32711KB, Allowed Footprint=32775KB, Trimmed=468KB
07-10 19:31:46.871: W/dalvikvm(3756): Could not allocate message string "(null)" while throwing internal exception (Ljava/lang/OutOfMemoryError;)

 

然后哥就各种定位啊,你想啊,肯定不是视频数据的内存泄露,一来我使用了复用的内存块,二来如果是视频数据泄露,每一帧数据都有640*480这么大,跑一会儿就挂了,根本跑不了几小时。然后哥哥就各种查啊,吐槽一下MAT真特么难用,怎么就不学学人家Xcode上的instruments呢,反正我是分析半天没结果,后来各种注释代码之后,发现是jni层的问题。好了,最后发现居然是At

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值