gpt4 book ai didi

内存管理

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:31 37 4
gpt4 key购买 nike

我是一名 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 的最佳实践?

最佳答案

我没有看到任何明显不合适的地方。如果您正在使用一个非常大的数据库,您可以尝试通过在 JVM 调用中使用 -Xmx n 选项来增加堆大小。这通常不是最佳解决方案 - 仅当您知道您的工作集大小实际上大于默认堆大小时才这样做。

您是否使用任何复杂的数据结构?如果对象之间存在循环引用,则可能会阻止垃圾收集器清理无法访问的对象。如果您有任何手写数据结构,请确保显式清空对已删除对象的引用,而不是执行诸如递减大小变量之类的操作。

关于内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217287/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com