은의 클래스 A와 클래스 B를 부르 자자바 정적 해시 맵 메모리 문제는이 개 수업을
public class A{
private static HashMap<String,B> isc= new HashMap<String,B>();
public static void UserDisconnected(String key){
if(isc.containsKey(key)){
if(isc.get(publicSID).timer != null){
isc.get(key).timer.cancel();
isc.get(key).timer=null;
}
isc.remove(key);
}
log.debug("isc size:" + isc.size());
}
//and other non-static variables and methods
}
public class B{
//contain no static variables and methods
public void startStream(){
timer = new Timer();
timer.schedule(new timedTask(), 0, interval);
}
public class timedTask extends TimerTask{
public void run(){
//do something
}
}
클래스 A는 응용 프로그램의 전체 수명을 살 것이다
동안 참조되는 클래스 B의 인스턴스 클래스 A에서 UserDisconnected() 메소드를 실행 한 후 isc의 크기가 0이지만, Windows 서버의 작업 관리자에 표시된 메모리 사용량과 같은 것으로 나타납니다. 2008 아래로 다시 내려 가면 어떤 메모리도 해제되지 않습니다. 해시 맵 가비지에서 클래스 B의 인스턴스가 수집 되었습니까? 또는 가비지 컬렉터가 수집 할 수없는 곳에서 사라졌습니다.
감사합니다.
VM에 어느 정도 달려 있다고 생각합니다. 머리 글자가 작아서 핫스팟 클라이언트 VM이 메모리를 OS로 다시 릴리스 할 가능성이 높지만 서버 VM은 메모리를 그대로 유지할 것입니다. – skaffman
메모리 누수의 원인이 될 수있는 코드에는 아무런 문제가 없습니다. 메모리를 OS로 되돌릴 방법이 있습니까? –
개체에 대한 모든 참조를 해제하는 경우 적절한 순서로 가비지 수집됩니다 (반드시 즉시 발생하는 것은 아님). 나는 당신이 프로그램 적으로 OS에 메모리를 반환 할 수 있다고 생각하지 않는다. –