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 解决的主要内容,如果未能解决你的问题,请参考以下文章