Ich bin ein C++ Programmierer und ich spiele herum mit Java, nachdem ich JPA gefunden habe, das für einige meiner gegenwärtigen Anwendungen ein Gott sende. Ich habe Java seit der Universität nicht berührt, und ich habe ein Problem, aus dem Heap-Raum zu laufen. Ich benutze den Code unten als Hauptteil eines nicht-sehr ernsten Tests von jdbc/jpa/lucene, aber ich bekomme weiterhin zufällige OutOfMemory-Ausnahmen.Java-Speicherverwaltung
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();
Ich werde nicht alle create posten, aber alle es tut, ist eine neue org.apache.lucene.document.Document instanziiert und fügt Felder über add (neues Feld ...) usw. Es gibt etwa 50 Felder insgesamt und die meisten sind kurze Zeichenfolgen (< 32 Zeichen) in der Länge.
In meiner Newby-Ness gibt es etwas völlig Dummes, das ich mache (oder nicht), dass Dinge nicht GC'd sein würde?
Gibt es Best Practices in Bezug auf Java Memory Management und kitzeln die GC?
GC hat keine Probleme mit kreisförmigen Referenzen, Objekte werden weiterhin entfernt. Ich bin mir nicht sicher, ob ich verstehe, was Sie meinen, indem Sie Referenzen auf Objekte explizit auf Null setzen. Wie sonst würden Sie sie entfernen? – Robin
Die andere Möglichkeit, sie zu entfernen, besteht darin, sie außer Reichweite zu lassen. Das explizite Festlegen von Verweisen auf NULL bezieht sich auf die Kombination von humongous Objekten und langen Schleifen, bei denen die Objektreferenz lange im Speicher verbleibt. – gnud