2014-04-11 2 views
0

나는 다음과 같은 코드를 가지고메모리를 올바르게 지우는 방법은 무엇입니까?

Vehicle v= new Vehicle(); 
Car car = v.getCar(); 
v.clear(); 

클리어() 차량에서 나는 clear()를 호출 한 후 그 누구도 다른 차 개체에 대한 액세스를 얻을 수 없는지 확인하기 위해 노력하고

clear() 
{ 
    car=null; 
} 

입니다. 위와 같이 null로 설정할 수는 있지만 다른 사람이 참조를 유지하는 것을 멈추지 않으며 여전히 메모리 위치에 액세스하여 데이터를 가져올 수 있습니다.

내가 로그 아웃 후, System.gc()

유스 케이스가 전화를 걸 해달라고, 난 메모리에 저장된 모든 선택을 취소해야합니다. 또한 저장소 메커니즘은 싱글 톤입니다. 싱글 톤을 사용하지 않더라도이 문제는 계속 발생합니다.

+0

게터 방법으로 '자동차'를 비공개로 유지하고 수비 사본을 반환 할 수 있습니다. 주제에 유용 할 수있는 [또 다른 질문] (http://stackoverflow.com/q/10951820/1089811). –

+1

방어 복사본을 반환하면 무엇을 얻을 수 있습니까? 메모리 사용에 관한 한 문제는 더 악화 될 수 있습니다. –

답변

4

외국 호출자에 대한 참조를 제공하는 즉시 참조 대상의 수명주기 관리에 대한 희망을 잊을 수 있습니다. 가비지 수집기가 도달 할 수있는 객체를 터치하지 않기 때문에 System.gc()을 호출하는 것은 쓸데없는 일입니다.

로그 아웃 할 때 할당 해제하려는 객체에 대한 참조를 노출시키지 않도록 응용 프로그램을 설계해야합니다. 일반적으로 이것은 매우 어려운 명령이므로 실제로 필요한지 두 번 생각해야합니다.

1

System.gc() 전화는 어쨌든 도움이되지 않습니다. 프로그램에 의해 호출 될 의도는 없으며, 효과가 거의 없습니다 (일부 경우 정당화 되기는하지만 이는 드뭅니다).

어딘가에 참고 자료를 제공하면 누가 그 정보를 보유하고 있는지 알 수 없습니다. 당연히 당신은 WeakReferences으로 일부 두개골 두루 시도를 할 수 있습니다. 그러나 도움이되지 않을 것입니다.

유일한 기회는 참조를 제공하지 않도록 프로그램을 디자인하는 것입니다. 그렇지 않으면 다른 사람들이 자신을 붙잡을 수 없게 될 수 없습니다.

0

어떻게 생각 하시나요? 다른 스레드가 객체를 정리할 때 객체를 사용하면 어떻게 될까요? 그것의 중간 작업이 사라지나요? System.gc()은이 경우에 당신을 위해 아무 것도하지 않습니다. 참조 GC가 있으면 그것을 지우지 않을 것이며 아무 것도 없으면 나중에 어쨌든 지울 것입니다.

개체가 Java 메모리에서 제거 될 수 있도록하는 유일한 방법은 단색 디자인을 사용하는 것입니다. 더 이상 필요하지 않을 때 개체를 붙잡지 않아도됩니다 (JVM 버그에 대해 지금 말하지 않음).). 로그 아웃시 메모리를 지우려면 로그 아웃 할 때마다 참조를 지우십시오.

소프트, 약한 또는 팬텀 참조를 통해 비트를 추가로 제어 할 수 있습니다. 개체를 유지할 수 있고 GC를 방지 할 수는 있지만 특정 개체에 GC를 적용 할 수는 없습니다.

+0

's/Ghost/Phantom/g' –

관련 문제