MapFragment Google Maps API v2 Out of Memory Error / Memory Leak

六月ゝ 毕业季﹏ 提交于 2019-12-18 16:57:46

问题


I've read a number of similar posts over the past few days, but none that specifically answer this problem. I start getting an OOM issue after ~2 minutes of aggressive map panning and zooming with the Hybrid map. The app also seems to hold onto the memory after the crash because it takes less time to reach OOM after the first failure. I scaled down the code to just an Activity with a MapFragment and still get the same OOM. I've used DDMS and MAT to try and isolate the problem, in addition to adding android:largeHeap="true" which only delays the OOM. Screen re-orientation is not an issue because I'm setting android:screenOrientation="portrait" in my Manifest. Any help would be appreciated.

Update 2014-08-25: This is supposed to be fixed back in May 2013?

Update 2014-09-06: Still no success, the only good option is to use Normal instead of Hybrid. GC seems to be able to keep up without the imagery.

Similar Posts:

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

回答1:


try call map onPause, onResume, onLowMemory in corresponding Fragment methods.




回答2:


I ran into this problem trying to run an app on demo mode for a few hours at a time. No matter what I tried, after 30 minutes, I would see this crash without a readable stack report.

I tried many different things but this was the only thing that worked for me. It's not a fix for the map bug, but it kept my app from crashing:

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


来源:https://stackoverflow.com/questions/25533347/mapfragment-google-maps-api-v2-out-of-memory-error-memory-leak

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!