Java 为什么我的应用程序内存不足?

Java 为什么我的应用程序内存不足?,java,android,garbage-collection,jvm,dalvik,Java,Android,Garbage Collection,Jvm,Dalvik,有人能理解这一点吗?它只执行了两次垃圾收集,并有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

有人能理解这一点吗?它只执行了两次垃圾收集,并有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)
09-06 19:08:36.335:V/MediaPlayerService(5439):[102]网络播放:0
09-06 19:08:36.421:D/dalvikvm(17483):释放13K,39%释放16709K/27079K,外部2357K/2773K,暂停139ms
09-06 19:08:36.421:I/dalvikvm堆(17483):强制收集8520570字节分配的软引用

09-06 19:08:36.522:D/dalvikvm(17483):第二行日志可能会让你感到困惑。这句话有点误导,但我很确定它说的是只有大约10兆的空闲空间:16709K/27079K大约是61.7%,所以16709K大概是使用的内存量,而不是空闲的


但10兆欧仍然比要求的8兆欧大。问题可能是你的应用程序已经运行了足够长的时间,有明显的内存碎片。也就是说,可能总共有10兆的空闲内存,但这些内存都(或至少足够)分散在其他活跃使用的内存位中,因此没有一个连续的内存块可供应用程序使用。

因为8GB是一个需要分配的巨大内存量。它是64位操作系统吗?如果没有,则超过了地址空间(32位系统一次只能寻址4GB内存)。幸运的是,8520570字节仅为~8MB,您仍然不应该认为您有。对不起,输入错误。8MB而不是8GB。
Runtime.getRuntime().maxMemory()的输出是什么?如何对内存进行碎片整理?即使它意味着重启?我们无法访问malloc()和free(),那么该怎么办?