마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바 메모리 관리에 대한 의문점..

0 추천
별 생각이 없이 쓰고 있긴 했습니다만...

 

객체를 참초하는 참조변수를 null로 지정하면 객체와의 참조관계가 끊어져 가비지 컬렉터의 수거 대상이 되는건

 

알고 있습니다.

 

그런데 보통 객체를 생성하고 예를들어..

A a = new A();

이렇게 하고 나서 나중에 a = null;

이렇게 다시 null 해주는 릴리즈문법은 잘 사용하는걸 못봣거든요.

그렇다면 저렇게 생성된 A는 가비지 컬렉터가 언제 수거해가는거죠?

죄다 물어보면 사용되지 않을때 수거해간다는데..

그게 언젠지;;

null을 안했다는건 계속 사용중이라는 뜻 아닌가요?

그럼 계속 제거가 안되야 되는데..

것도 아닌거 같고;;
갸아악 (21,260 포인트) 님이 2013년 4월 2일 질문
짧은 지식으로 간단한 경우
void a(){
   TestObject t = new TestObject();
 ....
}

void b(){
}

void main(){
   a();
   b();
}

이 경우 a()가 호출되어 동작하는 동안은
TestObject t = new TestObject(); 문장에 의해 생성된 TestObject 인스턴스는 t에 강한참조가 되지만 a()호출이 끝나는 순간 t는 사라지므로(지역변수이기에)
생성된 TestObject는 강한참조가 더 이상 존재하지 아니하여 GC 대상이된다
정도로 이해하면 되지 않을까요?

문제는 실무에서는 복잡한 문제로 OutOfMemory가 발생하는 경우가 대다수인듯..

비슷하게 액티비티내 멤버로 갖는 오브젝트들은 액티비티가 소멸되면서 기본적으로 강한참조가 사라지겠죠.

1개의 답변

+1 추천
 
채택된 답변

가비지 컬렉팅을 하는 시점은 크게 3가지 입니다.

1. 한개의 문단이 종료되었을경우 스텍메모리를 리턴하면서 가비지컬렉팅을 같이 합니다.

2. 시스템에서 주기적으로 가비지 컬렉팅을 합니다. (일정 메모리를 초과하면 수거 대상을 산출하여 gc를 시행합니다... 기준이 이래서 상당히 비 주기적이라고 보시면 됩니다.)

3. 새로운 메모리 할당이 필요한데 사용 가능한 빈 메모리가 없을때 강제로 시행합니다.

 

간단하게 말하자면 가비지 컬렉팅의 대상에서 벗어나는 경우는

1. 객체가 변수에 대입되어 있는경우 (레퍼런싱도 마찬가지 입니다)

2. 각종 리스너가 달려있는경우

이며

가비지 컬렉팅의 대상이 되게 만들려면 말씀하신것처럼null을 대입하거나 리스너를 제거하시면 됩니다.

 

정확한 개념은 

http://aroundck.tistory.com/entry/Garbage-Collection-GC-%EA%B0%80-%EB%AD%90-%ED%95%98%EB%8A%94-%EB%85%80%EC%84%9D%EC%9D%B8%EC%A7%80-%ED%95%9C-%EB%B2%88-%ED%95%B4%EB%B6%80%ED%95%B4%EB%B3%B4%EC%9E%90

블로그에 상세하고 정확하게 서술되어있습니다.

 

심지어 순환참조까지 캐치해서 GC 해준다니 null값을 어사인 하지 않았다고 해서 GC가 되지 않거나 하진 않는것 같습니다.

Noizbuster (11,970 포인트) 님이 2013년 4월 2일 답변
갸아악님이 2013년 4월 2일 채택됨
...