MapFragment Google Maps API v2内存不足错误/内存泄漏

问题描述:

过去几天我已经阅读了许多类似的帖子,但都没有明确回答这个问题。经过2分钟积极的地图平移和混合地图缩放后,我开始遇到OOM问题。该应用程序似乎在崩溃后仍保留在内存中,因为在第一次失败后需要较少的时间才能到达OOM。我将代码缩小到只有一个带有MapFragment的Activity,并且仍然获得相同的OOM。我已经使用DDMS和MAT来尝试和隔离问题,除了添加android:largeHeap="true"这只会延迟OOM。屏幕重新定位不是问题,因为我在我的清单中设置了android:screenOrientation="portrait"。任何帮助,将不胜感激。MapFragment Google Maps API v2内存不足错误/内存泄漏

更新2014年8月25日:This is supposed to be fixed back in May 2013?

更新2014年9月6日:仍然没有成功,唯一的好选择是使用Normal而不是Hybrid。 GC似乎能够保持没有图像。

类似的帖子:

Out of memory error when using Google Maps API

Memory leak for Android Google Maps API v2

Android Google maps API, OutOfMemoryError

MainActivity:

public class MainActivity_blank extends Activity { 

GoogleMap mMap; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.activity_main_activity_blank); 
    setContentView(R.layout.map_fragment); 

    setUpMapIfNeeded(); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main_activity_blank, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

private void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
     mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 
      // The Map is verified. It is now safe to manipulate the map. 
      //startUsingMap(); 
      mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     } 
    } 
} 
} 

的logcat:

08-26 17:15:29.302: I/dalvikvm-heap(19642): Forcing collection of SoftReferences for 67108880-byte allocation 
08-26 17:15:29.372: D/dalvikvm(19642): GC_BEFORE_OOM freed 822K, 65% free 37523K/106080K, paused 78ms, total 78ms 
08-26 17:15:30.582: W/dalvikvm(19642): chunk is too big to transmit (length=49579336, 48435 bytes) 
08-26 17:15:31.532: E/dalvikvm-heap(19642): Out of memory on a 67108880-byte allocation. 
08-26 17:15:31.532: I/dalvikvm(19642): "GLThread 14876" prio=5 tid=19 RUNNABLE 
08-26 17:15:31.532: I/dalvikvm(19642): | group="main" sCount=0 dsCount=0 obj=0x42c120d8 self=0x787e8438 
08-26 17:15:31.532: I/dalvikvm(19642): | sysTid=19729 nice=1 sched=0/0 cgrp=apps handle=2021558416 
08-26 17:15:31.532: I/dalvikvm(19642): | state=R schedstat=(51120733635 13119596807 80537) utm=1904 stm=3208 core=0 
08-26 17:15:31.532: I/dalvikvm(19642): at android.graphics.Bitmap.nativeCreate(Native Method) 
08-26 17:15:31.532: I/dalvikvm(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:924) 
08-26 17:15:31.532: I/dalvikvm(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:901) 
08-26 17:15:31.532: I/dalvikvm(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:868) 
08-26 17:15:31.532: I/dalvikvm(19642): at opl.a((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at okg.a((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at opy.a((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at opx.a((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at ojx.a((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at ojx.b((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at otq.k((null):-1) 
08-26 17:15:31.532: I/dalvikvm(19642): at otq.run((null):-1) 
08-26 17:15:31.542: W/System.err(19642): OutOfMemory 
08-26 17:15:31.642: D/dalvikvm(19642): GC_EXPLICIT freed 4803K, 64% free 38238K/106080K, paused 6ms+11ms, total 102ms 
08-26 17:15:32.822: W/dalvikvm(19642): chunk is too big to transmit (length=49444016, 48303 bytes) 
08-26 17:15:33.682: D/dalvikvm(19642): GC_FOR_ALLOC freed 3728K, 66% free 36916K/106080K, paused 65ms, total 65ms 
08-26 17:15:34.752: W/dalvikvm(19642): chunk is too big to transmit (length=49398928, 48259 bytes) 
08-26 17:15:35.462: I/dalvikvm-heap(19642): Forcing collection of SoftReferences for 67108880-byte allocation 
08-26 17:15:35.512: D/dalvikvm(19642): GC_BEFORE_OOM freed 413K, 66% free 36502K/106080K, paused 52ms, total 52ms 
08-26 17:15:36.742: W/dalvikvm(19642): chunk is too big to transmit (length=49398928, 48259 bytes) 
08-26 17:15:37.282: E/dalvikvm-heap(19642): Out of memory on a 67108880-byte allocation. 
08-26 17:15:37.282: I/dalvikvm(19642): "GLThread 14876" prio=5 tid=19 RUNNABLE 
08-26 17:15:37.282: I/dalvikvm(19642): | group="main" sCount=0 dsCount=0 obj=0x42c120d8 self=0x787e8438 
08-26 17:15:37.282: I/dalvikvm(19642): | sysTid=19729 nice=1 sched=0/0 cgrp=apps handle=2021558416 
08-26 17:15:37.282: I/dalvikvm(19642): | state=R schedstat=(54770836691 14106993077 84458) utm=1996 stm=3481 core=0 
08-26 17:15:37.282: I/dalvikvm(19642): at android.graphics.Bitmap.nativeCreate(Native Method) 
08-26 17:15:37.282: I/dalvikvm(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:924) 
08-26 17:15:37.282: I/dalvikvm(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:901) 
08-26 17:15:37.282: I/dalvikvm(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:868) 
08-26 17:15:37.282: I/dalvikvm(19642): at opl.a((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at okg.a((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at opy.a((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at opx.a((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at ojx.a((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at ojx.b((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at otq.k((null):-1) 
08-26 17:15:37.282: I/dalvikvm(19642): at otq.run((null):-1) 
08-26 17:15:37.432: W/dalvikvm(19642): threadid=19: thread exiting with uncaught exception (group=0x4178cda0) 
08-26 17:15:37.442: E/AndroidRuntime(19642): FATAL EXCEPTION: GLThread 14876 
08-26 17:15:37.442: E/AndroidRuntime(19642): Process: com.example.maptest, PID: 19642 
08-26 17:15:37.442: E/AndroidRuntime(19642): java.lang.OutOfMemoryError 
08-26 17:15:37.442: E/AndroidRuntime(19642): at android.graphics.Bitmap.nativeCreate(Native Method) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:924) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:901) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at android.graphics.Bitmap.createBitmap(Bitmap.java:868) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at opl.a(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at okg.a(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at opy.a(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at opx.a(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at ojx.a(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at ojx.b(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at otq.k(Unknown Source) 
08-26 17:15:37.442: E/AndroidRuntime(19642): at otq.run(Unknown Source) 
08-26 17:15:37.522: D/AbsListView(19642): unregisterIRListener() is called 
08-26 17:15:38.092: D/AbsListView(19642): onDetachedFromWindow 
08-26 17:15:38.092: D/AbsListView(19642): unregisterIRListener() is called 
08-26 17:15:38.102: D/AbsListView(19642): onVisibilityChanged() is called, visibility : 8 
08-26 17:15:38.102: D/AbsListView(19642): unregisterIRListener() is called 
+0

模拟器或设备? – Simas 2014-08-28 17:57:28

+0

@ user3249477 - 在设备上运行。在GS4和GS5上都崩溃。 – spidermonkey 2014-08-28 18:06:09

+0

哦,没关系,没有读取~2分钟的积极地图平移和缩放部分... – Simas 2014-08-28 18:08:23

尝试调用地图的onPause,的onResume,在相应片段的方法onLowMemory。

+0

已添加方法并仍然体验OOM。 onLowMemory仅在“整个系统内存不足而不是内存耗尽时”调用。onPause和onResume在这种情况下不会被调用,因为用户永远不会离开地图。 – spidermonkey 2014-08-27 19:10:03

我遇到了这个问题,试图在演示模式下一次运行几个小时的应用程序。无论我尝试了什么,30分钟后,我都会看到这个崩溃,但没有可读的堆栈报告。

我尝试了很多不同的东西,但这是唯一对我有用的东西。这不是修复地图错误,但它保持我的应用程序崩溃:

<application 
    ... 
    android:largeHeap="true">