짬빵
대표칭호 없음
이해도 | 기타 |
---|
arrayList<Zombie> 만든다음에 거기에 zombie엔티티 하나 추가했을때 그 좀비를 때려 죽였을떄 리스트에서 좀비 가 사라지지 않는데 그러면 이 변수는 어떻게 되는건가요???ㅇㅅㅇ??
이해도 | 기타 |
---|
arrayList<Zombie> 만든다음에 거기에 zombie엔티티 하나 추가했을때 그 좀비를 때려 죽였을떄 리스트에서 좀비 가 사라지지 않는데 그러면 이 변수는 어떻게 되는건가요???ㅇㅅㅇ??
냥냐챠
2020.08.16자바 가상머신에는 가비지 컬렉터라는 더 이상 쓰지 않는 메모리를 수집하는 일종의 장치가 있다냥.
런타임에 일어나는 메모리 할당은 힙이라는 영역을 소분해서 나눠주는 것으로 구현된다냥.
메모리는 한정적이고 메모리를 계속 쓰기(할당)만 하고 다시 되돌려주지 않는다면 언젠가는 메모리가 부족해져서
새로운 데이터를 저장시킬 공간이 없어진다냥.
보통 유저(프로그래머)가 메모리를 할당한 뒤로 용도에 맞게 쓰이는 과정을 거치고 나면 더이상 공간을 차지하고 있을 필요가 없어지지냥
그렇게 쓸모 없어진 공간을 가비지 컬렉터라는 장치는 회수해서 다른 곳에서 쓸 수 있도록 정리 과정을 거친다냥.
c 나 c++ 같은 언어들은 메모리를 관리할 의무를 사용자에게 전가하기 때문에 delete 나 free 같은 것으로 메모리를 직접 해제해서
운영체제에 메모리를 돌려줄 수 있게 한다냥. 하지만 자바에는 그런 명시적인 방법이 없지냥.
가비지 컬렉터라는 애는 할당된 메모리에 참조 카운트라는 것을 관리하는데냥 내부적으로 증가시키거나 감소하는 것으로 어느 시점에 할당됐던 그 메모리가
회수되야 하는지 시점을 결정할 수가 있지냥.
이런 참조 카운트라는 것이 어느 시점에 오르고 내리는지 자세한 것은 기니깐 여기에 쓰지는 않겠다냥
다만 그쪽이 말하는 ArrayList 에 원소로써 월드에서 (곧)사라질 좀비 객체를 넣은 행위는 분명히 참조 카운트를 증가시키는 행위다냥
만약 거기에 넣지 않았더라면 참조 카운트는 0이 되어서 가비지 컬렉터가 그 좀비의 데이터가 담겨있던 메모리를 할당 해제하고
다시 쓸수 있게 만들어놨겠지냥.
하지만 지금 그 코드로 인해서 참조 카운트는 적어도 1 이상이 되어버려서 가비지 컬렉터가 좀비 데이터가 저장된 메모리를 해제하지 못하지냥.
만약 유저(프로그래머)가 이것을 의도하지 않았다면 이런 상황을 "메모리 누수" 라고도 한다냥. 계속 할당만 되고 해제되는 메모리는 없으니까
메모리가 종국에는 부족해져버리는 것이지냥
그쪽이 따로 관리하는 리스트에 좀비 객체를 넣었다고 해서 월드가 좀비를 못죽이는건 아니다냥. 거기에 넣었던 넣지않았던 좀비 내부데이터에 있는 isDead 라는 플래그는 죽게되면 true 로 갱신되게 되어있다냥. 그 뒤로는 월드에서는 그 좀비 객체를 없는 것 취급 한다냥. 이렇게 되면 유일하게 그 좀비의 존재를 아는 것은 그쪽이 담고 있는 리스트 객체 뿐이겠지냥?
나머지는 구글링해서 알아봐라냥 단서는 많이 줬다냥
열심히 코딩 판치해라냥 '3'b
짬빵
2020.08.16오오 그냥 궁금해서 물어본건데 이렇게 성의껏 대답해주셔서 정말 감사합니다 //ㅠㅅㅠ//
할말씀하신데로 자바 가상머신 가비지하고 참조카운터 한번 찾아보겠습니다
다시한번 정말 감사합니다 ㅠㅠ