2016-09-15 3 views
2

컴퓨터를 많이 사용하는 일회용 오프라인 처리 작업을 수행하는 데 몇 시간이 걸리고 Caffeine을 메모리 내장 캐시로 사용하고 있습니다. 최대 캐시 크기를 설정하는 좋은 추론은 무엇입니까? Java 프로그램을 8GB RAM으로 실행하고 있으며 캐시 용량을 4GB로 줄 의도가 있지만 캐시 메모리의 실제 크기로 메모리가 어떻게 변환되는지 확신 할 수 없습니다. 내가 결정한 JVM을 수 있도록 .softValues()와 함께 가기로 결정하지만 카페인의 JavaDoc을에서 다음 단어에 달렸다 :카페인 : 적절한 캐시 크기를 얻는 방법

경고 : 대부분의 상황에서 소프트 사용하는 대신 당 캐시의 최대 크기를 설정하는 것이 좋습니다 참조. 소프트 참조의 실제 결과에 대해 잘 알고있는 경우에만이 방법을 사용해야합니다.

답변

2

소프트 참조는 개념적으로 매력적이지만 일반적으로 장기 실행 JVM에서 성능을 저하시킵니다. 이는 이전 세대를 채워서 힙 압력을 생성하고 전체 GC 동안 만 collected이기 때문입니다. 이로 인해 충분한 메모리가 해제 될 때마다 신속하게 소모되고 또 다른 전체 GC가 필요하게되는 GC 스 래싱이 발생할 수 있습니다. 대기 시간에 민감한 응용 프로그램의 경우, 캐시가 가장 중요하다는 것을 암시 할 수있는 방법이 없으므로 제거가 전역 적이므로 영향을받습니다.

소프트 참조는 기본값이 아니어야하며 전략으로 이동하십시오. 처리량이 아닌 사용자 직면 작업에서 합리적인 단순화 일 수 있습니다. 그러나 GC 시간, 대기 시간 및 예측 가능한 성능이 중요한 경우 위험 할 수 있습니다.

크기 조정에 대한 최상의 대답은 추측하고 측정하고 반복하는 것입니다. 통계 내보내기, 설정 시도 및 적절하게 조정 적중률 곡선은 액세스 추적 (키 해시 로그) 및 다른 크기의 simulating을 캡처하여 얻을 수 있습니다. 흥미로운 데이터이지만 보통 튜닝을위한 간단한 실행만으로 충분합니다.

1

소프트 참조를 사용하면 VM이 메모리가 부족한 경우 개체를 회수 할 수 있습니다. 이는 캐시와 다른 전략입니다. 당신은 단순히 가질 수있는 WeakHashMap (SoftReferenceWeakReference 차이가 있지만이)

하나의 큰 차이점은 캐시가 일반적으로 소프트/약한 참조가 우승하는 동안 객체를 축출하기위한 전략 (LRU, FIFO 등)을 결정하자 것입니다 '티.

적어도 크기는 개체의 크기를 추측 할 수 있어야합니다. 1k, 1MB, 10MB입니까?

오브젝트의 크기가 실제로 얼마나 큰지 알지 못하는 경우 대부분의 캐시를 사용하여 축출에 리스너를 추가하고 로그 할 수 있습니다. 조회시 캐시 미스에 대한 로그와 결합하면 캐시 성능에 대한 좋은 아이디어를 얻을 수 있습니다.

관련 문제