programing tip

Java 객체를 null로 설정하면 더 이상 아무것도하지 않습니까?

itbloger 2020. 8. 6. 08:01
반응형

Java 객체를 null로 설정하면 더 이상 아무것도하지 않습니까?


필자는 오래된 책을 탐색하고 Peter Hagger의 "Practical Java"사본을 발견했습니다. 성능 섹션 null에는 더 이상 필요하지 않을 때 객체 참조를 설정하는 것이 좋습니다 .

Java에서 객체 참조를 설정 null하여 성능 또는 가비지 수집 효율성 향상 시킵니까? 그렇다면 어떤 경우에 이것이 문제입니까? 컨테이너 클래스? 객체 구성? 익명의 내부 클래스?

나는 이것을 코드에서 꽤 자주 본다. 이것은 이제 쓸모없는 프로그래밍 조언입니까, 아니면 여전히 유용합니까?


참조 무효화를 생각할 때 약간 다릅니다.

객체 체인 A-> B-> C가있는 경우 A에 도달 할 수없는 경우 A, B 및 C는 모두 가비지 수집 대상이됩니다 (B 또는 C를 참조하는 다른 항목이 없다고 가정). 예를 들어 참조 A-> B 또는 B-> C를 명시 적으로 null로 명시 적으로 설정할 필요가 없으며, 필요하지도 않았습니다.

그 외에도 실제로는 컬렉션의 객체를 다루기 때문에 문제가 실제로 발생하지 않습니다. 일반적으로 적절한 remove () 메소드를 호출하여 목록, 맵 등에서 객체를 제거하는 것을 항상 고려해야합니다.

이 케이스 로 사용 널로 설정 레퍼런스에 대한 조언은 구체적으로 하였다 메모리 집약적 오브젝트 범위를 통해 사용 도중에 것을 정지 긴 범위 . 예를 들면 다음과 같습니다.

{
  BigObject obj = ...
  doSomethingWith(obj);
  obj = null;             <-- explicitly set to null
  doSomethingElse();
}

여기서의 이론적 근거는 obj 가 여전히 범위 내에 있고, 명시적인 참조 null이 없으면 doSomethingElse () 메소드가 완료 될 때까지 가비지 수집 가능하지 않다는 것 입니다. 그리고 이것은 현대 JVM에서 더 이상 유지하지 않을 조언입니다 .JIT 컴파일러는 주어진 로컬 객체 참조가 더 이상 사용되지 않는 시점에서 작동 할 수 있습니다.


아닙니다. 쓸데없는 조언이 아닙니다. 댕글 링 참조는 여전히 ArrayList사전에 할당 된 배열을 사용하여 확장 가능한 배열 컨테이너 등을 구현하는 경우 여전히 문제가 됩니다. 목록의 "논리적"크기를 초과하는 요소는 무효화되어야합니다. 그렇지 않으면 해제되지 않습니다.

효과적인 Java 2 판, 항목 6 : 더 이상 사용되지 않는 객체 참조 제거를 참조하십시오.


인스턴스 필드, 배열 요소

객체에 대한 참조가 있으면 가비지 수집 할 수 없습니다. 특히 해당 객체 (및 그 뒤에있는 전체 그래프)가 큰 경우 가비지 수집을 중지하는 참조가 하나만 있으며 해당 참조가 더 이상 실제로 필요하지 않으므로 불행한 상황입니다.

병리학 적 사례는 구성에 사용 된 전체 XML DOM 트리, 등록되지 않은 MBean 또는 배포되지 않은 웹 응용 프로그램의 객체에 대한 단일 참조를 불필요하게 유지하는 객체로, 전체 클래스 로더가 언로드되지 않도록합니다. .

따라서 참조 자체를 보유한 객체가 어쨌든 가비지 수집된다고 확신하지 않으면 더 이상 필요하지 않은 모든 것을 무시해야합니다.

범위가 지정된 변수 :

범위가 끝나기 전에 로컬 변수를 널 (null)로 설정하여 가비지 수집기에서이를 회수하고 "지금부터 사용할 수 없음"으로 표시하려는 경우 대신보다 제한된 범위에 배치하는 것을 고려해야합니다. .

{
  BigObject obj = ...
  doSomethingWith(obj);
  obj = null;          //   <-- explicitly set to null
  doSomethingElse();
}

된다

{
  {  
     BigObject obj = ...
     doSomethingWith(obj);
  }    //         <-- obj goes out of scope
  doSomethingElse();
}

길고 평평한 범위는 일반적으로 코드의 가독성에 좋지 않습니다. 그 목적을 위해 사물을 분리하는 사적인 방법을 소개하는 것도 들어 본 적이 없습니다.


메모리 제한 환경 (예 : 휴대폰)에서는 유용 할 수 있습니다. null을 설정하면 objetc는 변수가 gc'd 범위를 벗어나기 위해 기다릴 필요가 없습니다.

그러나 일상적인 프로그래밍의 경우 Chris Jester-Young이 인용 한 특별한 경우를 제외하고는 이것이 규칙이되어서는 안됩니다.


첫째, 객체를로 설정한다는 의미는 아닙니다 null. 아래에 설명하겠습니다.

List list1 = new ArrayList();
List list2 = list1;

In above code segment we are creating the object reference variable name list1 of ArrayList object that is stored in the memory. So list1 is referring that object and it nothing more than a variable. And in the second line of code we are copying the reference of list1 to list2. So now going back to your question if I do:

list1 = null;

that means list1 is no longer referring any object that is stored in the memory so list2 will also having nothing to refer. So if you check the size of list2:

list2.size(); //it gives you 0

So here the concept of garbage collector arrives which says «you nothing to worry about freeing the memory that is hold by the object, I will do that when I find that it will no longer used in program and JVM will manage me.»

I hope it clear the concept.


One of the reasons to do so is to eliminate obsolete object references. You can read the text here.

참고URL : https://stackoverflow.com/questions/850878/does-setting-java-objects-to-null-do-anything-anymore

반응형