2014-01-06 4 views
0

A 클래스의 인스턴스는 가비지 수집 될 것입니까? 아니면 영원히 메모리에 남아 있을까요?메소드를 finilize 할 때 객체의 참조를 객체 속성으로 설정하면 어떻게됩니까

개체가 가비지 수집 대상이되고 해당 finalize() 메서드가 호출되었고이 메서드 내에서 개체가 실행중인 라이브 스레드에서 액세스 할 수있게되면 가비지 수집되지 않는다는 것을 알고 있습니다.

public class A{ 

    String someString = null; 
    private A a=null; 
    public String getSomeString() { 
    return someString; 
    } 
    public void setSomeString(String someString) { 
    this.someString = someString; 
    } 
    @Override 
    protected void finalize() throws Throwable { 
    try { 
     this.a=this; 
     System.out.println("final called");  
    } finally { 
     super.finalize(); 
    } 
    } 
} 
public static void main(String args[]) throws Exception { 
    A s1=new A(); 
    s1=null; 
    System.gc(); 
    System.out.println("gc called"); 
    ...... 
} 

Can we switch off finalizers?

+0

this.a = this는 gc를 방지하지 못합니다. 'life'에 의해이 객체에 대한 참조가 여전히 존재하지 않으므로 gc가됩니다. 라이브 스레드와 같이 다른 것으로부터 참조한다면 살아남을 수 있습니다. – Vladp

+0

@Vladp 그 대답을하고 당신이 내 최대 - 투표를 얻을거야 ... –

+0

@ Vladp 내 생각 this.a =이 속성에 대한 참조를 할당? 내가 틀렸다면 나를 수정 해주세요. –

답변

2

당신이

this.a=this; 

을 추가 라인 ...이 도달하지 않습니다,이 개체는 여전히 라이브 스레드와 같은 유효한 뭔가에서 참조되지 않는 .

더 복잡한 구조를보고하십시오 : 첫 번째 (원형 목록)에 마지막 노드를 가리키는 경우 List

는 다음 설정하기 위해 Node head = null; 다음 아마도 각 노드가 여전히 다른 노드에서 지적되고 있지만, 전체 목록은 라이브 스레드에서 참조되지 않고 거기에서 가비지 수집됩니다.

가비지 수집기는 개체가 참조되고 있는지 확인하는 것이 아니라 유효한 스레드에서 참조가 있는지 확인합니다.

결론은 다음과 같습니다 객체가 가비지 수집의 스레드에서 도달 할 수없는

합니다. 귀하의 경우에는 A가 더 이상 연결할 수 없습니다.

4

의해 대상체 (this)이 강하게 도달하지 않는 방법 (finalize())에서 그 할당 영감 때문에 가비지 수집되지 않도록하지 않을 것이다. 한편

, 당신이 한 경우 :

otherObject.a = this; 

otherObject이 강하게 도달 객체 참조를, 다음 과제는 this 강하게 도달 할 것, 그리고 그것을 수집에서 개체를 방지 할 수 (도달 할 수있는 동안 ...). 그러나 다음 번에는 this에 도달 할 수 없으므로 finalize 메서드는 호출되지 않습니다. 개체의 finalize 메서드는 개체 수명 기간 동안 한 번만 호출됩니다. 이 속성의에 내가 this.a=this 생각


참조를 할당? 내가 틀렸다면 나를 바로 잡아라.

당신은 정확하다. 그러나 그것은 효과가 없다. 당신이하는 일은 this 그 자체를 가리키는 것입니다. 즉, GC가되는 것을 A을 방지 할 수있는 것이 아닙니다

+0

그래서 실제로 자바에서 메모리 누수를 만드는 방법이 있습니까? 좋은. – Vladp

+0

@ Vladp - 당신이 말하는 의미는 아닙니다. –

+0

목적에 따라 finalize를 호출하고 (otherObject.a = this를 사용하여) 다시 연결할 수 없으면 gc가이를 수집하지 않으며 메모리 누수가 발생합니다. 잘못된? – Vladp

관련 문제