2011-03-12 4 views
1
simpleClass sc = new simpleClass(); 
sc.getObject(); 
... 

simpleClass.java자바 코딩 표준

class simpleClass { 

    static int st = 0; 

    public Integer getObject() { 
     Integer i = 10; 
     Integer j = 10; 
     Integer result = 10; 

     try { 
      result = getSum(i, j); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } finally { 
      i = null; 
     } 
     return result; 
    } 

    public Integer getSum(Integer a, Integer b) { 
     return a + b; 
    } 
} 

설명해주십시오하는 변수/객체 쓰레기 자격 입니까?

몇 시까 지 메모리에 남아 있습니까?

가비지 메모리를 사용할 수 있지만 메모리에 남아있는 개체는 어떻게해야합니까?

메모리에있을 때까지 인생과 인상입니다.

내 친구들과 나는 이미이 문제에 대해 토론을 해왔고 여전히 많은 다른 성명서로 계속하고 있습니다.

답변

1

논쟁하는 대신 Java 가비지 수집에 대한 몇 가지 사항을 읽어보십시오. :) 예를 들어 http://www.ibm.com/developerworks/java/library/j-jtp11253/ 또는 http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html입니다.

이 (static int가 참조 아니므로, 당신은 당신의 코드에서의 아무도 없어) 정의는 기본적으로 정적 참조로 구성을 설정 소위 루트가 또는 지역 주민 (Integer i/Integer j있는 변수를 스택/Integer result)뿐만 아니라 메서드 실행 중 매개 변수 (정수 a/정수 b)가 있습니다. 따라서 getObject() 실행 중에 i, j ans 결과로 참조되는 개체는 루트 집합의 일부가되며 gc (해당 개체에서 간접적으로 참조 할 수있는 개체)는 사용할 수 없습니다. 일단 getObject()가 끝나면 i와 j의 객체를 제거 할 수 있습니다. 결과 개체는 다른 로컬 변수에 할당 된 경우 (예 : Object o = aSimpleClass.getObject()) 루트 집합에 남습니다.

1

보겠습니다.

class simpleClass { 
    static int st = 0; 

st 변수는 전혀 사용하지 않습니다 -이 의도적?

public Integer getObject(){ 
      Interger i = 10; 
      Interger j = 10; 
      Interger result = 10; 

나는 Integer이어야한다고 생각합니다. 그래서 여기에 3 개의 변수를 생성하고 모두 동일한 객체, 즉 Integer.valueOf(10)의 결과를 할당합니다. 이 메소드는 적어도 작은 값의 경우 동일한 입력에 대해 동일한 객체를 반환하도록 보장됩니다. 일반적으로이 값은 Integer 클래스의 정적 배열에 저장됩니다. 여기

  try{  
       result = getSum(i, j); 

당신은 getSum 메소드를 호출 - (수정 된 경우)이 Integer.valueOf(20)와 같은 또 다른 객체를 반환합니다. (서브 클래스에서 합계 메소드를 오버라이드 (override)하지 않는 경우가 아닌) 예외가 있었다면

  }catch(Exception ex){ 
       ex.printStackTrace(); 

, 당신은 캐치 여기 예외 객체를 인쇄 한 다음 던져 버릴 것이다.

그래서 가비지 수집에 사용할 수있는 하나의 개체 (및 포함 된 스택 추적 개체)입니다. 여기

  } finally{ 
       i = null; 

당신은 i 변수에 null를 할당한다.ii을 통해서만 참조 된 개체가 포함 된 경우 가비지 수집을 위해 사용할 수 있지만 j 변수 (및 Integer의 정적 변수 어딘가에있는 것으로 추정되기도 함)에도 포함되어 있기 때문에 그렇지 않습니다. 그래서 지금 (i, j, result)이 종료되는 모든 지역 변수 -

  } 
      return result; 

우리는 방법을 종료합니다. 20 개체 (result)가 반환되므로 이제는 호출하는 메서드의 책임이 있습니다. 10 객체 (j)는이 스레드에서 더 이상 참조되지 않으므로 (적어도 코드에서 볼 수있는 것은 아님) 해제 될 수 있습니다. 그러나 일반적으로 Integer 클래스는이 객체에 대한 참조를 유지하므로 가비지 수집을 유지하지 않습니다 이리.

} 
    public Interger getSum(Interger a, Interger b){ 
     retrun a + b; 
    } 

코드를 게시 할 때 적어도 컴파일러를 통해 실행하십시오. Integerreturn입니다.

} 
+0

x 버디이지만 완료/실행 메소드의 객체는 가비지 콜렉션 itSelf에 적합하므로 i = null; j = null; –

+0

이 간단한 메소드에서는'i = null'과'j = null'은 필요 없습니다. 매우 오래 실행되는 방법의 경우 이해할 수 있지만 메모리 또는 성능 문제가있는 경우에만 이러한 최적화에 대해 생각한 다음 측정하십시오. –