【问题标题】:How to determine the Android Max heap the vendor has set it to如何确定供应商设置的 Android Max 堆
【发布时间】:2017-06-30 04:14:10
【问题描述】:

我已经用谷歌搜索,但似乎无法找到如何确定供应商已将 Android java 堆设置为的最大堆。我知道如何从这个很棒的线程中获取应用程序应该使用的最大堆和最大堆: Android heap size on different phones/devices and OS versions

但是当我运行这两种方法并将结果与​​ Android Studio Memory Profiler gc 的结果进行比较时,它是 ActivityManager getMemoryClass 所说值的一半。所以我怀疑供应商将其设置为低于该值。我有一台 LG G4,getMemoryClass 显示为 256MB,但我发现 GC 发生在 128MB 左右。

【问题讨论】:

  • 嗯,垃圾回收不会等到你达到堆限制。毕竟,设备上还有其他应用程序在争夺相同的内存。
  • 谢谢,我知道对于 Oracle JVM,它有一个公式,似乎在收集时指示 90% 的最大值。我看到了一个不错的锯齿波形,但它永远不会超过 128MB。我的应用程序确实使用了很多应该超过 128MB 的图像,但我从来没有看到这种情况发生。不过我会仔细看的。
  • 我进行了压力测试,果然有 128MB 的硬限制。我正在尝试根据可用堆而不是从配置文件中获取某些内容来调整内存使用情况。如果供应商设置的限制不是基于上面链接中提到的两种方法,我想以编程方式知道那是什么。
  • 我想知道最大堆是否意味着java加本机?

标签: android memory heap-memory


【解决方案1】:

好的。我得到了 android:largeHeap="true" 来工作,这正是我所需要的。似乎我必须在我的 Main Activity 类中添加以下语句。 ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE); am.getLargeMemoryClass();

【讨论】:

    【解决方案2】:

    您是否尝试过清单中的android:largeHeap。此标志向系统表明您的应用程序可能需要比分配给常规应用程序的内存堆更大的内存堆。但是,系统会根据设备上可用的总体内存大小进行最终调用。谷歌文档说 -

    机器人:大堆

    您的应用程序的进程是否应该 使用大型 Dalvik 堆创建。这适用于所有流程 为应用程序创建。仅适用于第一次申请 加载到进程中;如果您使用共享用户 ID 来允许 多个应用程序要使用一个进程,它们都必须使用此选项 始终如一,否则他们将产生不可预测的结果。大多数应用程序应该 不需要这个,而是应该专注于减少他们的整体 内存使用以提高性能。启用此功能也不会 保证可用内存的固定增加,因为某些设备 受到总可用内存的限制。

    要在运行时查询可用内存大小,请使用方法 getMemoryClass() 或 getLargeMemoryClass()。

    因此,出于您的目的,既然您需要更大的堆,这肯定会有所帮助。 现在这显然不能回答问题,为什么getMemoryClass 返回 256 MB 而垃圾收集发生在 128 MB(可能是系统保持的缓冲区太宽)。我建议你在ActivityManager 上打印另一个方法的返回值getLargeMemoryClass。这连同转向largeHeap 可能会提供一些线索

    【讨论】:

    • 我试过 android:largeHeap 并没有导致内存限制改变。我听说这只是一个请求,设备不必遵守。也确实使用了 getLargeMemoryClass,它返回 512MB 或双倍的 getMemoryClass()。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2021-05-21
    • 2015-08-27
    • 2015-11-14
    • 1970-01-01
    • 2012-04-22
    • 2015-06-10
    相关资源
    最近更新 更多