[Java] 자바에서 메모리 해제..
글쓴이: leolo / 작성시간: 수, 2004/07/28 - 10:16오후
자바에서 메모리 해제를 어떻게 하죠..
현재 리눅스에서 jdk1.3을 깔고, 아파치, 톰캣을 돌리고 있는데..
계속해서 메모리 사용량이 증가합니다.
자바의 경우, 메모리가 자동으로 해제되는 것으로 알고 있는데...
자꾸 메모리가 증가하고 있습니다...
어떻게 된 원인이죠..
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
10 root 16 0 0 0 0 SW 0.3 0.0 0:05 0 kscand/HighMem
1281 ering 24 0 61620 60M 22208 S 0.3 5.9 0:54 0 java
2201 root 15 0 672 672 560 S 0.1 0.0 0:00 0 in.telnetd
Forums:
보여주신 값만으론 원인을 정확히 파악할 수가 없네요. trace 라도 떠
보여주신 값만으론 원인을 정확히 파악할 수가 없네요. trace 라도 떠서 보여주셔야.. -_-;
짐작가는 거만 우선 끄적거려보면.
0. 원칙적으로, java 에서 메모리 할당/해제는 vm 이 전담합니다. 즉, "자동으로만" 써야 한단 말이죠.
System.gc() 조차도 강제해제가 아니라 gc 타이밍을 앞당기는 것일 뿐입니다.
따라서, java 쪽에서 메모리 문제를 해결한다는 것은 jvm 이 해제를 빨리 할 수 있도록 객체의 상태를 만들어 주어야 하는거죠.
1. 자바에서 객체의 메모리 해제는 그 객체를 참조하는 객체가 없어야 작동합니다.
사용중인 객체를 해제하면 낭패니깐요.
혹, class 의 static member 로 선언됨 Hashtable 이나 List, Set 등에 담아두고 해제가 안된다고 하시면 곤란하죠.
jsp 등을 작성하실 때 실수하기 쉬운 부분입니다.
2. vm 시동시에 -Xmx 옵션을 주어서 최대로 쓸 수 있는 메모리의 제한을 주는 것도 할 수 있는 방법이겠네요.
3. jvm 에서는 반환했으나 운영체제상에서 이후 메모리 재할당을 위해 잠시 반환을 유보하는 경우가 있습니다. 이 경우엔, 다른 프로세스가 메모리를 요구할 땐 즉시 반환받아서 필요한 쪽으로 제공하니까 별 문제가 안되죠.
톰캣에서 수행되는 Java로 된 프로그램에 한번 수행이 끝난 시점에
톰캣에서 수행되는 Java로 된 프로그램에 한번 수행이 끝난 시점에
Total Memory = Runtime.getRuntime().totalMemory()
Java Memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
를 찍어 보세요.
매번 수행이 될 때마다 토탈이 증가하면 자바외에 다른데서 메모리가 새는 것이고, 자바 메모리가 증가하면 수행 중인 자바 프로그램에서 메모리가 샌다고 보면 됩니다.
자바 프로그램에서 샌다면, 위에 답변된 것처럼 계속 참조할 필요가 없는 클래스가 다른 클래스에 의해 계속 참조가 되는지, static으로 선언된 Collection 클래스들이 정말 static이어야 하는지 다시 한번 살펴 보세요.
----
I paint objects as I think them, not as I see them.
atie's minipage
댓글 달기