에서 수집 나는 이상한 행동을 발견 : 나는하는 SoftReference를 통해 그래프 개체의 이름을 설정하는 setName(String name)
방법이하는 SoftReference는 <String>없는 쓰레기 때 메모리
을 :
(garbagedData는 ReferenceQueue이며이 특정 문제에서는 중요하지 않음).
주 스레드에서 graph.setName("name");
을 호출하고 OutOfMemory
오류가 발생하면 참조가 가리키는 값이 garbaged가 아니지만 graph.setName(new String("name"))
을 호출하면 오류가 발생합니다.
이클립스 메모리 분석기로 힙 내용을 볼 수 있으며 두 경우 모두 소프트 힙보다 다른 참조 체인이 없습니다.
누군가가이 이상한 행동에 대한 설명을 갖고 있다면 나는 관심이있다.
메모리 제한 캐시는 매우 나쁜 생각입니다. 오래된 항목은 수명이 오래 지속됩니다. – kdgregory
@kdgregory : 나는 그것이 나쁜 생각이지만, 대부분 당신은 전혀 통제 할 수 없다는 데 동의합니다. 그러나 "유용 수명"이 무엇인지 알 수없고 다른 캐시의 균형을 유지할 방법이 없습니다 (예 : "cache-1 제한을 1000 개 항목으로 설정해야합니까?"와 같은 것을 결정해야합니다. 캐시 -2는 함께 100MB 이상을 사용합니다. "). – maaartinus
내 경우에는 "유용한 생명"이 가장 길다. 그러나 강력한 참조를 사용하면 메모리 부족이 발생할 수 있습니다. @kdgregory : 필요할 때마다 gc가 개체를 삭제할 수 있으면 개체를 메모리에 보관하는 것이 나쁜 일입니까? @ maaartinus : 참조를 수동으로 null로 설정하고 캐시 크기를 제한 할 수 있습니까? – zelus