我正在开发一个用于实时目的的应用程序。为了解决非线性优化问题,我集成了Java解算器jcobyla(https://github.com/cureos/jcobyla)。每次解算器运行时,垃圾收集器都会在重要的运行时间内完成大量工作:
02-09 12:58:16.822: V/onCreate(7061): maxMemory:512524288k
02-09 13:04:23.127: D/dalvikvm(7061): GC_FOR_ALLOC freed 10314K, 40% free 17304K/28544K, paused 16ms, total 16ms
02-09 13:04:23.177: D/dalvikvm(7061): GC_FOR_ALLOC freed 3437K, 34% free 17304K/26196K, paused 11ms, total 11ms
02-09 13:04:23.222: D/dalvikvm(7061): GC_FOR_ALLOC freed 3437K, 34% free 17304K/26196K, paused 10ms, total 10ms
02-09 13:04:23.322: D/dalvikvm(7061): GC_FOR_ALLOC freed 10304K, 33% free 17303K/25452K, paused 18ms, total 18ms
>02-09 13:04:23.367: D/dalvikvm(7061): GC_FOR_ALLOC freed 3437K, 33% free 17303K/25452K, paused 11ms, total 11ms
02-09 13:04:23.417: D/dalvikvm(7061): GC_FOR_ALLOC freed 3437K, 33% free 17303K/25452K, paused 12ms, total 12ms
02-09 13:04:23.522: D/dalvikvm(7061): GC_FOR_ALLOC freed 10304K, 40% free 17304K/28540K, paused 16ms, total 17ms
02-09 13:04:23.567: D/dalvikvm(7061): GC_FOR_ALLOC freed 3437K, 34% free 17304K/26196K, paused 11ms, total 11ms
02-09 13:04:23.612: D/dalvikvm(7061): GC_FOR_ALLOC freed 3437K, 34% free 17304K/26196K, paused 11ms, total 11ms
我尝试了很多东西来防止GC运行。相信求解器达到应用程序的最大堆限制,我使用android:largeHeap="true"
。在一个单独的过程中运行求解器并没有解决它。
正如您在上面的LogTag中看到的,应用程序的最大堆限制大约为512MB,对于jcobyla来说已经足够了(需要大约300MB)。 GC告诉我跑完后有34%的免费24.85 MB。运行jcobyla时应用程序的总RAM使用量约为20 MB。
为什么限制GC显示与应用程序的最大堆限制不同?
如何增加求解器的可能内存使用量?
如何阻止GC运行?
答案 0 :(得分:2)
每次解算器运行时,垃圾收集器都会使用重要的运行时进行大量工作
GC_FOR_ALLOC
表示如果没有一轮GC并且可能扩展堆,则无法满足分配内存的请求。
对于jcobyla来说绰绰有余(需要大约300MB)
我不知道你是如何确定的,特别是对于Android。此外,您自己的分析声称情况并非如此,否则您的堆将增长到至少300MB,而且还没有这样做。
为什么限制GC显示与应用程序的最大堆限制不同?
因为堆没有增长到极限。目标是最小化过程的系统RAM占用空间。进程越大,Android就越需要终止其他进程以使所有内容适合系统RAM。这会损害用户体验,例如多任务处理。
如何增加求解器的可能内存使用量?
根据您的分析,您无需增加求解器的可能内存使用量。
如何阻止GC运行?
停止使用使用GC的编程语言,或停止Android编程并切换到某些桌面操作系统。
您的应用是Android的众多应用之一,并且它是任何特定Android设备中的众多应用之一。 Android设备可以拥有非常少的系统内存 - 例如,Android One设备可能只有512MB的RAM。这适用于操作系统和所有正在运行的应用程序进程,而不仅仅是为了您。 Android,特别是Dalvik / ART,围绕一个合作模型构建,每个进程都试图最小化其内存消耗。
可是:
如果您使用NDK在C / C ++中编写应用程序,不仅没有GC,而且没有堆限制,除了用户认为您的应用程序对其设备有害的净效果到它使用的系统RAM量
如果您为其他操作系统编写应用程序,您将受制于该操作系统的内存管理策略,而桌面操作系统更可能允许您更积极地使用系统RAM