Сборка мусора не работает в 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
накапливает ссылки на все объекты, к которым вы прикоснулись, так как он должен возвращать вам один и тот же объект, если вы запрашиваете его дважды в течение одного сеанса. Вы должны периодически закрывать его, чтобы позволить ему отказаться от контекста.