我有android应用程序,它从telnet客户端获取巨大的String对象。稍后我只使用大字符串的一小部分。我用Android上的字符串复制
new String(Part of old string);
从旧字符串的字符数组分离新的字符串的字符数组。所以旧的字符串应该被垃圾收集,但是新的字符串仍然有一个对旧对象的引用。我可以在“Eclipse Memory Analyzer”中看到它。 而且这很快就溢出了我的小16meg应用程序内存。
如何避免这种情况?
private WifiChannel parse1(String channLine){
//scanning with "iwlist wlan0 scanning" the getChans1 method
String[] input = channLine.split(System.getProperty("line.separator"));
if (input.length < 4);
String segment[];
String segment2[];
WifiChannel chan = new WifiChannel();
try {
if (input.length > 5){
chan.setMacAddress(new String(input[0]));
segment = input[1].split(":");
chan.setChannel(Integer.parseInt(segment[1].trim()));
segment = input[3].split(" ");
segment2 = segment[20].split("=");
chan.setQuality(new String(segment2[1]));
segment2 = segment2[1].split("/");
chan.setSignalStrength((Integer.parseInt(segment2[0].trim())*100)/Integer.parseInt(segment2[1].trim())+"%");
segment2 = segment[23].split("=");
try{chan.setSignalLevel(Integer.parseInt(segment2[1].trim()));}catch(Exception e){chan.setSignalLevel(0);}
segment = input[5].split(":");
chan.setName(new String(segment[1].replaceAll("^\"|\"$", "")));
for (int i = 6;i<input.length;i++)
if (input[i].contains("Mode"))
segment = input[i].split(":");
chan.setChannelMode(new String(segment[1]));
String band = "";
if(channLine.contains("5.5 Mb/s"))band = band +"b";
if(channLine.contains("12 Mb/s"))band = band +"g";
chan.setBand(new String(band));
}
}catch (Exception e){Log.e("","",e);}
return chan;
}
方法输入也是更大的字符串的一部分。
尝试使用'String.substring()'方法。 – Thommy
你能告诉我们所有的代码吗?你什么时候检查内存使用情况?不保证旧的字符串会立即清除。如果您不知道,只要您重新分配旧字符串被破坏的字符串(在下一次垃圾回收迭代时),字符串就是不可改变的。 – Grambot
不能你做oldString = null; ? –