GC_CONCURRENT 解决

Posted

技术标签:

【中文标题】GC_CONCURRENT 解决【英文标题】:GC_CONCURRENT solving 【发布时间】:2012-07-11 03:13:23 【问题描述】:

我是android应用程序开发的初学者,下面是我的程序,但是,当它运行时,在LogCat中,出现GC_CONCURRENT消息,我知道这是我的程序消耗太多内存造成的,但是,通过阅读我的代码反复,我仍然不知道为什么我的程序会消耗比我预期的更多的内存,任何人都可以帮我看看并给我一些建议,谢谢!

07-11 10:38:12.258: D/dalvikvm(10060): GC_CONCURRENT 释放 88K,2% 释放 12912K/13063K,暂停 2ms+13ms 07-11 10:38:25.024: D/dalvikvm(10060): GC_CONCURRENT 释放 84K,2% 释放 13249K/13447K,暂停 1ms+3ms 下面是代码:

public class Reader extends Activity 

TextView mText;
NfcAdapter mAdapter;
PendingIntent mPendingIntent;
IntentFilter mFilters[];
String mTechLists[][];

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);



@Override
public void onStart()
    super.onStart();
    setContentView(R.layout.activity_reader);

    mText = (TextView) findViewById(R.id.text);

    mAdapter = NfcAdapter.getDefaultAdapter(this);
    mPendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try
        ndef.addDataType("text/plain");
    catch(MalformedMimeTypeException e)
        throw new RuntimeException("fail", e);
    

    IntentFilter nt = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    mFilters = new IntentFilter[]
            ndef, nt
    ;

    mTechLists = new String[][]
            new String[]
                    Ndef.class.getName()
            
    ;
    Intent intent = getIntent();
    mText.setText(getNdefMessages(intent));


public String getNdefMessages(Intent intent)
    NdefMessage[] msgs = null;
    String action = intent.getAction();
    if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)||
            NfcAdapter.ACTION_TAG_DISCOVERED.equals(action))
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if(rawMsgs != null)
            msgs = new NdefMessage[rawMsgs.length];
            for(int i=0; i<rawMsgs.length; i++)
                msgs[i] = (NdefMessage) rawMsgs[i];
            
        else
            byte[] empty = new byte[];
            NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
            NdefMessage msg = new NdefMessage(new NdefRecord[]record);
            msgs = new NdefMessage[]msg;
        

    
    else 
        finish();
    
    if(msgs==null)
        return "No Tag discovered!";
    else
        return msgs.toString();


@Override
public void onResume()
    super.onResume();
    if (mAdapter != null)
        mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);



@Override
public void onPause()
    super.onPause();
    if (mAdapter != null)
        mAdapter.disableForegroundDispatch(this);


@Override
public void onNewIntent(Intent intent)
    Log.i("Foreground dispatch", "Discovered tag with intent:" + intent);
    mText = (TextView) findViewById(R.id.text);
    mText.setText(getNdefMessages(intent));



【问题讨论】:

检查此链接,我认为您的堆已满***.com/questions/6591807/… yam 我明白为什么会有这样的消息,所以我想问一下我该如何纠正我的程序来修复它,但是目前我仍然无法将数据写入标签,所以我不知道堆大小是否足以满足我现在的需要,无论如何,谢谢大佬 【参考方案1】:

请确保你清理干净

  NdefMessage msg = new NdefMessage(new NdefRecord[]record);
        msgs = new NdefMessage[]msg;

主要的总消息有多少?为什么不做一个 Log.debug("LOG_TAG", msg.length()) 并找出答案。

你也在模拟器上运行吗?如果是,内存设置是什么?

显然,您正在做的唯一事情就是消耗内存是上面的行,所以也许您需要在某个时候释放它。您还可以在 eclipse 中运行内存分析器并获取更多信息。

【讨论】:

其实我是用 Galaxy Nexus 做测试的,目前我只是尝试在不使用标签的情况下打开应用程序,它在我隐藏 finish() 函数后可以工作,我不确定它在哪里工作。我将尝试使用一个内部有多个记录的标签。但是目前我用来写标签的应用程序只支持在里面写一条消息,这不能满足我在里面写几条记录和一条AAR记录的要求,有没有人建议可以这样做的android应用程序,或者还有其他写NFC标签记录的方法吗? 我会将此作为一个单独的问题发布。 为什么还要回答我在尝试诊断时向您提出的问题? 您可以做的另一件事就是注释掉大量代码,看看您是否仍然收到错误消息。 哦,对不起,我忘记回复了,嗯,就像你提到的,我想我已经通过注释掉一些代码解决了这个问题。

以上是关于GC_CONCURRENT 解决的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Lock取代synchronized

4个点说清楚Java中synchronized和volatile的区别

java实现定时任务

CountDownLanchDemo

zk抢主

ScheduledThreadPoolDemo01