データベースからXML文書のテンプレートを取得し、それを編集して出力するプログラムを作っています。 性能要件のため、「一度取得したXMLはメモリにキャッシュしておき、2回目以降はキャッシュされたXMLを再利用する」仕組みにしています。 public class Entity{ private Element XML; public Element getXML(){ return XML.cloneNode(); } public void setXML(Element XML){ this.XML = XML.cloneNode(); } } public class Dao{ public Element getXML(){ //DBにアクセスしてXML文書を取得する処理 return XML; } } public class Main(){ private Dao dao; public void outputXML(Entity entity){ Element XML = entity.getXML; if (entity == null){ XML = dao.getXML entity.setXML(XML) } //以下XMLを編集して出力する処理 } } get時とset時にcloneNodeすることで、保存されたテンプレートは書き換えられない……という事を期待し、実際その処理はうまく行っていたのですが 動作させているうちにメモリリークが発生し、調査してみるとどうやらcloneNodeが実行されるたびに、EntityのフィールドのElementオブジェクトの容量が増加している様子… 一体なぜこのような現象が起きているのでしょうか? また、これを回避する方法はあるでしょうか。 javaのバージョンは1.6 データベースはOracle Databaseを使用しています よろしくおねがいします。
↧