jjzjj

android - Google Maps Android API v2 SupportMapFragment 内存泄漏

coder 2023-06-10 原文

使用 2 个简单的 Activity 。第一个 Activity 仅包含一个按钮以启动第二个包含 map 的 Activity:

主要 Activity :

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void goToMap(View view){ //This is just the onClick method for the button
    Intent intent=new Intent( this, BigMapTest.class);
    startActivity(intent);
}

map Activity :

public class BigMapTest extends FragmentActivity {
SupportMapFragment mapFragment;
GoogleMap map;

@Override
protected void onCreate(Bundle arg0) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);

    setContentView(R.layout.travel_diary_big_map);

    mapFragment=(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.big_map);
    map=mapFragment.getMap();

}

map Activity 的 XML 布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment
        android:id="@+id/big_map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        class="com.google.android.gms.maps.SupportMapFragment"  
        />

现在当我运行这段代码时,按下按钮移动到带有 map 的 Activity,然后按下返回到第一个 Activity……然后重复这个过程,我可以看到堆的大小每次都在增加,直到达到极限,然后开始夹紧。如果您在 map 上多花点心思(即缩放),此时我可能会遇到 OOM 异常。

01-25 16:10:13.931: D/dalvikvm(21578): GC_FOR_ALLOC freed 1898K, 7% free 45859K/49187K, paused 204ms
01-25 16:10:14.671: I/dalvikvm-heap(21578): Clamp target GC heap from 52.724MB to 48.000MB
01-25 16:10:14.671: D/dalvikvm(21578): GC_CONCURRENT freed 2534K, 6% free 46554K/49187K, paused 3ms+14ms
01-25 16:10:15.372: I/dalvikvm-heap(21578): Clamp target GC heap from 52.979MB to 48.000MB
01-25 16:10:15.382: D/dalvikvm(21578): GC_CONCURRENT freed 2273K, 5% free 46815K/49187K, paused 3ms+15ms
01-25 16:10:15.622: I/dalvikvm-heap(21578): Clamp target GC heap from 52.604MB to 48.000MB
01-25 16:10:15.622: D/dalvikvm(21578): GC_FOR_ALLOC freed 657K, 6% free 46431K/49187K, paused 202ms
01-25 16:10:16.203: I/dalvikvm-heap(21578): Clamp target GC heap from 52.959MB to 48.000MB
01-25 16:10:16.203: D/dalvikvm(21578): GC_FOR_ALLOC freed 1469K, 5% free 46796K/49187K, paused 217ms
01-25 16:10:16.203: I/dalvikvm-heap(21578): Forcing collection of SoftReferences for 278744-byte allocation
01-25 16:10:16.423: I/dalvikvm-heap(21578): Clamp target GC heap from 52.952MB to 48.000MB
01-25 16:10:16.423: D/dalvikvm(21578): GC_BEFORE_OOM freed 9K, 5% free 46786K/49187K, paused 219ms
01-25 16:10:16.423: E/dalvikvm-heap(21578): Out of memory on a 278744-byte allocation.

任何建议/帮助将不胜感激。

最佳答案

据我从一些基本的 MAT 调查中可以看出,您所看到的是 Maps V2 为下载的 map 数据维护的缓存。如果您平移和缩放很多,缓存似乎更大。如果您离开 map 并稍后返回新 map ,缓存会缩小。在 N 次启动示例应用的 map Activity 时,我无法获得 N 个缓存,缓存大小会根据用户所做的操作而起伏不定。

唉,这个缓存是不可配置的,AFAIK,就它有多大、何时被清除、是否溢出到磁盘等而言。

因此,默认情况下,您所能做的就是留出一部分健康的堆空间供 Maps V2 使用,并采取措施留在这个较小的堆子集中。

如果您想进行实验,可以尝试在 GoogleMap 上调用 clear(),或在 SupportMapFragment 上调用 onLowMemory() ,看看是否有任何帮助减少这个缓存大小。

关于android - Google Maps Android API v2 SupportMapFragment 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14523949/

有关android - Google Maps Android API v2 SupportMapFragment 内存泄漏的更多相关文章

随机推荐