[Android]解决Android模拟器启动失败Failed to allocate memory: 8…This Application…Please Contact…

文章详细介绍了在Windows 7 64位系统中使用Eclipse运行Android模拟器时遇到的问题及解决方案。当模拟器分辨率设置超过400×800时,会出现内存分配失败的情况。作者通过将模拟器内存RAM大小设置为低于1024MB(如512MB),成功解决了问题。

I create an Android Emulator in Version Android 4.2.2, and the Android Vitual Device Manager distributes the Memory Options: RAM 1024……

However, when I try to run my Android Emulator from eclipse, it didn't  start successfully! The Console showed Errors following:

----------------------------------------------------------------------------------------------------------------------------
Failed to allocate memory: 8
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

----------------------------------------------------------------------------------------------------------------------------


At first, I found a situation in a 优快云 blog http://blog.youkuaiyun.com/wbw1985/article/details/8500226(wbw1985) 

<p style="margin-top: 0px; margin-bottom: 1em; padding-top: 0px; padding-bottom: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif;">This following solution worked for me. In the following configuration file:</p><pre class="default prettyprint prettyprinted" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">C</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">:</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">\Users\<user</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">></span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">\.android\avd\<avd</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">-</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">profile</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">-</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">name</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">>.</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">avd\config</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">.</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">ini</span></code>

Replace

<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">hw</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">.</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">ramSize</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">=</span><span class="lit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: rgb(128, 0, 0);">1024</span></code>

by

<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">hw</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">.</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">ramSize</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">=</span><span class="lit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: rgb(128, 0, 0);">1024MB</span></code>
 What regretful! It didn't work at all. 


Then, I found another blog online http://www.cnblogs.com/devilcoder/archive/2013/01/28/2879416.html(DevilCoder)

The reason is:

In the Windows7 System 64bit,if you have created an Emulator with a resolution larger than 400×800, then, when you start the Emulator in Eclipse, it will occur such a problem(x64的Win7,发现在Eclipse上启动模拟器的时候存在问题,当设置的模拟器分辨率大于400×800的时候会出现).

A Simple and effective method is to set the RAM smaller than 1024, such as 512 best as I did when create an Emulator(直接在新建模拟器的时候把它的内存RAM设置在1024以下就可以,最好设置成512).

Shown following figure:



It is resolved succesfully! 


<think>嗯,用户问的是“Failed to map memory: Cannot allocate memory”这个错误。我得先理解这个错误通常出现在什么情况下。可能是在程序运行的时候,尤其是在需要大量内存的时候出现的。比如,用户可能在运行一个需要分配大内存块的应用程序,或者系统资源已经用尽了。 首先,我得考虑内存映射失败的原因。内存映射通常涉及虚拟内存到物理内存或交换空间的分配。如果系统无法分配,可能有几个原因:物理内存和交换空间都不足,或者进程达到了内存限制,比如ulimit设置的限制。 接下来,需要解释错误信息的具体含义。当程序尝试使用mmap等系统调用分配内存时,内核会检查可用资源。如果无法满足请求,就会返回ENOMEM错误,导致这个提示。这时候,用户可能需要检查系统的内存使用情况,使用free -h或者top命令查看。 然后,想到可能的解决方案。比如增加交换空间,关闭不需要的程序,调整内存限制,或者检查是否有内存泄漏。如果是32位系统,还要考虑地址空间限制的问题。另外,像Docker这样的容器环境可能有自己的内存限制,也需要检查。 用户可能需要分步骤的指导,所以应该列出常见的解决方法,并简明扼要地说明每一步的操作,比如如何创建交换文件,如何修改ulimit等。同时,提醒用户根据具体情况选择适合的方法,比如如果是应用程序本身的问题,可能需要优化代码。 还要注意用户的技术水平,避免使用过于专业的术语,但又要准确。比如解释OOM Killer的作用,或者交换空间的作用,让用户明白为什么这些方法有效。 最后,确保回答结构清晰,分点列出原因和解决方案,方便用户一步步排查问题。同时,检查是否有遗漏的情况,比如虚拟内存地址空间耗尽的情况,特别是32位系统的限制,或者进程配置的内存限制。</think>`Failed to map memory: Cannot allocate memory` 是一个操作系统级别的错误提示,通常出现在程序尝试分配内存但系统无法满足请求时。以下是逐步分析及解决方案: --- ### **错误原因** 1. **物理内存耗尽** - 系统物理内存(RAM)和交换空间(Swap)均被占满。 - 可用内存不足导致内核拒绝新的内存分配请求。 2. **进程资源限制** - 用户或进程的 `ulimit` 设置限制了最大内存使用量。 - 通过 `ulimit -v` 可查看当前虚拟内存限制。 3. **内存碎片化** - 长期运行的系统中,内存碎片可能导致无法分配连续的大块内存。 4. **32位系统限制** - 32位应用程序的地址空间有限(通常每个进程最多 3-4GB),无法映射更大内存。 5. **内核参数限制** - `/proc/sys/vm/overcommit_memory` 的配置影响了内存分配策略。 - 默认值允许超量分配(overcommit),但某些严格模式下会直接拒绝。 --- ### **解决方案** #### 1. 检查系统内存状态 ```bash free -h # 查看内存和交换空间使用情况 top 或 htop # 监控进程内存占用 dmesg | grep -i oom # 检查内核是否触发了 OOM Killer ``` #### 2. 释放内存 - 关闭不必要的进程。 - 清理缓存(慎用): ```bash sync && echo 3 | sudo tee /proc/sys/vm/drop_caches ``` #### 3. 扩展交换空间 ```bash # 创建交换文件(例如 4GB) sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 永久生效(写入 /etc/fstab) echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` #### 4. 调整进程限制 临时修改: ```bash ulimit -v unlimited # 取消虚拟内存限制 ``` 永久修改: 编辑 `/etc/security/limits.conf`,添加: ``` * soft memlock unlimited * hard memlock unlimited ``` #### 5. 修改内核参数 ```bash # 允许内存超量分配(风险:可能引发 OOM Killer) echo 1 | sudo tee /proc/sys/vm/overcommit_memory # 或增加超量分配比例(默认100,200表示允许2倍物理内存+交换空间) echo 200 | sudo tee /proc/sys/vm/overcommit_ratio ``` #### 6. 特殊场景处理 - **容器环境(Docker/K8s)**:检查容器内存限制(`--memory` 参数)。 - **虚拟机**:为虚拟机分配更多内存。 - **32位系统**:迁移到64位环境。 --- ### **扩展知识** - **内存映射(Memory Mapping)**:程序通过 `mmap()` 系统调用将文件或设备映射到虚拟地址空间。 - **OOM Killer**:当内存严重不足时,内核会强制终止占用内存最多的进程。 - **交换空间(Swap)**:磁盘上的虚拟内存区域,用于扩展可用内存(速度较慢)。 如果问题持续,建议检查应用程序是否存在内存泄漏,或考虑升级硬件配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值