【问题标题】:android - completely clearing memory used by jniandroid - 完全清除 jni 使用的内存
【发布时间】: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


【解决方案1】:

原来问题在于释放的内存显然必须被垃圾回收。

虽然使用 meminfo 调用似乎意味着所有内存都已释放,但调用本身触发了垃圾收集。在我的处理完成后但在调用 meminfo 之前,内存不可用。

我通过致电System.gc() 设法让一切正常。我知道不建议这样做,据说只是对系统的建议,但它似乎确实解决了问题。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2021-01-14
    • 2015-04-29
    • 1970-01-01
    • 2017-03-16
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多