FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

ObjectOutputStreamでOutOfMemoryErrorな件

public void send(Object obj) throws IOException {
    objectOutStream.writeObject(obj);
    objectOutStream.reset();
}

ObjectOutputStreamは一度writeObjectしたオブジェクトを内部テーブルにキャッシュして保持しつづける仕様らしい。なので,同じオブジェクトを変更してwriteObjectしても一番最初に書き込んだオブジェクトが書き出されてしまう。また,キャッシュされたオブジェクトはGCで開放されないので,OutOfMemoryを回避するためには明示的にキャッシュをクリアする必要がある。ObjectOutputStream#resetを呼び出すことですべて解決。うまくオブジェクトが書き出されない不具合も,メモリ消費が激しい不具合も一挙に解消した。そういう大切なことはJavaDocに太字で書いておくべききっとそうすべき。

プレゼン発表前日の貴重な数時間を返してください。