android Jni AttachCurrentThread 内存泄露
来源:互联网 发布:思科的网络基线 编辑:程序博客网 时间:2024/04/29 18:15
说起这个问题来就牛逼大了,俺弄了差不多两天才定位到。
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层的问题。好了,最后发现居然是AttachCurrentThread这货的问题,尼玛,坑爹啊,这分明是Bug嘛。
按理来说,每次从C往Java抛数据都得这么干(我就写个大概意思就好了)
void paoshuju(char* buf, int size)
{
AttachCurrentThread
//在这儿copy内存啊之类的
//DetachCurrentThread
}
哥哥真的是这么干的呀,然后内存就华丽丽的泄露了,擦,真的是Bug
解决办法
好吧,我就搞个全局变量嘛,每个线程只AttachCurrentThread一次,存储env作为全局变量,然后线程结束的时候回来DetachCurrentThread
这样这个问题就解决了。
但是这样解决的后遗症就是必须得对每个接口调用的线程非常清楚,否则程序就会crash
- android Jni AttachCurrentThread 内存泄露
- android jni 内存泄露
- JNI - AttachCurrentThread
- jni开发 - JNI内存泄露
- jni内存泄露
- jni 内存泄露
- jni 内存泄露
- JNI内存泄露
- JNI层AttachCurrentThread与DetachCurrentThread
- 关于JNI内存泄露问题
- JNI开发之JNI内存泄露
- AttachCurrentThread
- Bad JNI version passed to AttachCurrentThread:
- android中JNI调用时内存分布以及内存泄露原因分析
- JNI内存泄露处理方法汇总
- android 内存泄露之jni local reference table overflow (max=512)
- Android 内存泄露
- android内存泄露 mat
- Wireshark基本介绍和学习TCP三次握手
- JSF项目中实现基于RBAC模型的权限管理设计
- 无病呻吟,把自己看透了已经。。。
- 多线程的代价
- Android桌面快捷方式的设置(二)
- android Jni AttachCurrentThread 内存泄露
- 如何创建并运行java线程
- android getSharedPreferences有两个参数
- HDOJ2149[巴什博弈]输出走法
- Android编译系统详解
- 竞态条件与临界区
- Using WebSocket in .NET 4.5 (Part 3)
- 线程安全与共享资源
- 大整数相加