2011-01-21 2 views
3

JPA를 사용하여 Glassfish에서 실행되는 간단한 EAR 응용 프로그램이 있습니다. 그것은 내 Oracle DB 테이블에서 레코드를 읽고 처리합니다. 처리가 끝나면 데이터베이스에 표시가되고 엔티티 관리자에서 clear()를 호출하여 처리 된 객체를 분리하고 GC 할 수 있습니다. 그러나 clear() 힙 사용법을 추가 한 후에도 전체 힙이 계속 감소하고 결국 최대 힙에 도달합니다. 누출의 원인이 될 수있는 다른 물건이 없으며 더 많은 것을 할 수 있는지 잘 모릅니다. 또한 JPA 캐시가 해제되었습니다.Java Persistence (JPA) 힙 문제

<property name="eclipselink.cache.shared.default" value="false"/> 

아무도 JPA 개체가 보관되지 않도록 할 수 있습니까? 거래와 관련이있을 수 있습니까? 처리 할 레코드의 마지막 배치를 업데이트 할 때마다 새 트랜잭션을 사용합니다.

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

모든 의견을 환영합니다. 애플리케이션을 프로파일 링 할 수 있다는 것을 알고 있지만이 문제를보기가 매우 어렵습니다. 그리고 수집 한 JPA 객체가 될 것이라고 기대하더라도 엔티티를 한 번 삭제할 때 누락 된 부분이 있는지 확실하지 않습니다. 그들은 더 이상 필요하지 않습니다.

제임스

+1

확인하십시오. – skaffman

답변

2

JProfiler와 같은 메모리 프로파일 러를 사용하는 것이 가장 좋습니다.

그렇지 않으면 메모리 누수가 발생하는 곳을 좁히십시오. 범인을 찾을 때까지 처리의 각 부분을 제거해보십시오.

시간이 지남에 따라 메모리가 부족합니까? 아니면 결국 메모리가 부족한 하나의 큰 트랜잭션을 처리하고 있습니까?

처리중인 개체를 잡을 필요가 없는지 확인하십시오. 아마도 일부 코드를 포함 할 수 있습니다. 복잡한 쿼리를 수행합니까?