关于Android的内存释放的问题(实时大数据的JNI处理)
我用java来获取android的摄像头的数据,然后通过JNI来把这些数据传到下面的C进行压缩,但发现捕捉摄像头的数据再传输到JNI后,几秒钟后会出现内存溢出
void Java_com_video_getYUVData(JNIEnv *env,jobject obj,jbyteArray out)
{
buffer=(jbyte*)(*env)->GetByteArrayElements(env,out, 0);//如果这句话注释后,内存就正常
}
奇怪的是,如果加入 buffer=(jbyte*)(*env)->GetByteArrayElements(env,out, 0); 程序就会慢慢内存溢出错误。
02-11 20:53:38.774: I/dalvikvm-heap(7090): Clamp target GC heap from 49.515MB to 48.000MB
02-11 20:53:38.774: D/dalvikvm(7090): GC_FOR_ALLOC freed 31K, 2% free 48581K/49095K, paused 93ms
02-11 20:53:38.774: I/dalvikvm-heap(7090): Forcing collection of SoftReferences for 115216-byte allocation
02-11 20:53:38.994: I/dalvikvm-heap(7090): Clamp target GC heap from 49.513MB to 48.000MB
02-11 20:53:38.994: D/dalvikvm(7090): GC_BEFORE_OOM freed 1K, 2% free 48579K/49095K, paused 224ms
02-11 20:53:39.004: E/dalvikvm-heap(7090): Out of memory on a 115216-byte allocation.
02-11 20:53:39.004: I/dalvikvm(7090): "Binder Thread #2" prio=5 tid=10 RUNNABLE
02-11 20:53:39.004: I/dalvikvm(7090): | group="main" sCount=0 dsCount=0 obj=0x41059c18 self=0x1b70d0
02-11 20:53:39.004: I/dalvikvm(7090): | sysTid=7102 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1401160
02-11 20:53:39.004: I/dalvikvm(7090): | schedstat=( 820000000 960000000 1320 ) utm=64 stm=18 core=0
02-11 20:53:39.004: I/dalvikvm(7090): at dalvik.system.NativeStart.run(Native Method)
02-11 20:53:39.014: E/Camera-JNI(7090): Couldn't allocate byte array for JPEG data
不加的话,一切正常,真不知道怎么处理(jbyteArray out是上层的java传下来的)
void Java_com_video_getYUVData(JNIEnv *env,jobject obj,jbyteArray out)
{
buffer=(jbyte*)(*env)->GetByteArrayElements(env,out, 0);//如果这句话注释后,内存就正常
}
奇怪的是,如果加入 buffer=(jbyte*)(*env)->GetByteArrayElements(env,out, 0); 程序就会慢慢内存溢出错误。
02-11 20:53:38.774: I/dalvikvm-heap(7090): Clamp target GC heap from 49.515MB to 48.000MB
02-11 20:53:38.774: D/dalvikvm(7090): GC_FOR_ALLOC freed 31K, 2% free 48581K/49095K, paused 93ms
02-11 20:53:38.774: I/dalvikvm-heap(7090): Forcing collection of SoftReferences for 115216-byte allocation
02-11 20:53:38.994: I/dalvikvm-heap(7090): Clamp target GC heap from 49.513MB to 48.000MB
02-11 20:53:38.994: D/dalvikvm(7090): GC_BEFORE_OOM freed 1K, 2% free 48579K/49095K, paused 224ms
02-11 20:53:39.004: E/dalvikvm-heap(7090): Out of memory on a 115216-byte allocation.
02-11 20:53:39.004: I/dalvikvm(7090): "Binder Thread #2" prio=5 tid=10 RUNNABLE
02-11 20:53:39.004: I/dalvikvm(7090): | group="main" sCount=0 dsCount=0 obj=0x41059c18 self=0x1b70d0
02-11 20:53:39.004: I/dalvikvm(7090): | sysTid=7102 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1401160
02-11 20:53:39.004: I/dalvikvm(7090): | schedstat=( 820000000 960000000 1320 ) utm=64 stm=18 core=0
02-11 20:53:39.004: I/dalvikvm(7090): at dalvik.system.NativeStart.run(Native Method)
02-11 20:53:39.014: E/Camera-JNI(7090): Couldn't allocate byte array for JPEG data
不加的话,一切正常,真不知道怎么处理(jbyteArray out是上层的java传下来的)
...全文
相关推荐
安卓中实现jni读取内存信息
安卓中实现jni读取内存信息源代码
JNI引用管理:优化Android C++应用的性能和内存管理
及时创建和释放引用,避免长时间持有全局引用,并尽可能使用局部引用,这些都是有效的策略来优化JNI引用管理。JNI提供了三种类型的引用:局部引用(Local Reference)、全局引用(Global Reference)和弱全局引用(Weak Global Reference)。使用局部引用来避免过多全局引用:局部引用在JNI本地方法的执行期间有效,并且不会被垃圾回收器追踪。在JNI本地方法中,我们首先创建一个全局引用,然后使用它进行操作,最后释放该全局引用。弱全局引用是一种特殊类型的全局引用。
android jni 里面使用NewGlobalRef
自己写了一个代码,在jni里面,使用全局引用变量
Android JNI图像处理经典例子
通过JNI试用C语言对图像进行处理,灰度化,二值化,求边缘等。对Android开发人员很有帮助,值得参考。
Android代码-MemoryClean安卓内存清理
MemoryClean


