私は C++ プログラマーであり、現在のアプリケーションのいくつかにとって神が送る JPA を見つけた後、Java をいじっています。私は大学以来 Java に触れていませんが、ヒープ領域が不足しています。jdbc/jpa/lucene のそれほど深刻ではないテストの主要部分として以下のコードを使用していますが、ランダムな OutOfMemory 例外が発生し続けます。
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select p from Product p" +
" where p.productid = :productid");
Connection con = DriverManager.getConnection("connection string");
Statement st = con.createStatement();
IndexWriter writer = new IndexWriter("c:\\temp\\lucene", new StandardAnalyzer(), IndexWriter.MaxFieldLength.LIMITED);
ResultSet rs = st.executeQuery("select productid from product order by productid");
while (rs.next()) {
int productid = rs.getInt("PRODUCTID");
q.setParameter("productid", productid);
Product p = (Product)q.getSingleResult();
writer.addDocument(createDocument(p));
}
writer.commit();
writer.optimize();
writer.close();
st.close();
con.close();
createDocument のすべてを投稿するわけではありませんが、新しい org.apache.lucene.document.Document をインスタンス化し、add(new Field...) などを介してフィールドを追加するだけです。合計で約 50 のフィールドがあり、ほとんどが短いものです。文字列 (<32 文字) の長さ。
私の新人で、私がやっている(またはしていない)完全に愚かなことはありますか?
Java メモリ管理と GC のくすぐりに関するベスト プラクティスはありますか?