0

약한 참고 문헌을 읽었습니다.
here에서 학습하는 코드를 사용하고 있습니다. 그것은 매우 간단합니다.언제 약한 참조가 제거되기 시작하는지 알아 내려고.

private void doFunction() throws InterruptedException { 
     Map<Integer, String> map = new HashMap<Integer, String>(); 
     myMap = new WeakReference<Map<Integer, String>>(map); 
     map = null; 
     int i = 0;  
     while (true) {  
      if (myMap != null && myMap.get() != null) { 
       myMap.get().put(i++, "test" + i); 
       System.out.println("im still working!!!!");  
      } 
      else { 

       System.out.println("*******im free at:"+i+"*******"); 
       Thread.sleep(5000); 
       if(myMap != null){ 
        System.out.println("*******myMap is not null*******"); 
       } 
      }   

    }  

나는 작은 힙 크기 또는 –Xms and –Xmx를 통해 어떤 크기를 요청할 수 있지만, 캐시 i == 15312에서 제거 된 값을 볼 수 있었다하지 않았다.
따라서 15312 개체가 Map에 있으면 GC에서 항목을 제거하기 시작합니다.
내 질문 : 1531232 bit machine4 GB의 메모리가 너무 낮습니까? 참조가 제거되기 전에 나는 훨씬 더 높은 가치를 기대하고 있었다.
내가 잘못 생각하나요? 어떤 점에서 객체가 제거되기 시작하는지 평가할 수 있습니까?

+0

당신은 추측 할 수 있습니다 ... 간단히 말하면, 그것은 약한 유령에 대해 알고있는 것이 좋지만, GC를 가지고 있다는 생각은 이런 것들에 대해 너무 많이 생각하지 않아야합니다. – hovanessyan

답변

2

WeakReference의 요점은 은 VM이 물건을 가비지 수집 할 때을 신경 쓰지 않는다는 것입니다. 그러면 VM은 메모리 풋 프린트 측면에서 옳은 일이라고 생각하는 것을 수행합니다. & 성능 믹스.

개체가 15312 개가 된 후에 개체를 수집하기 시작했기 때문에 GC가 구현 및/또는 구성되는 방법에 따라 달라집니다 (다른 버전의 JVM이 다르게 수집 될 수도 있음) . 다시 말하지만, WeakReferences을 사용하는 경우 임의의 시점에 물건이 수집 될 것으로 예상해야하며, 이러한 일이 발생하면 시도하고 제어하려는 노력은 효과가 없습니다.

VM이 "메모리가 꽉 찼을 때"보다 훨씬 빨리 수집 할 수 있기 때문에 15312는 "메모리가 4GB 인 32 비트 시스템에서는"낮지 않습니다. 그렇지 않으면 "메모리가 가득 찰 때까지 결코 수집 할 수 없습니다 "- 이것은 구현 & 구성에 따라 다르며 특정 아키텍처의 특정 VM 버전에 대해 매우 구체적인 사용 최적화 시나리오에서 매우 구체적인 대상 성능 최적화를 수행하지 않는 한이 변경 시도에 소요되는 시간이 낭비됩니다.

+0

'메모리가 가득 찰 때'. 그러나 프로그램에 4GB의 가상 메모리가 있습니다. 메모리가 가득 찼습니까? JVM이 메모리가 꽉 찼다 고 생각할 때를 이해하십시오. 힙에있는 '15312' 정수가 많지 않습니다. – Jim

+0

sleep()을 짧게 설정하면 더 높은 숫자가 표시됩니다. 최소한 오라클 JVM은 약한 참조 객체를 탐지 할 첫 번째 기회에서 다소 약하게 참조 된 객체를 수집합니다. – Durandal

+0

@ 짐 : 강제로하지 않으면 VM에 4GB의 힙이 없습니다. 그리고 VM은 OutOfMemoryException을받을 때 메모리가 가득 찬 것으로 간주합니다. – Romain

관련 문제