Jestem programistą C++ i bawię się z java po znalezieniu JPA, który dla kilku moich obecnych aplikacji jest wysyłany przez boga. Nie dotykałem java od czasów uniwersytetu i mam problem z wyczerpaniem przestrzeni sterty. Używam poniższego kodu jako głównej części niezbyt poważnego testu jdbc/jpa/lucene, ale wciąż otrzymuję losowe wyjątki OutOfMemory.Zarządzanie pamięcią java
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();
nie będę pisać wszystko createDocument ale robi to wystąpienie nowego org.apache.lucene.document.Document i dodaje pól poprzez dodatek (nowe pole ...) itd. Istnieje około 50 pola w sumie i większość to krótkie ciągi znaków (< 32 znaki).
W mojej nowości jest coś zupełnie głupiego, co robię (lub nie), co spowoduje, że rzeczy nie będą GC?
Czy istnieją najlepsze praktyki dotyczące zarządzania pamięcią w języku Java i łaskotania GC?
GC nie ma problemów z odwołaniami cyklicznymi, obiekty będą nadal usuwane. Nie jestem pewien, czy rozumiem, co masz na myśli, przez jawne odejście od odniesień do obiektów. Jak inaczej mógłbyś je usunąć? – Robin
Innym sposobem ich usunięcia jest wyjście z zakresu. Jawnie ustawienie odniesień do wartości null dotyczy kombinacji obiektów długich i długich, gdzie odniesienie do obiektu będzie przechowywane w pamięci przez długi czas. – gnud