SimpleDateFormatがメモリを食い尽くす件

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;
	}

完全なスレッドセーフにはなっていないけど、メモリリークは解消できたので良し。


タグ:

新しく会社作りました!

コメント / トラックバック 1 件

  1. Bescottee より:

    メモリリークを発見!Androidアプリのメモリ解析手法…

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

コメントをどうぞ