2011-10-11 3 views
1

내 응용 프로그램 모듈에 대한 참조를 유지하는 HashMap이 있습니다. 나는이 작업을 수행 할 때Java : 객체를 삭제할만큼 충분합니까?

HashMap<String, Module> modules; 

는 :

for(String key:modules.keySet()){ 
    modules.remove(key); 
} 

따라서 그들은 어떤 점에서 GC에 의해 제거되어야하는 객체에 더 이상 참조가 없어야합니다. 내가 맞습니까? 아니면 뭔가를 놓쳤습니까? 이 보안이 적용 되었습니까? 아니면 어떻게 든 객체에 대한 액세스를 다시 확보 할 수 있습니까?

modules.clear(); 

:

이 수행 할 때 발생하는 동일합니까?

더 복잡한 질문 : GWT로 이것을 수행 할 때 브라우저에서 객체가 사라 졌음을 얼마나 확신 할 수 있습니까? 컴퓨터를 사용하는 사람이 이전 사용자의 정보를 검색하지 못하도록 사용자 로그 아웃시이 작업을 수행하려고합니다. 물론 대부분의 모듈은 데이터를 unDetach()로 "잊어 버린다". 그러나 나는 확신 할 수 없다. 이 정보는 누군가가 내가 감사 할 것이라는 것을 알게된다면 더할 나위없이 좋다.)

+0

GC와 GWT는 어떤 공통점이 있는가 그것을 정리하는 것이? GWT 코드는 Javascript로 컴파일되고 VM의 서버가 아닌 브라우저에서 실행된다는 점을 기억해야합니다. – Strelok

답변

5

첫 번째 방법은 keySet을 반복하고 동시에 요소를 제거 할 때 문제를 일으킬 수있다. 두 번째 방법은 올바른 일을해야합니다. 모듈에 대한 다른 참조 정보가 없으면 가비지 수집해야합니다.

1

질문은 오히려 누가 모듈에 액세스 할 수 있는지 다른 사람이 질문하는 것입니다. 프로그램의 다른 부분이 모듈 중 하나에 대한 참조를 얻었을 가능성이있는 경우 GC가 모듈을 제거하는지 확신 할 수 없습니다.

어쨌든 GC에 의존해서는 안됩니다. 더 많은 공간이 필요하고 응용 프로그램 실행이 끝난 후 메모리 정리를 처리하는 시스템 인 경우에만 실행됩니다. 적절한 정보에 액세스 할 수 없도록하려면 명시 적으로 제거하십시오. 자바 가비지 컬렉션에 관한 최초의 몇 가지 질문에 대한

+0

"명시 적으로 제거하십시오"- null로 설정하지 않으려면 어떻게해야합니까? – Alex

+0

GC가 개체와 모든 포함 된 데이터를 정리하기를 바라지 않고 "위험"하다고 생각되는 모든 정보를 수동으로 null로 설정합니다. 귀하의 질문에 나는 당신이'onAttach()'콜백을 사용하여 이미 그런 것들에 대해 생각했다는 것을 모았습니다. –

3

:

HashMap의의 remove(key) 방법은 수집에서 개체를 제거하는 안전한 방법입니다. 이렇게하면 개체가 컬렉션에서 더 이상 참조되지 않도록 할 수 있습니다. 그러나 그 자체로는 객체가 다른 참조에 의해 참조되지 않는다는 것을 보장하지 않습니다. 프로그래머가이를 보장해야합니다. 참으로 거기에 다른 심판이 없다면, 어떤 시점에서 객체가 수집 될 것입니다. clear() 메소드에서도 마찬가지입니다. 객체 참조에 대한 액세스와 관련하여 다른 프로그래밍 오류가 없으면 아무도 쓰레기 객체에 액세스 할 수 없습니다.

참고 : for 루프 대신 요소를 제거하려면 explicit Iterator.remove()을 사용하십시오. 귀하의 현재 방식은 ConcurrentModificationException입니다.

0

그냥 코드에서이 줄을 삽입 :

modules = null; 

그런 다음 GC의 검출을,이 객체에 더 이상 참조하지 않으며

관련 문제