安卓应用程序:我怎么能用完内存,只剩下20-100MB



我正在开发一个压力测试工具,其中一个设计场景是耗尽内存,只为测试中的应用程序和其他应用程序留下几兆内存。通过在互联网上搜索这个主题,我了解到Android Dalvik vm将程序分配限制在16MB、24MB或32MB。但我确实意识到一些应用程序可以保留高达80MB的内存。那么这个想法合理吗?如果是,如何实现这一目标。

提前感谢,Forrest

我会使用一个或多个服务来消耗内存。这篇文章告诉我们在不需要的时候让服务运行是最糟糕的内存管理错误之一:

https://developer.android.com/training/articles/memory.html#Services

这一条告诉我们哪个进程最后被终止:

http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

此外,我会使用前台活动来杀死测试中的应用程序(看看数据是否存在):当内存已经分配给服务时,前台活动会杀死后台活动。

Android是一个Linux,所以您可以使用/proc/$PID/maps之类的东西(请参阅此处)。

知道你将使用什么很有趣,所以请在解决问题后回答你自己的问题。

谢谢你的跟进。现在我相信我已经得到了这个问题的答案。

一般来说,我们不能依靠一个应用程序/服务来耗尽整个系统的RAM。Andoid应用程序在Dalvik vm中运行,每个应用程序或服务都有上限。它也被称为最大堆大小限制。不同的手机有不同的限制堆大小:

  • 华为U9508:256MB安卓4.0.4
  • 魅族MX3:192MB安卓4.2.1*ll

我们可以通过以下代码获得此堆大小:

Runtime.getRuntime().maxMemory();

安卓服务也属于这一规则,堆大小限制与普通应用程序相同。最初,android操作系统会给应用程序一个相对较小的堆,当应用程序达到容量时,内存管理器会自动增加堆的大小。稍后,如果应用程序达到堆大小限制,您将得到OutOfMemoryError。请参阅以下日志(复制到文本编辑器以更好地阅读):

02-15 09:22:25.438:D/dalvikvm(9992):GC_FOR_ALLOC释放140K,11%释放2943K/320K,暂停11ms,总计11ms02-15 09:22:25.478:I/dalvikvm堆(9992):将堆(frag大小写)增加到27.059MB,分配25165840字节02-15 09:22:25.478:D/dalvikvm(9992):threadid=1:撤消后仍然挂起(sc=1 dc=1)02-15 09:22:25.488:D/dalvikvm(9992):threadid=1:撤消后仍然挂起(sc=1 dc=1)02-15 09:22:25.488:D/dalvikvm(9992):GC_CONCURRENT释放15K,2%释放27504K/27860K,暂停1ms+2ms,总计13ms02-15 09:22:25.488:D/dalvikvm(9992):WAIT_FOR_CONCURRENT_GC被阻止12ms02-15 09:22:43.758:我/编舞(9992):跳过了1100帧!应用程序可能在其主线程上做了太多的工作。02-15 09:22:43.913:D/dalvikvm(9992):GC_FOR_ALLOC释放2K,2%释放27504K/27856K,暂停25ms,总计25ms02-15 09:22:43.963:I/dalvikvm堆(9992):将堆(frag大小写)增加到51.044MB,分配25165840字节02-15 09:22:43.978:D/dalvikvm(9992):GC_FOR_ALLOC释放<1K,1%免费52080K/52436K,暂停14ms,总计14ms02-15 09:22:43.998:D/dalvikvm(9992):GC_CONCURRENT释放<1K,1%空闲52080K/52436K,暂停2ms+4ms,总计21ms02-15 09:22:52.578:D/dalvikvm(9992):GC_FOR_ALLOC释放4K,1%释放52080K/52432K,暂停12ms,总计12ms02-15 09:22:52.613:I/dalvikvm堆(9992):将堆(frag大小写)增加到75.044MB,分配25165840字节02-15 09:22:52.633:D/dalvikvm(9992):GC_CONCURRENT释放0K,1%释放76656K/77012K,暂停3ms+4ms,总计20ms02-15 09:22:52.633:D/dalvikvm(9992):WAIT_FOR_CONCURRENT_GC被阻止17ms02-15 09:22:52.633:D/dalvikvm(9992):WAIT_FOR_CONCURRENT_GC被阻止17ms02-15 09:22:55.198:D/dalvikvm(9992):GC_FOR_ALLOC释放1K,1%释放76656K/77012K,暂停13ms,总计13ms02-15 09:22:55.233:I/dalvikvm堆(9992):将堆(frag大小写)增加到99.044MB以进行25165840字节的分配02-15 09:22:55.253:D/dalvikvm(9992):GC_CONCURRENT释放0K,1%释放101232K/101592K,暂停1ms+5ms,总计17ms02-15 09:22:55.253:D/dalvikvm(9992):WAIT_FOR_CONCURRENT_GC被阻止17ms02-15 09:22:55.253:D/dalvikvm(9992):WAIT_FOR_CONCURRENT_GC被阻止17ms02-15 09:22:56.438:D/dalvikvm(9992):GC_FOR_ALLOC释放<1K,1%空闲101232K/101592K,暂停17ms,总计17ms02-15 09:22:56.478:I/dalvikvm堆(9992):将堆(frag大小写)增加到123.044MB以进行25165840字节的分配02-15 09:22:56.493:D/dalvikvm(9992):GC_FOR_ALLOC释放0K,1%释放125808K/126172K,暂停18ms,总计18ms02-15 09:22:56.523:D/dalvikvm(9992):GC_CONCURRENT释放<1K,1%空闲125808K/126172K,暂停2ms+7ms,总计27ms02-15 09:22:57.458:D/dalvikvm(9992):GC_FOR_ALLOC释放<1K,1%空闲125808K/126172K,暂停17ms,总计18ms02-15 09:22:57.493:I/dalvikvm堆(9992):将堆(frag大小写)增加到147.044MB,分配25165840字节02-15 09:22:57.513:D/dalvikvm(9992):GC_FOR_ALLOC释放0K,1%释放150384K/150752K,暂停18ms,总计18ms02-15 09:22:57.543:D/dalvikvm(9992):释放GC_CONCURRENT<1K,1%空闲150384K/150752K,暂停3ms+7ms,总计29ms02-15 09:22:58.668:D/dalvikvm(9992):GC_FOR_ALLOC释放<1K,1%空闲150384K/150752K,暂停17ms,总计17ms02-15 09:22:58.708:I/dalvikvm堆(9992):将堆(frag大小写)增加到171.044MB,用于25165840字节的分配02-15 09:22:58.733:D/dalvikvm(9992):GC_FOR_ALLOC释放0K,1%释放174960K/175332K,暂停24ms,总计24ms02-15 09:22:58.768:D/dalvikvm(9992):GC_CONCURRENT释放<1K,1%空闲174960K/175332K,暂停2ms+11ms,总计36ms02-15 09:22:59.718:D/dalvikvm(9992):GC_FOR_ALLOC释放<1K,1%空闲174960K/175332K,暂停35ms,总计35ms02-15 09:22:59.718:I/dalvikvm堆(9992):强制收集用于25165840字节分配的SoftReferences02-15 09:22:59.778:D/dalvikvm(9992):GC_BEFORE_OM释放10K,1%释放174950K/175332K,暂停58ms,总计58ms02-15 09:22:59.778:E/dalvikvm堆(9992):25165840字节分配内存不足。02-15 09:22:59.778:I/dalvikvm(9992):"主要"prio=5 tid=1可运行02-15 09:22:59.778:I/dalvikvm(9992):| group="main"sCount=0 dsCount=0 obj=0x40dd19a0 self=0x40bc601002-15 09:22:59.778:I/dalvikvm(9992):|sysTid=9992 nice=0 sched=0/0 cgrp=应用程序句柄=107450466802-15 09:22:59.778:I/dalvikvm(9992):|状态=R schedstat=(0 0 0)utm=295 stm=49 core=002-15 09:22:59.778:I/dalvikvm(9992):在com.jdmobile.strestresstestingutility.MainActivity$2.onClick(MainActivity.java:~148)02-15 09:22:59.778:I/dalvikvm(9992):在android.view.view.performClick(view.java:4203)02-15 09:22:59.778:I/dalvikvm(9992):在android.view.view$PerformClick.run(view.java:17556)02-15 09:22:59.778:I/dalvikvm(9992):在android.os.Handler.handleCallback(Handler.java:725)02-15 09:22:59.778:I/dalvikvm(9992):在android.os.Handler.dispatchMessage(Handler.java:92)02-15 09:22:59.778:I/dalvikvm(9992):在android.os.Looper.loop(Looper.java:137)02-15 09:22:59.778:I/dalvikvm(9992):在android.app.ActivityThread.main(ActivityThreads.java:5105)02-15 09:22:59.778:I/dalvikvm(9992):位于java.lang.reflect.Method.invokeNative(Native Method)02-15 09:22:59.778:I/dalvikvm(9992):在java.lang.reflect.Method.ioke(Method.java:511)02-15 09:22:59.778:I/dalvikvm(9992):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)02-15 09:22:59.778:I/dalvikvm(9992):在com.android.internal.os.ZygoteInit.main(ZygoteNit.java:560)02-15 09:22:59.778:I/dalvikvm(9992):在dalvik.system.NativeStart.main(本地方法)02-15 09:23:52.643:D/AndroidRuntime(9992):关闭VM

另一个内存分配限制是一块内存(没有碎片):16MB、24MB或更大,请参阅这段代码演示,ActivityManager:

/**
* Return the approximate per-application memory class of the current
* device.  This gives you an idea of how hard a memory limit you should
* impose on your application to let the overall system work best.  The
* returned value is in megabytes; the baseline Android memory class is
* 16 (which happens to be the Java heap limit of those devices); some
* device with more memory may return 24 or even higher numbers.
*/
public int getMemoryClass() {
return staticGetMemoryClass();
}

相关内容

最新更新