【问题标题】:Why did my app run out of memory?为什么我的应用程序内存不足?
【发布时间】:2012-09-07 00:27:33
【问题描述】:

任何人都可以理解这一点吗?它只执行了两次垃圾回收,并且有 16MB 可用空间。那么为什么分配不到8MB呢?

09-06 19:08:36.335: V/MediaPlayerService(5439): [102] isPlaying: 0
09-06 19:08:36.421: D/dalvikvm(17483): GC_FOR_MALLOC freed 13K, 39% free 16709K/27079K, external 2357K/2773K, paused 139ms
09-06 19:08:36.421: I/dalvikvm-heap(17483): Forcing collection of SoftReferences for 8520570-byte allocation
09-06 19:08:36.522: D/dalvikvm(17483): GC_FOR_MALLOC freed <1K, 39% free 16708K/27079K, external 2357K/2773K, paused 95ms
09-06 19:08:36.522: E/dalvikvm-heap(17483): Out of memory on a 8520570-byte allocation.
09-06 19:08:36.522: I/dalvikvm(17483): "Thread-19" prio=5 tid=12 RUNNABLE
09-06 19:08:36.522: I/dalvikvm(17483):   | group="main" sCount=0 dsCount=0 obj=0x411da000 self=0x3863e8
09-06 19:08:36.522: I/dalvikvm(17483):   | sysTid=17496 nice=0 sched=0/0 cgrp=default handle=3695904
09-06 19:08:36.522: I/dalvikvm(17483):   | schedstat=( 8278991686 2222930914 7642 )
09-06 19:08:36.522: I/dalvikvm(17483):   at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:~91)
09-06 19:08:36.522: I/dalvikvm(17483):   at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:216)
09-06 19:08:36.522: I/dalvikvm(17483):   at org.jsoup.helper.DataUtil.readToByteBuffer(DataUtil.java:114)
09-06 19:08:36.522: I/dalvikvm(17483):   at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:437)
09-06 19:08:36.522: I/dalvikvm(17483):   at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:391)
09-06 19:08:36.522: I/dalvikvm(17483):   at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:157)
09-06 19:08:36.522: I/dalvikvm(17483):   at org.jsoup.helper.HttpConnection.get(HttpConnection.java:146)

【问题讨论】:

  • 因为 8GB 是要分配的大量内存。
  • 它是 64 位操作系统吗?如果不是,则地址空间已超出(32 位系统一次只能寻址 4GB 内存)。
  • 8520570 字节幸运的是只有 ~8MB,你仍然不应该假设你有。
  • 抱歉错字。 8MB 而不是 8GB。
  • Runtime.getRuntime().maxMemory(); 的输出是什么?

标签: java android garbage-collection jvm dalvik


【解决方案1】:

我认为第二条日志行可能会让您感到困惑。措辞有点误导,但我很确定它是说只有大约 10 兆免费:16709K / 27079K 大约是 61.7%,所以 16709K 大概是使用的内存量,而不是免费的。

但是 10 兆仍然大于请求的 8 兆。问题可能是您的应用程序已经运行了足够长的时间以产生明显的内存碎片。也就是说,总共可能有 10 兆的空闲空间,但它们全部(或至少足够)分散在其他积极使用的内存中,因此没有连续的空间可以提供给您的应用程序。

【讨论】:

  • 如何对内存进行碎片整理?即使这意味着重新启动?我们无法访问 malloc() 和 free() 怎么办?
猜你喜欢
  • 2010-10-10
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
相关资源
最近更新 更多