Java Android内存泄漏堆gc_并发
有人能告诉我为什么我有这些内存泄漏吗? 它发生在启动屏幕需要自行完成时(基本上称为新活动) 当我点击菜单上的按钮打开一个新页面(新活动)时,这种情况再次发生 记录cat内存泄漏: 启动屏幕至主菜单:Java Android内存泄漏堆gc_并发,java,android,performance,memory,memory-leaks,Java,Android,Performance,Memory,Memory Leaks,有人能告诉我为什么我有这些内存泄漏吗? 它发生在启动屏幕需要自行完成时(基本上称为新活动) 当我点击菜单上的按钮打开一个新页面(新活动)时,这种情况再次发生 记录cat内存泄漏: 启动屏幕至主菜单: 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)
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;
}
}
我想不出问题出在哪里?
请不要告诉我增加堆大小。
提前谢谢大家 除非你在其他地方提到这些活动,否则我看不到任何泄漏。 例如,
MPlayer
不是私有的或受保护的,因此如果您在另一个实例中持有对它的引用,则可能存在泄漏
当涉及MediaPlayer
时,进行垃圾收集是正常的。它可能需要很多内存
您的
main活动
即使启动了新活动,也会保留在内存中。如果您不想调用finish()代码>在startActivity()之后代码>除非您在其他地方引用了其中一项活动,否则我看不到任何泄漏。
例如,MPlayer
不是私有的或受保护的,因此如果您在另一个实例中持有对它的引用,则可能存在泄漏
当涉及MediaPlayer
时,进行垃圾收集是正常的。它可能需要很多内存
您的main活动
即使启动了新活动,也会保留在内存中。如果您不想调用finish()代码>在startActivity()之后代码>这是正常人……没什么不好的。。。高兴的coding@Faizan如果你这么说,谢谢。这是正常人…没什么不好的。。。高兴的coding@Faizan如果你这么说,谢谢。是的,我已经做完了;如果那是你的意思的话。如果您能更详细地解释一下您的声明:“例如,MPlayer不是私有的或受保护的,因此如果在另一个实例中持有对它的引用,您可能会泄漏。”我将非常感激!我知道MPlayer既不受保护也不私有,但为什么需要这样呢?你所说的“另一个例子”是什么意思。对不起,我对这一切都不熟悉。因为它不是私有的,没有任何东西可以阻止另一个活动执行Mplayer myPlayer=mainActivity.Mplayer;在这种情况下,在myPlayer是另一个活动中的GC之前,无法对mainActivity及其所有变量进行GC。这正是内存泄漏的原因,也是人们通常鼓励使用私有变量的原因。哦,我想我明白了,谢谢。但是,如果没有我的编码,另一个活动如何在自身上使用MPlayer呢?我不知道,只是因为没有看到您的其余代码,我说这可能是内存泄漏的原因。如果您没有在其他地方引用MPlayer,那么您很好,并且没有任何内存泄漏。当MediaPlayer使用时,它看起来就像正常的GC活动。不,我没有在其他任何地方使用它,它只是启动屏幕的声音。MPlayer现在已被保护以确保安全。:)是的,我已经做完了;如果那是你的意思的话。如果您能更详细地解释一下您的声明:“例如,MPlayer不是私有的或受保护的,因此如果在另一个实例中持有对它的引用,您可能会泄漏。”我将非常感激!我知道MPlayer既不受保护也不私有,但为什么需要这样呢?你所说的“另一个例子”是什么意思。对不起,我对这一切都不熟悉。因为它不是私有的,没有任何东西可以阻止另一个活动执行Mplayer myPlayer=mainActivity.Mplayer;在这种情况下,在myPlayer是另一个活动中的GC之前,无法对mainActivity及其所有变量进行GC。这正是内存泄漏的原因,也是人们通常鼓励使用私有变量的原因。哦,我想我明白了,谢谢。但是,如果没有我的编码,另一个活动如何在自身上使用MPlayer呢?我不知道,只是因为没有看到您的其余代码,我说这可能是内存泄漏的原因。如果您没有在其他地方引用MPlayer,那么您很好,并且没有任何内存泄漏。当MediaPlayer使用时,它看起来就像正常的GC活动。不,我没有在其他任何地方使用它,它只是启动屏幕的声音。MPlayer现在已被保护以确保安全。:)
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));
}
});
}
}