System.gc(); は要らないだろ。メモリが足りなくなった時点で参照されてないオブジェクトは全部消される。

個人的には、ObjectInputStream 側が悪さしていそうな予感。
だけど確証が持てないので……シリアライズ使うの止めた方が懸命。
それほどの巨大データなら、独自にデータベースもどきを作った方が早いと思うよ。