Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java内存管理 我是一个C++程序员,在找到JPA之后,我一直在玩java,这对于我当前的一些应用程序来说是一个上帝的发送。从大学开始我就没有接触过java,我遇到了堆空间不足的问题。我使用下面的代码作为jdbc/jpa/lucene测试的主要部分,但我一直在随机获取内存异常 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();_Java_Memory Leaks - Fatal编程技术网

java内存管理 我是一个C++程序员,在找到JPA之后,我一直在玩java,这对于我当前的一些应用程序来说是一个上帝的发送。从大学开始我就没有接触过java,我遇到了堆空间不足的问题。我使用下面的代码作为jdbc/jpa/lucene测试的主要部分,但我一直在随机获取内存异常 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();

java内存管理 我是一个C++程序员,在找到JPA之后,我一直在玩java,这对于我当前的一些应用程序来说是一个上帝的发送。从大学开始我就没有接触过java,我遇到了堆空间不足的问题。我使用下面的代码作为jdbc/jpa/lucene测试的主要部分,但我一直在随机获取内存异常 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();,java,memory-leaks,Java,Memory Leaks,我不会发布所有的createDocument,但它所做的只是实例化一个新的org.apache.lucene.document.document,并通过add(new Field…)等添加字段。总共大约有50个字段,大多数是短字符串(我看不出任何明显不合适的地方。如果您使用的是一个非常大的数据库,您可以尝试在JVM调用中使用-Xmx n选项来增加堆大小。这通常不是最佳解决方案-只有当您知道您的工作集大小实际上大于默认堆大小时,才可以这样做 您是否正在使用任何复杂的数据结构?如果对象之间存在循环引

我不会发布所有的createDocument,但它所做的只是实例化一个新的org.apache.lucene.document.document,并通过add(new Field…)等添加字段。总共大约有50个字段,大多数是短字符串(我看不出任何明显不合适的地方。如果您使用的是一个非常大的数据库,您可以尝试在JVM调用中使用
-Xmx n
选项来增加堆大小。这通常不是最佳解决方案-只有当您知道您的工作集大小实际上大于默认堆大小时,才可以这样做


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

请尝试SAP内存分析器


这将读取转储文件,并让您调查占用内存的内容。

结果集中有多少项?如果有足够的记录,那么您将耗尽所有内存,因为在本例中,当您向编写器添加文档时,不会收集到任何垃圾,而编写器将保存对您创建的所有文档的引用重新创建。

长期使用Java和数据库(postgresSQL mysql oracle differences>)的经验告诉我,我们在这项工作中使用的JDBC驱动程序经常出现问题

我有一段代码需要全天候保持与数据库的连接,并且由于驱动程序内存泄漏,JVM在某个时候总是会阻塞。因此,我编写代码来捕获抛出的特定异常,然后采取越来越激烈的行动,包括断开连接、重新连接,甚至在紧急情况下重新启动JVM尽管如此,没有任何东西能解决问题。编写它是多么痛苦,但它一直有效,直到DBMS供应商推出了一个新的JDBC驱动程序,而这个驱动程序并没有引起问题……我实际上只是把代码留在原地,以防万一

…所以,你可能什么都没做

请注意,调用垃圾回收器是我使用的策略之一,但度量数据表明它几乎没有帮助

此外,这可能不清楚,但结果集保持与数据库引擎本身的持续连接,在许多情况下(除非明确设置为其他方式)是双向的,即使您只是在阅读。而且,一些JDBC驱动程序允许您请求单向连接,但撒谎并返回双向连接!注意这一点

因此,最好将ResultSet对象卸载到其他对象中,以保存值并尽快删除ResultSet对象本身

祝你好运。
RTIII

Java维护多个不同的内存池,其中任何一个内存池用完都可能导致可怕的OutOfMermoryException。操作系统分配内存的问题也可能表现为OOM

您应该看到一个详细的堆栈跟踪,或者可能是应用程序目录中的一个错误转储文件,这可能会为问题提供进一步的线索


如果您使用一个像样的探查器—最近的Sun Java 6 JDK附带的JVisualVM可能就足够了—您可以查看所有不同的池,并查看哪些池已经用完了。

可能永久生成的空间已经用完了。 检查堆栈跟踪是否包含类似java.lang.OutOfMemoryError:PermGen的内容

您可以使用以下参数为jvm增加这一代的空间:-XX:MaxPermSize=128m

垃圾收集期间不考虑永久生成中的对象。
查看以了解有关垃圾收集和JVM中不同代对象的更多信息。

GC对循环引用没有问题,对象仍将被删除。我不确定我是否理解显式清空对象引用的含义。否则如何删除它们?另一种删除方法是让em超出范围。显式将引用设置为null是为了将庞大的对象和长循环组合在一起,其中对象引用将在内存中保留很长时间。您的链接不会将我带到它。请修复链接!