我是一名 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 个字符)。
在我的新手中,我正在做(或不做)一些完全愚蠢的事情会导致事情不被 GC 处理吗?
是否有关于 java 内存管理和 GC 的最佳实践?