【发布时间】:2013-08-25 04:29:09
【问题描述】:
我正在开发一个 Android 应用程序,该应用程序需要每秒处理数千个数据包,同时提取和格式化每个帧的 MAC 地址。问题是垃圾收集器每秒运行十几次并停止我的应用程序,这反过来又让我错过了数据包。我已经尽可能(我认为)避免创建新对象。
我在 DDMS 中使用了分配跟踪器,并确定正在清理的 99% 的垃圾来自以下方法。这是我正在使用的代码:
void parseMac() {
hex_sb.setLength(0);
for (hex_counter = 0; hex_counter < 6; hex_counter++) {
hex_sb.append(String.format("%02X", parser_packet_bytes[parser_skip + hex_counter]));
if (!(hex_counter == 5)) {
hex_sb.append(":");
}
}
formatted_mac = hex_sb.toString();
}
hex_sb 是一个可以重复使用的 StringBuilder。 hex_counter 是 MAC 地址中的字节数(字节来自 parser_packet_bytes,一个 byte[])。如果它不是 MAC 的最后一个字节,则附加一个“:”以进行正确格式化。 formatted_mac 是一个类范围的字符串,用于存储格式化的 MAC。根据分配跟踪器,唯一的问题是使用 String.format 的行。
我对 StackOverflow 专家的问题是:如何重写上述方法以减少(最好没有)垃圾的产生?
【问题讨论】:
-
为什么?您真的每秒接收来自数千个不同对等方的信息吗?还是您每秒从同一对等方接收数千帧?在后一种情况下,每个帧中的 MAC 地址将相同。但是没有理由不能在没有循环的情况下在单个
format()调用中格式化整个 MAC 地址。这会将垃圾除以 6。
标签: java android garbage-collection