【问题标题】:How can I force memory pressure for Android debugging?如何强制进行 Android 调试的内存压力?
【发布时间】:2013-03-23 15:38:58
【问题描述】:

我正在尝试解决我的 Android 应用遇到的一些问题,我认为这些问题与我在显式“前台”模式 (Service.startForeground) 下运行时的内存压力有关。

为了调试它,我需要对我的应用程序施加内存压力,我可以通过各种方式来做到这一点,例如启动各种其他应用程序,例如带有大量网页的 Firefox。然而,这并不理想,因为它仍然相当耗时且不精确。所以我的问题是,有没有办法使用调试器(例如在 Eclipse 下)或专门为此目的的特殊应用程序来强制内存压力?我宁愿不绕道自己写一个,显然在我自己的应用程序中分配内存是行不通的。

更新:更改标题以反映我需要设备上的实际内存压力,而不是在仿真中。

【问题讨论】:

  • 阅读 (stackoverflow.com/questions/1483047/…) 或 (stackoverflow.com/questions/3656594/…) 并享受您的问题作为副本关闭。
  • 这些问题似乎与在模拟器中模拟低内存有关。我没有使用模拟器(由于我正在记录各种传感器并且现阶段不适合模拟),我需要在实际设备上模拟实际的低内存。 (也许模拟是错误的词,我实际上需要创建一个低内存条件)。
  • 那为什么不交叉编译一个占用内存的小二进制文件呢?一个调用malloc 然后是循环。
  • 我想我可能不得不这样做。我希望某些东西已经存在以节省一些时间。
  • 用 Java 应用程序给内存施压不是无稽之谈吗?考虑 JVM 沙箱和 GC?

标签: android debugging memory


【解决方案1】:

编辑:(考虑到 Christoph 的评论)

您可以制造人为的记忆压力。为此,请在 MainActivity 中创建一个按钮。然后,在按钮的onClick 方法中,创建10,000 个对象(实验不同数量的对象)。然后,在您的应用运行时,多次单击该按钮,这会造成很大的内存压力。

代码可能如下所示:

class MainActivity {
    ArrayList<String> stringArray = new ArrayList<>();

    ...

    public void click(View view) {
        // Add 10,000 String objects to Array List

        for (int i = 0; i < 10000; i++) {
        stringArray.add("A string");
        }
    }
}

假设您将按钮的onClick XML 属性设置为click

【讨论】:

  • 就其本身而言,这与浏览器并不完全相同,因为 Firefox 绕过了堆大小的限制,并且对内存的压力远远超过单个应用程序所能承受的压力。但是,这给了我一个想法……
  • 您将需要分配更大的数组来产生严重的内存压力。这种方法将为数组的每个 String 元素使用约 44 个字节,或者每次按下按钮时使用大约 44 kB。在我的例子中,我需要创建一个长度为 ~10^8 的数组,以便在单击时生成一个OutOfMemoryError
  • 这不是最糟糕的想法 - 但是,它不会以这种方式工作。您不保留对您的数组的任何引用,因此它将被垃圾收集。要完成这项工作:有一个 ArrayList 列表;在你的活动中。有一个 for 循环,循环 200 次在每个循环中,将 new String(100000) 添加到列表中 4-5 Clicks = 200 MB = OutOfMemory on a M7 (HTC)
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 2021-02-05
  • 2015-02-22
  • 2012-05-19
  • 2013-10-15
  • 2012-05-20
  • 2011-12-08
  • 2012-06-05
相关资源
最近更新 更多