[질문] 자바의 메모리 관리좀 알려주세요
새늘
안녕하세요. 그 좋다는 자바의 가비지 콜렉션.. 전 갈피를 못잡고 있습니다.
자바로 클래스를 지역 함수에서 선언 생성후 함수가 종료되면 이론상으로는 그 선언된 클래스 변수는 삭제됩니다.
그런데.. 이거 프로그램 종료될때까지 자바가 실행되던 중에 생성된 메모리가 그대로 있습니다.
물론 이것이 나중에 같은 루틴을 돌때 이미 생성된 메모리를 사용하기 때문에 속도에 도움이 된다는 건 압니다.
문제는 서버제작 시 입니다.
얼마나 접속 요청이 들어올지 모르는 상황에서 동적 할당된 메모리는 접속자가 0이되면 처음 상태로 돌아가 줘야 합니다.
그렇지만 테스트해보니 이론상으로는 지워져도 물리적 메모리는 줄지 않더군요.
황당 합니다.
더군다나 벡터를 이용하여 remove 시키면 또한 바로 삭제 가능하다고 들었습니다.
이또한 아니더군요
벡터에 인덱스 2까지 넣었다가 removeAll 시키면 이론상 벡터에서 삭제됩니다.
다시 add를 할경우 물론 인덱스 2를 넘을때까지는 메모리가 증가하지 않습니다.
문제는 removeAll이 되면 벡터에 추가되면서 생성된 메모리는 모두 지워져야 하는데 이또한 메모리 재사용을 위해서인지
전혀 줄지 않고 있습니다.
-------------------------------------------------------------------------------------------------------------------
1. 제가 위에 테스트 한 결과가 맞나요?
2. 순간적으로 C처럼 원할때 지울 수 있는 방법은 존재하나요?
3. 맞다면 이런 상황으로 서버를 그냥 제작해도 무리가 가지는 않나요?
-
더글러스
제가 잘 몰랐네요. null 대입을 잘 하고 조금 텀이 있지만 gc()가 날려주긴 하는군요. 진수다님. 수다님. 감사합니다 ..
-
해솔
사용이 끝난 객체는 레퍼런스에 null 을 대입해주고 신경 끄면 됩니다.
-
양자리
참고로 말씀드리자면, System..gc() 를 호출한다고 해서 바로 쓰레기 수집기(garbage collector)가 작동되는것은 아닙니다. System 클래스의 소스코드를 보면, System.gc() 는 내부적으로 Runtime.gc() 를 호출하게 되어있는데, Runtime.gc() 에 대한 javadoc 의 설명은 다음과 같습니다.
The name gc stands for \garbage collector\. The virtual machine -
달빛
그럼 이 상태로 그냥 서버 프로그램을 해도 괜찮을 지요?
-
나츠
// Let gc do its work
\tfor (int i = 0; i elementCount; i++)
\t elementData[i] = null;
\telementCount = 0;
} -
갤투
자바는 직접적인 메모리 해제가 안됩니다. 다만, 생성한 객체의 참조 카운트를 줄여주는 것 입니다. 말씀하신 벡터의 경우 removeAll()를 사용해서, 저장된 객체들을 해제하는데... 실제로 removeAll() 함수의 소스코드를 보면, 다음과 같이 되어 있습니다. 즉, 사용한 객체에 대한 참조를 해제 하는것은 단순히 참조주소를 지우고, null로 초기화 하는것 뿐입니다. 그리고, 가끔 너무 많은 메모리를 잡았다가 다시 해제 할려고 할 경우에는 Sys