说起这个问题来就牛逼大了,俺弄了差不多两天才定位到。
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

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

1万+

被折叠的 条评论
为什么被折叠?



