我是一名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的全部内容,但它只是通过add(new Field...)等方法实例化一个新的org.apache.lucene.document.Document并添加字段。总共大约有50个字段,大多数长度都很短(小于32个字符)。
在我的新手阶段,是否有完全愚蠢的事情(或者没有做的事情)会导致垃圾回收不起作用?
关于Java内存管理和触发GC,有最佳实践吗?