java.text.SimpleDateFormatのインスタンスを毎回作ってRFC2822の日付文字列からDate型に変換していたら、GCされずにメモリを食いつぶしてしまったので対策。
public static Date convertRfc2822toDate(String from) {
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date date = null;
synchronized (format) {
try {
date = (Date) format.parse(from);
} catch (ParseException e) {
date = new Date();
}
}
format = null;
return date;
}
上は元のコード。下は修正版。
private static SimpleDateFormat format = null;
public static Date convertRfc2822toDate(String from) {
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
Date date = null;
if (format == null) {
format = new SimpleDateFormat();
}
synchronized (format) {
format.applyPattern(pattern);
try {
date = format.parse(from);
} catch (ParseException e) {
date = new Date();
}
}
return date;
}
完全なスレッドセーフにはなっていないけど、メモリリークは解消できたので良し。
タグ: java

HOMMA Teppei


メモリリークを発見!Androidアプリのメモリ解析手法…
Androidアプリ開発術の1つである。Androidアプリのメモリ解析手法の紹介です。特にメモリリーク対策が重要。Memory Analysis for Android Applications」の翻訳。……