【问题标题】:Android memory leaks heap gc_concurrentAndroid 内存泄漏堆 gc_concurrent
【发布时间】:2012-11-26 00:52:23
【问题描述】:

谁能告诉我为什么会出现这些内存泄漏? 当启动画面需要自行完成时会发生这种情况(基本上称为新活动) 当我在菜单中单击按钮打开一个新页面(新活动)时,再次发生这种情况。

记录猫内存泄漏:

主菜单启动画面:

12-07 19:35:58.037: D/dalvikvm(2167): GC_CONCURRENT freed 499K, 21% free 4138K/5228K, paused 8ms+8ms, total 397ms
12-07 19:35:58.045: D/dalvikvm(2167): WAIT_FOR_CONCURRENT_GC blocked 170ms
12-07 19:35:58.116: I/dalvikvm-heap(2167): Grow heap (frag case) to 5.208MB for 1106044-byte allocation
12-07 19:35:58.365: D/dalvikvm(2167): GC_CONCURRENT freed 3K, 18% free 5215K/6312K, paused 8ms+33ms, total 246ms

主菜单到新页面:

12-07 19:38:30.974: D/dalvikvm(2167): GC_FOR_ALLOC freed 512K, 17% free 5272K/6304K, paused 119ms, total 151ms
12-07 19:38:31.034: I/dalvikvm-heap(2167): Grow heap (frag case) to 6.316MB for 1106044-byte allocation
12-07 19:38:31.376: D/dalvikvm(2167): GC_CONCURRENT freed 1129K, 30% free 5224K/7388K, paused 89ms+5ms, total 332ms

这是我的主要内容:

package com.example.prva;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MotionEvent;


public class MainActivity extends Activity {

    MediaPlayer MPlayer; //da MPlayer mozemo koristiti bilo gdje
    protected boolean splashactive = true;
    protected int splashtime = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);        

        MPlayer = MediaPlayer.create(this, R.raw.splash); //dodavanje zvuka MPlayeru
        MPlayer.start();        //play

        Thread tajmer = new Thread(){
            public void run(){
                try{        
                    while(splashactive && splashtime<3000)
                        {
                            sleep(50);
                            splashtime=splashtime+50;
                        }
                    }
                 catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }               
                finally{
                    finish();                   
                    MPlayer.release();
                    startActivity(new Intent(MainActivity.this, Meni_Splash.class));                
                }       
            }           
        };
        tajmer.start(); 
    }       

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            splashactive = false;           

        }       
        return true;
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        MPlayer.release();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        MPlayer.pause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        MPlayer.start();
    }

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

}

Meni_Splash:

package com.example.prva;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Meni_Splash extends Activity{  


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

        Button btnv = (Button) findViewById(R.id.buttonv);
        btnv.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startActivity(new Intent(Meni_Splash.this, button.class));              
            }
        });         
    }
}

我不知道问题出在哪里? 请不要告诉我增加堆大小。 提前谢谢大家!

【问题讨论】:

  • 正常人......没什么不好......快乐编码
  • @Faizan 如果你这么说,谢谢。

标签: java android performance memory memory-leaks


【解决方案1】:

除非您在其他地方持有对其中一项活动的引用,否则我在这里看不到任何泄漏。 例如,MPlayer 不是私有的或受保护的,因此如果您在另一个实例中持有对它的引用,则可能会发生泄漏。

涉及MediaPlayer 时进行垃圾回收是正常的。这可能会占用大量内存

即使启动了新的活动,您的MainActivity 也会保留在内存中。如果您不想在startActivity(); 之后调用finish();

【讨论】:

  • 是的,我已经完成了();如果这就是您的意思,在 finally{} 中。如果您可以更详细地解释您的声明:“例如,MPlayer 不是私有的或受保护的,因此如果在另一个实例中持有对它的引用,您可能会泄漏。”我会很感激!我知道 MPlayer 不受保护或私有,但为什么需要呢? “另一个实例”是什么意思。抱歉,我对这一切都不熟悉。
  • 因为它不是私有的,所以没有什么能阻止另一个 Activity 做 Mplayer myPlayer = mainActivity.MPlayer;在这种情况下,mainActivity 及其所有变量都无法被 GC,直到 myPlayer 在另一个活动中被 GC。这正是内存泄漏的原因,也是通常鼓励您使用私有变量的原因。
  • 哦,我想我明白了,谢谢。但是,如果没有我的编码从而导致泄漏,另一个 Activity 怎么能自己使用 MPlayer?
  • 我不知道,只是没有看到你的其余代码,我说它可能是内存泄漏的来源。如果您没有在其他地方引用 MPlayer,那么您很好,并且您没有任何内存泄漏。当 MediaPlayer 正在使用时,它看起来就像正常的 GC 活动
  • 不,我没有在其他任何地方使用它,它只是启动画面的声音。 MPlayer 现在受到保护只是为了确定。 :)
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多