2012-12-17 3 views
1

내 응용 프로그램은 많은 양의 지오메트리 데이터를 추출합니다. 필자는 Eclipselink 2.4.1을 사용하여 해당 데이터를 MySQL 데이터베이스에 유지합니다. 응용 프로그램은 배치 스타일로 작동합니다. 즉, 데이터 집합을 수집 한 다음 유지하고 다음 집합으로 계속 진행하고 계속 유지합니다. 나중에 다른 응용 프로그램에서 해당 데이터를 읽고 처리하지만이 질문은 데이터를 수집하는 첫 번째 응용 프로그램에 관한 것입니다.Eclipselink가 캐시의 모든 메모리를 소비하지 못하게하려면 어떻게해야합니까?

데이터 수집 응용 프로그램은 꽤 오랫동안 실행됩니다. 고정 된 세트 EntityManagers은 시작시 생성되고 응용 프로그램이 끝날 때까지 살아 있습니다. 추출은 멀티 스레드이며 스레드 당 하나의 EntityManager가 있습니다. 내 문제는 캐시 구성 방법에 관계없이 잠시 후에 EclipseLink가 모든 메모리를 차지하고 잠시 후에 OutOfMemoryError이 발생한다는 것입니다.

나는 Eclipse Memory Analyzer을 사용하여 분석 한 힙 덤프를 추출하기 위해 VisualVM을 사용했습니다. 의심스러운 메모리 양은 EntityManagerImpl.extendedPersistenceContext.cloneMapping입니다. 이지도에는 내 지오메트리 데이터 객체에 대한 참조가 있습니다. 시간이 지남에 따라이지도의 크기는 수백 메가 바이트가되며 이는 메모리 부족 오류의 원인입니다.

  • 내가 eclipselink.persistence-context.reference-mode=weak을 구성하여 약한 참조를 사용

    은 이미 다음과 같은 노력했다. EntityManagerImpl.extendedPersistenceContext.cloneMappingIdentityWeakHashMap 인 것으로 확인되었습니다. documentation about weak caches에서 참조 모드 weak을 사용하면 문제가 해결 될 것으로 예상됩니다. 불행히도 가비지 컬렉터는 여전히 항목을 주장하지 않으며 메모리 오류가 계속 발생합니다.
  • eclipselink.cache.shared.default=false으로 캐싱을 완전히 해제하려고했습니다. 문제가 지속됩니다.

아무도 여기에 무슨 일이 일어나고 있는지, 그리고 어떻게 그 문제를 해결할 수 있는지에 대한 제안을 갖고 있습니까? 나는 또한 문제를 우회하는 방법에 대한 제안을한다.

+0

나는 이것이 오래되었음을 알고 있지만, 참조 모드 FORCE_WEAK를 시도 할 수 있습니다. 그러나 여전히 문제를 해결하지 못할 수도 있습니다. EclipseLink에 버그가있는 것 같습니다 : https://www.eclipse.org/forums/index.php/t/302044/ - 결국 빈 QueuableWeakCacheKeys로 채워집니다. – Erhannis

+0

감사합니다. 이후 EclipseLink 사용이 완전히 중단되었습니다. – Valentin

답변

2

몇 가지.

먼저 긴 수명의 EntityManagers를 유지하면 안됩니다. 트랜잭션마다 또는 요청 당 새 EntityManger를 만들어야합니다.

둘째, 가비지 수집 대상이 아닌 개체를 참조하는 응용 프로그램 (정적 변수 등)이 개체에 대한 참조를 보유하지 않도록하십시오.

관련 문제