我有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; ? –