gpt4 book ai didi

android - 为什么垃圾收集器在未达到最大堆限制的情况下运行?

转载 作者:行者123 更新时间:2023-11-29 20:53:35 26 4
gpt4 key购买 nike

我正在开发一个用于实时目的的应用程序。为了解决非线性优化问题,我集成了 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 运行?

最佳答案

Every time the solver runs the Garbage Collector is doing a lot of work with a significant runtime

GC_FOR_ALLOC 意味着如果没有一轮 GC 并且可能会扩展堆,您分配内存的请求将无法实现。

wich is more than enough for jcobyla (needs about 300MB)

我不知道您是如何确定的,尤其是对于 Android。此外,您自己的分析声称情况并非如此,否则您的堆会增长到至少 300MB,但事实并非如此。

Why does the limit GC shows differ from the max heap limit of the app?

因为堆还没有增长到极限。目标是最小化进程的系统 RAM 占用空间。进程越大,Android 就越有必要终止其他进程以使所有内容都适合系统 RAM。这会损害用户体验,例如多任务处理。

How to increase the possible memory usage for the solver?

根据您的分析,您不需要增加求解器可能使用的内存。

How can I prevent GC from running?

停止使用利用 GC 的编程语言,或停止为 Android 编程并切换到某些桌面操作系统。

您的应用是适用于 Android 的众多应用之一,也是任何给定 Android 设备上的众多应用之一。 Android 设备的系统 RAM 可能非常小——例如,Android One 设备可能只有 512MB 的 RAM。这适用于操作系统和所有正在运行的应用程序进程,而不仅仅是您。 Android,尤其是 Dalvik/ART,是围绕协作模型构建的,其中每个进程都试图最大限度地减少其内存消耗。

但是:

  • 如果您使用 NDK 在 C/C++ 中编写您的应用程序,不仅没有 GC,而且您没有堆限制,除了用户认为您的应用程序对他们的设备有害的净效应之外到它使用的系统 RAM 量

  • 如果您为其他操作系统编写应用程序,您将受制于该操作系统的内存管理策略,而桌面操作系统更有可能允许您更积极地使用系统 RAM

关于android - 为什么垃圾收集器在未达到最大堆限制的情况下运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com