我正在研究一种压力测试工具,其中一个设计方案就是耗尽内存,只为待测应用程序和其他应用程序留下几个mega。 通过在互联网上搜索这个主题,我了解到Android Dalvik vm限制程序分配为16MB,24MB或32MB。但我确实知道一些应用程序可以保留高达80 MB的内存。那个想法合理吗?如果是的话,如何实现这一目标。
提前谢谢, 福雷斯特答案 0 :(得分:0)
我会使用一个或多个服务来消耗内存。 本文告诉我们在不需要服务时让服务运行是最糟糕的内存管理错误之一:
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
(see here)之类的内容。
知道你将使用什么很有趣,所以在你解决问题后请回答你自己的问题。
答案 1 :(得分:0)
感谢跟进我。现在我相信我得到了这个问题的答案。
一般来说,我们不能依赖一个应用程序/服务来占用整个系统RAM。 Andoid应用程序在Dalvik vm中运行,每个应用程序或服务都有一个上限。它也称为最大堆大小限制。不同的手机具有不同的限制堆大小:
- 华为U9508:256MB android 4.0.4
- 魅族MX3:192MB android 4.2.1 * ll
我们可以通过代码得到这个堆大小:
Runtime.getRuntime().maxMemory();
Android Service也属于此规则,堆大小限制与普通应用程序相同。 最初,android os给应用程序一个相对较小的堆,当应用程序达到容量时,内存管理器将自动增加堆大小。稍后,如果app达到堆大小限制,您将获得OutOfMemoryError。请参阅下面的日志(复制到文本编辑器以获得更好的阅读):
02-15 09:22:25.438:D / dalvikvm(9992):GC_FOR_ALLOC释放140K,11%免费2943K / 3280K,暂停11ms,总计11ms 02-15 09:22:25.478:I / dalvikvm-heap(9992):将堆(frag case)增长到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,总计13ms 02-15 09:22:25.488:D / dalvikvm(9992):WAIT_FOR_CONCURRENT_GC阻塞了12ms 02-15 09:22:43.758:I / Choreographer(9992):跳过1100帧!应用程序可能在其主线程上做了太多工作。 02-15 09:22:43.913:D / dalvikvm(9992):GC_FOR_ALLOC释放2K,2%释放27504K / 27856K,暂停25ms,总计25ms 02-15 09:22:43.963:I / dalvikvm-heap(9992):将堆(frag case)增长到51.044MB,用于25165840字节分配 02-15 09:22:43.978:D / dalvikvm(9992):GC_FOR_ALLOC释放&lt; 1K,1%free 52080K / 52436K,暂停14ms,总计14ms 02-15 09:22:43.998:D / dalvikvm(9992):GC_CONCURRENT释放&lt; 1K,1%free 52080K / 52436K,暂停2ms + 4ms,总计21ms 02-15 09:22:52.578:D / dalvikvm(9992):GC_FOR_ALLOC释放4K,1%空闲52080K / 52432K,暂停12ms,总计12ms 02-15 09:22:52.613:I / dalvikvm-heap(9992):将堆(frag case)增长到75.044MB,用于25165840字节分配 02-15 09:22:52.633:D / dalvikvm(9992):GC_CONCURRENT释放0K,1%空闲76656K / 77012K,暂停3ms + 4ms,总计20ms 02-15 09:22:52.633:D / dalvikvm(9992):WAIT_FOR_CONCURRENT_GC阻止17ms 02-15 09:22:52.633:D / dalvikvm(9992):WAIT_FOR_CONCURRENT_GC阻止17ms 02-15 09:22:55.198:D / dalvikvm(9992):GC_FOR_ALLOC释放1K,1%空闲76656K / 77012K,暂停13ms,总计13ms 02-15 09:22:55.233:I / dalvikvm-heap(9992):将堆(frag case)增长到99.044MB,用于25165840字节分配 02-15 09:22:55.253:D / dalvikvm(9992):GC_CONCURRENT释放0K,1%释放101232K / 101592K,暂停1ms + 5ms,总计17ms 02-15 09:22:55.253:D / dalvikvm(9992):WAIT_FOR_CONCURRENT_GC阻止17ms 02-15 09:22:55.253:D / dalvikvm(9992):WAIT_FOR_CONCURRENT_GC阻止17ms 02-15 09:22:56.438:D / dalvikvm(9992):GC_FOR_ALLOC释放&lt; 1K,1%free 101232K / 101592K,暂停17ms,总计17ms 02-15 09:22:56.478:I / dalvikvm-heap(9992):将堆(frag case)增长到123.044MB,用于25165840字节分配 02-15 09:22:56.493:D / dalvikvm(9992):GC_FOR_ALLOC释放0K,1%释放125808K / 126172K,暂停18ms,总计18ms 02-15 09:22:56.523:D / dalvikvm(9992):GC_CONCURRENT释放&lt; 1K,1%free 125808K / 126172K,暂停2ms + 7ms,总计27ms 02-15 09:22:57.458:D / dalvikvm(9992):GC_FOR_ALLOC释放&lt; 1K,1%free 125808K / 126172K,暂停17ms,总计18ms 02-15 09:22:57.493:I / dalvikvm-heap(9992):将堆(frag case)增长到147.044MB,用于25165840字节分配 02-15 09:22:57.513:D / dalvikvm(9992):GC_FOR_ALLOC释放0K,1%释放150384K / 150752K,暂停18ms,总计18ms 02-15 09:22:57.543:D / dalvikvm(9992):GC_CONCURRENT释放&lt; 1K,1%free 150384K / 150752K,暂停3ms + 7ms,总计29ms 02-15 09:22:58.668:D / dalvikvm(9992):GC_FOR_ALLOC释放&lt; 1K,1%free 150384K / 150752K,暂停17ms,总计17ms 02-15 09:22:58.708:I / dalvikvm-heap(9992):将堆(frag case)增长到171.044MB,用于25165840字节分配 02-15 09:22:58.733:D / dalvikvm(9992):GC_FOR_ALLOC释放0K,1%免费174960K / 175332K,暂停24ms,总计24ms 02-15 09:22:58.768:D / dalvikvm(9992):GC_CONCURRENT释放&lt; 1K,1%free 174960K / 175332K,暂停2ms + 11ms,总计36ms 02-15 09:22:59.718:D / dalvikvm(9992):GC_FOR_ALLOC释放<1K,1%免费174960K / 175332K,暂停35ms,总计35ms 02-15 09:22:59.718:I / dalvikvm-heap(9992):强制收集25165840字节分配的SoftReferences 02-15 09:22:59.778:D / dalvikvm(9992):GC_BEFORE_OOM释放10K,1%免费174950K / 175332K,暂停58ms,总计58ms 02-15 09:22:59.778:E / dalvikvm-heap(9992):25165840字节分配的内存不足。 02-15 09:22:59.778:I / dalvikvm(9992):&#34; main&#34; prio = 5 tid = 1 RUNNABLE 02-15 09:22:59.778:I / dalvikvm(9992):|基团=&#34;主&#34; sCount = 0 dsCount = 0 obj = 0x40dd19a0 self = 0x40bc6010 02-15 09:22:59.778:I / dalvikvm(9992):| sysTid = 9992 nice = 0 sched = 0/0 cgrp = apps handle = 1074504668 02-15 09:22:59.778:I / dalvikvm(9992):| state = R schedstat =(0 0 0)utm = 295 stm = 49 core = 0 02-15 09:22:59.778:I / dalvikvm(9992):at com.jdmobile.stresstestingutility.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(ActivityThread.java:5105) 02-15 09:22:59.778:I / dalvikvm(9992):at java.lang.reflect.Method.invokeNative(Native Method) 02-15 09:22:59.778:I / dalvikvm(9992):at java.lang.reflect.Method.invoke(Method.java:511) 02-15 09:22:59.778:I / dalvikvm(9992):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 02-15 09:22:59.778:I / dalvikvm(9992):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 02-15 09:22:59.778:I / dalvikvm(9992):at dalvik.system.NativeStart.main(Native Method) 02-15 09:23:52.643:D / AndroidRuntime(9992):关闭虚拟机
另一个内存分配限制是一块内存(没有片段):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();
}