2017-03-15 10 views
0

내 라이브러리에서 버퍼 풀링을 사용하고 SoftReference을 사용하여 개체 및 풀 크기 균형을 암시 적으로 반환하는 방법을 생각했습니다. 에 의해 그래서ReferenceQueue는 객체 풀링에 적합합니까?

, "적합"내 말은 :

  1. 예를 들어, 명시 적 ArrayBlockingQueue를 비교가 매우 확대됨에 있습니까? (규모보다 작음)
  2. 핫스팟, 달빅 (Dalvik) 및 ART와 같은 최신 VM에서 WeakReference s보다 "부드럽게"동작 할만큼 신뢰할 수 있습니까? 나를 위해

, 그것은 "조기 최적화", 풀에 객체를 반환으로 덜 번거 로움을 초래할 수 있지만 특정 요구 사항을 충족하지 않는 경우 풀링의 혜택을 부정하는 것입니다 단지 건축의 선택이 아니다.

+0

어떻게 소프트 참조를 실제로 사용 하시겠습니까? 저는 이러한 구조가 어떤 종류의 풀링을 염두에두고 설계된 것이 아니라고 확신 할 수 있다고 생각합니다. 이는 최종 결정 구조이며 모든 종류의 마무리와 마찬가지로 어떤 종류의 합리적인 기간에 실행될 것이라고 기대할 수 없습니다. 무슨 일이 일어나는지는 엄청난 수의 JVM 및 GC 특정 구성에 달려 있습니다. –

답변

0

SoftReference 또는 WeakReference이 Java (TM) 플랫폼이나 Android에서 작동하지 않는다고 생각할 이유가 없습니다. Java (tm)와 Android 동작의 차이점에 대해 이야기하는 Android bug report이 있습니다. Android는 Java (tm)보다 "열심히"부드러운 참조를 지 웁니다. 그러나, 분석은 차이가 있음을 주장한다 : 디자인에 의해

  • 및 사양의 "의미 봉투"내
  • ; 즉 Java (tm) javadocs.

그러나 내가 (풀에) 객체의 반환을 구현하기 위해 참조 객체를 사용하는 방법을 제안합니다. 버퍼에 할당 된 코드가 객체에 대한 (강력한) 참조를 삭제하면 참조가 대기열에 들어 오기 전에 약한 참조 또는 소프트 참조가 지워집니다. 즉, 버퍼 풀의 ReferenceQueue가 그것에 대해 듣기 전에 버퍼가 GC됩니다.

반면에 약한/부드러운 참조를 사용하여 수영장이 메모리 누출이 아닌 경우 ... 괜찮습니다. SoftReference이 올바른 선택입니다.

SoftReference는 명시 적 풀 크기 조정에 유용하지 않습니다. 소프트 참조는 메모리 압력에만 반응하며, 당신은 거의 통제 할 수 없습니다.

마지막으로 참조 및 참조 대기열에서 상당한 GC 오버 헤드가 발생합니다. 그들이 깨지지 않았을 때, GC는 그것들을 만났을 때 그것들을 표시해야합니다. GC가 이들을 깨뜨릴 때 대기열에있는 참조를 처리 할 때 대기열에 상당한 오버 헤드가 있습니다.

+0

나는 SR이 암시 적 풀 크기 조정에 유용하다는 것을 의미했다. 충분한 메모리가 없으면 지워질 것이다. – Pavlus

+0

여러 가지 이유로 풀 크기 조정을 위해 SR에만 의존하면 성능 문제가 발생할 수 있습니다. 명시 적 풀 크기가 SR과 함께 더 좋을 수 있습니다. 그러나 오버 헤드는 여분의 GC 헤더로 표시되기 때문에 측정하기가 어렵습니다. –

+0

"풀로 돌아가십시오"라는 말은 객체에 대한 강력한 참조가 없으면 (제 3 자 코드에서 더 이상 사용되지 않는), GC에 의해 대기열에 포함되며 SoftReference가 여전히 가능하기 때문에, 아직 수집되지 않았다면, 큐에서 참조를 사용하여 "의도적으로 손실 된"객체를 다시 얻을 수 있습니다.그리고 충분한 메모리가없고 사용하지 않은 물건이 많으면 수집됩니다. – Pavlus