I am using spring and hibernate in my project and few day ago I found that Dev environment has crashed due to Java out of heap space exception. After some preliminary analysis using some heap analysis tools and visual vm, I found that the problem is with the one select SQL query. I rewrote the SQL in a different way which solved the memory issue. But now I am not sure why the previous SQL has caused the memory issue. Note: The method is inside a DAO and is called in a while loop with a batch size of 800 until all the data is pulled. Table size is around 20 million rows. For each call, a new hibernate session is created and destroyed.
Previous SQL:
@Override
public List<Book> getbookByJournalId(UnitOfWork uow,
        List<Journal> batch) {
    StringBuilder sb = new StringBuilder();
    sb.append("select i from Book i where ( ");
    if (batch == null || batch.size() <= 0)
        sb.append("1=0 )");
    else {
        for (int i = 0; i < batch.size(); i++) {
            if (i > 0)
                sb.append(" OR ");
            sb.append("( i.journalId='" + batch.get(i).journalId() + "')");
        }
        sb.append(")");
        sb.append(
                " and i.isDummy=:isNotDummy and i.statusId !=:BookStatus and i.BookNumber like :book ");
    }
    Query query = uow.getSession().createQuery(sb.toString());
    query.setParameter("isNotDummy", Definitions.BooleanIdentifiers_Char.No);
    query.setParameter("Book", "%" + Definitions.NOBook);
    query.setParameter("BookStatus", Definitions.BookStatusID.CLOSED.getValue());
    List<Book> bookList = (List<Book>) query.getResultList();
    return bookList;
}
Rewritten SQL:
@Override
public List<Book> getbookByJournalId(UnitOfWork uow,
        List<Journal> batch) {
    List<String> bookIds = new ArrayList<>();
    for(Journal J : batch){
        bookIds.add(J.getJournalId());
    }
    StringBuilder sb = new StringBuilder();
    sb.append("select i from Book i where i.journalId in (:bookIds) and i.isDummy=:isNotDummy and i.statusId !=:BookStatus and i.BookNumber like :Book");
    Query query = uow.getSession().createQuery(sb.toString());
    query.setParameter("isNotDummy", Definitions.BooleanIdentifiers_Char.No);
    query.setParameter("Book", "%" + Definitions.NOBook);
    query.setParameter("BookStatus", Definitions.BookStatusID.CLOSED.getValue());
    query.setParameter("specimenNums",specimenNums);
    query.setParameter("bookIds", bookIds);
    List<Book> bookList = (List<Book>) query.getResultList();
    return bookList;
}
 
    