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