【发布时间】:2017-02-09 23:41:54
【问题描述】:
我正在创建一个在 jni 端处理非常大的图像的应用程序。通过非常大的图像,我的意思是几乎所有可用的设备 RAM 都被分配到几个大块中。问题是在分配和释放所有这些内存之后,相同的数量不再可用。
现在,您的第一个想法可能是这里显然存在内存泄漏!嗯,好像没有。我使用
分析了我的内存使用情况adb shell dumpsys meminfo (app package)
这些是我的结果:
处理前:
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 19736 19712 12 1268 36864 26663 10200
Dalvik Heap 15201 15176 0 3308 32992 16694 16298
期间:
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 889826 889804 8 1252 929792 914480 15311
Dalvik Heap 16769 16744 0 3308 33678 18541 15137
之后:
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 22234 22212 8 1252 45056 28468 16587
Dalvik Heap 16461 16436 0 3308 33871 17573 16298
之前和之后不太一样,但我也在活动之间移动,所以有噪音。
也有可能是数据处理一次后,不再有连续块可用的内存,但我还是不知道如何避免。
我可能会在单独的进程中使用服务来执行 jni 的工作并在之后终止该进程,但我尚未对此进行测试,因此它可能无法正常工作。重新启动应用程序并重新创建整个后台堆栈似乎可以解决问题,尽管这可能很难使其完全稳定,但它会使事情变慢,我真的不想这样做。
有人有更好的想法吗?
【问题讨论】:
-
我有一个非常相似的问题,tann36 你是怎么解决你的?
-
@petyr 我现在已经回答了我的问题
-
谢谢@tann36,不过我已经尝试过该解决方案,但没有任何改进。
标签: android memory java-native-interface