최대 절전 모드를 사용하여 MySQL 데이터베이스를 쿼리하여 특정 여행의 모든 세그먼트를 찾습니다. 예를 들어 A-> D에서 A-> B, B-> C, C-> D 세그먼트가있을 수 있습니다.가비지 컬렉션 오버 헤드 한도 - 최대 절전 모드
이 쿼리는 매우 자주 실행되며 매우 빠르게 완료됩니다. 데이터베이스는 성능이 매우 좋은 방법으로 인덱싱됩니다. 다음과 같이 쿼리에 대한 코드는 다음과 같습니다 dailyJournies
이 클래스의 initilisation에 설정되고 다시 변경되지 않습니다
public List<Segment> getSegmentsForUID(String trainUid) {
Query segmentQuery = session.createQuery("select segment from Segment segment inner join segment.journey as journey where segment.journey " +
"in (:journies) and journey.trainUid = '" + trainUid + "'");
segmentQuery.setParameterList("journies", dailyJournies);
queryCount++;
return segmentQuery.getResultList();
}
.
제 문제는이 쿼리를 여러 번 (일반적으로 2,000 개에서 3,000 개까지의 쿼리를 수행 한 후) 항상 Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
을 return segmentQuery.getResultList();
줄에 넣었다는 것입니다.
초기화 이후에이 클래스의 다른 부분을 다루지 않으므로이 줄에서 예외가 항상 throw되기 때문에 다른 곳에서는 문제가 있다고 상상할 수 없습니다.
조금 파고 들었을 때 생각했던 원래의 생각은 Hibernate 세션이 너무 커져서 1,000 개의 쿼리가 끝날 때마다 세션을 닫고 다시 시작하기 시작했지만 아무런 차이가 없었습니다. 또한 다음 코드를 사용해 보았습니다.
Cache cache = session.getSessionFactory().getCache();
cache.evictAllRegions();
수동으로 세션 캐시를 지우는 데는 아무 것도하지 않았습니다.
다른 사람이 전에 이것을 보았습니까? 아니면 실종되었다는 것이 명백하게 드러났습니까?
프로필 응용 프로그램; 당신이 붙잡고있는 것을 결정하십시오. –
Netbeans의 @BoristheSpider 프로파일 링은 생존하는 세대가 시간이 지남에 따라 꾸준히 증가한다는 것을 보여줍니다. 객체 프로파일 러에서 char []가 가장 많은 메모리를 사용하고 있으며 시간이 지남에 따라 꾸준히 증가하는 것으로 나타났습니다. 다시 코드에 연결하는 데 사용할 수있는 다른 도구가 있습니까? – Tom
문제와 관련이 없습니다. 문자열 처리를 사용해서는 안됩니다. 이미 명명 된 매개 변수를 사용하고 있습니다. 왜 'trainUid'에도 사용하지 않으시겠습니까? – the8472