Ошибка OutOfMemory: превышен лимит накладных расходов GC — спящий режим

#java #spring #hibernate #hql

#java #весна #впасть в спящий режим #hql

Вопрос:

Я использую режим гибернации для сохранения данных в моей таблице. У меня есть свой класс сущности и основной класс, через основной класс я вызвал конструктор класса сущности и создал объект, а в цикле for сохранил объект в БД через спящий режим. Я получаю ошибку OutOfMemory: превышен лимит накладных расходов GC, я не понимаю почему, кто-нибудь может, пожалуйста, помочь? Ошибка OutOfMemoryError

Вот мой код :

 Session session = HibernateSessionFactory.getSession();
for(int i=0;i<serviceIds.length;i=i  )
{
 EntityClass ec = new EntityClass
                            (Integer.parseInt(serviceIds[i]),0,someId3, 0,1,id2,
                            new Timestamp(System.currentTimeMillis()), 0,
                            null, null, 0, null,null,null,null);
session.save(ec);
}
session.flush();
session.clear();
 

Вот мой класс сущности:

 public class EntityClass implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private Integer someId1;
    private Integer someId2;
    private Integer someId3;
    private Integer flag1;
    private Integer flag2;
    private Integer createdBy;
    private Timestamp createdDate;
    private Integer modifiedBy;
    private Timestamp modifiedDate;
    private Timestamp endDate;
    private Integer attribute1;
    private String attribute2;
    private String attribute3;
    private String attribute4;
    private String attribute5;
//full constructor
public EntityClass(Integer someId1, Integer someId2,
            Integer someId3, Integer funBlockFlag, Integer functionalFlag,
            Integer createdBy, Timestamp createdDate, Integer modifiedBy,
            Timestamp modifiedDate, Timestamp endDate, Integer attribute1,
            String attribute2, String attribute3, String attribute4,
            String attribute5) {
        this.someId1= someId1;
        this.someId2 = someId2;
        this.someId3 = someId3;
        this.funBlockFlag = funBlockFlag;
        this.functionalFlag = functionalFlag;
        this.createdBy = createdBy;
        this.createdDate = createdDate;
        this.modifiedBy = modifiedBy;
        this.modifiedDate = modifiedDate;
        this.endDate = endDate;
        this.attribute1 = attribute1;
        this.attribute2 = attribute2;
        this.attribute3 = attribute3;
        this.attribute4 = attribute4;
        this.attribute5 = attribute5;
    }
//getter and setters of all fields
 

Кто-нибудь может помочь мне с проблемой?

Ответ №1:

Когда мы сохраняем объект (в данном случае EntityClass ), Hibernate сохранит его в контексте сохранения.

Из вашего случая кажется, что длина идентификаторов служб может быть слишком большой для памяти, которую вы установили для своей JVM.

Возможно, попробуйте очистить и очистить контекст сохранения для каждых N элементов. Например, пусть указано, что ваш BATCH_SIZE равен 20

 private static final BATCH_SIZE = 20; // declare at class level

Session session = HibernateSessionFactory.getSession();
for(int i=0;i<serviceIds.length;i=i  )
{
    EntityClass ec = new EntityClass
                            (Integer.parseInt(serviceIds[i]),0,someId3, 0,1,id2,
                            new Timestamp(System.currentTimeMillis()), 0,
                            null, null, 0, null,null,null,null);
    session.save(ec);

    if (i % BATCH_SIZE == 0) {
        session.flush();
        session.clear();
    }
}
session.flush();
session.clear();
 

Комментарии:

1. Длина идентификаторов службы составляет всего 3 @MK Tan, также появляется ошибка в строке session.save (ec)

2. @SearchingForSolutions Если это так, то, основываясь на приведенном фрагменте кода, я не могу определить, вызвано ли это гибернацией, это могут быть другие запущенные потоки, из-за которых GC не может претендовать на свободную память. Какова максимальная куча, которую вы устанавливаете, и в какой среде вы запускаете этот код?