[英]Java/Android : Phonegap Contacts API memory leaks, GC_FOR_ALLOC and GC_CONCURRENT
[英]Android memory leaks heap gc_concurrent
有人可以告訴我為什么我有這些內存泄漏嗎? 當啟動屏幕需要完成自身時(通常稱為新活動),就會發生這種情況;當我在菜單中單擊按鈕時打開一個新頁面(新活動)時,也會發生這種情況。
記錄貓內存泄漏:
啟動屏幕到主菜單:
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));
}
});
}
}
我不知道問題出在哪里? 請不要告訴我增加堆大小。 謝謝大家!
我在這里看不到任何泄漏,除非您在其他地方引用了其中一項活動。 例如, MPlayer
不是私有的也不是受保護的,因此,如果在另一個實例中對它進行引用,則可能會泄漏。
當涉及到MediaPlayer
時,進行垃圾回收是正常的。 可能需要很多內存
即使啟動了新的活動,您的MainActivity
也會保留在內存中。 如果您不希望該調用finish();
在startActivity();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.