Сборка мусора не работает в Java

Приведенный ниже метод имеет 2 для циклов. Firstloop повторяется 36000 раз, а внутренний forloop повторяется 24 раза, поэтому общее количество вставок записей будет 864000. Выполнение кода выполняется почти 3,5 часа и завершается (сбой вставки записей) Закрытие сеанса и принятие транзакции выполняется только после окончания внешнего цикла. Установлено, что потребление ОЗУ во время выполнения составляет около 6,9 ГБ.

@SuppressWarnings("unchecked")


public void createBRResults() {

    List<BusinessRules> businessRuleList = null;
    Organization organization = null;
    Brresults brresults = null;
    Criteria criteria = null;
    Criteria newCriteria = null;
    String brStatus = "Live";
    Date date = new Date();
    Session session = sessionFactory.openSession();
    Transaction transaction = null;
    try {
        if (callInfos == null) {
            callInfos = getEntities(CallInfo.class);
        }
        for (CallInfo callInfo : callInfos) {
            transaction = session.beginTransaction();
            criteria = session.createCriteria(BusinessRules.class);
            criteria.createCriteria("businessGoals").add(
                    Restrictions.eq("category", callInfo.getCategory()));
            businessRuleList = criteria.list();
            organization = callInfo.getOrganization();
            for (BusinessRules businessRule : businessRuleList) {
                brresults = new Brresults();
                brresults.setBusinessRule(businessRule);
                brresults.setCallInfo(callInfo);
                brresults.setCreatedDate(date);
                brresults.setModifiedDate(date);
                brresults.setOrganization(organization);
                brresults.setBrrStatus(brStatus);
                brresults.setBrrValue(Math.random() < 0.5 ? 0 : 1);
                session.save(brresults);
                brresults = null;
            }
            criteria = null;
            organization = null;
            businessRuleList = null;
            session.flush();
            session.clear();
            transaction.commit();
            System.gc();
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        session.close();
    }
}

Я приложил последние несколько строк журнала GC, чтобы указать распределение памяти

17034.595: [Полная ГХ (эргономика) [PSYoungGen: 979968K->979964K(1862144K)] [ParOldGen: 5576158K->5576158K(5576192K)] 6556126K->6556123K(7438336K), [Metaspace: 2319K] 23195: 23195: 23195: 23195: 23195: 23195: 23195: 23195,1195. 2,1041939 с] [Время: пользователь =8,61 сис =0,00, реальное = 2,11 с]

17036.699: [Полная ГХ (эргономика) [PSYoungGen: 979968K->979964K(1862144K)] [ParOldGen: 5576158K->5576158K(5576192K)] 6556126K->6556123K(7438336K), [Metaspace: 2319K] 23195: 23195: 23195: 23195: 23195: 23195: 23195: 2319: 23195: 23195: 2319: 23195: 23195: 23195: 23195: 23195: 2319): 23195: 23195: 2319): 23195: 23195: 23195: 23195: 23195: 23195: 239: 239: 17036.699. 1,5930338 с] [Время: пользователь = 9,39 сс =0,00, реальное =1,59 с] 17038,292: [Полный ГХ (эргономика) [PSYoungGen: 979968K-> 979964K (1862144K)] [ParOldGen: 5576158K-> 5576158K (5576196K)] 65 > 6556122K (7438336K), [Metaspace: 23195K-> 23195K (1071104K)], 1,9376959 с] [Время: пользователь =8,51 сс =0,00, реальное =1,94 с]

17040.230: [Полная ГХ (эргономика) [PSYoungGen: 979968K->830418K(1862144K)] [ParOldGen: 5576158K->5576027K(5576192K)] 6556126K->6406445K(7438336K), [743833KK] 23196: 239: 1919: 231: 1919: 231: 1919: 231: 1919: 236: 1919: 239: 1919: 239: 1919: 239: 1919 2.9929302 с] [Время: пользователь =17,97 сис =0,00, реальное = 3,00 с]

Куча PSYoungGen всего 1862144K, используется 889367K [0x0000000715d80000, 0x00000007bdc80000, 0x00000007c0000000)

Иден пространство 979968K, 90% использовали [0x0000000715d80000,0x000000074c205e48,0x0000000751a80000) из космоса 882176K, 0% использовали [0x0000000787f00000,0x0000000787f00000,0x00000007bdc80000) к космическому 885760K, 0% использовали [0x0000000751a80000,0x0000000751a80000,0x0000000787b80000) ParOldGen всего 5576192K, используется 5576027K [0x00000005c1800000, 0x0000000715d80000, 0x0000000715d80000) космический объект 5576192K, 99% использовал [0x00000005c1800000,0x0000000715d56d38,0x0000000715d80000) Метапространство используется 23223K, 23502K способности, совершенное 24064K, зарезервированных 1071104K класса пространства, используемого 2443K, 2537K емкости, совершенное 2560K, защищено 1048576K

Но если я закрываю сессию и открываю снова для каждых 24 итераций, вставка записей завершается успешно, и это занимает 55 минут. но использование оперативной памяти составляет около 3 ГБ.

Почему сборка мусора не происходит должным образом? Какие ошибки в коде?

1 ответ

Session накапливает ссылки на все объекты, к которым вы прикоснулись, так как он должен возвращать вам один и тот же объект, если вы запрашиваете его дважды в течение одного сеанса. Вы должны периодически закрывать его, чтобы позволить ему отказаться от контекста.

Другие вопросы по тегам