2009-07-30 2 views
0

은의 클래스 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의 인스턴스가 수집 되었습니까? 또는 가비지 컬렉터가 수집 할 수없는 곳에서 사라졌습니다.

감사합니다.

답변

2

작업 관리자의 메모리 사용량이 줄어들 것으로 예상됩니다. 사용 된 메모리는 나중에 사용할 수 있도록 Java로 반환되며 다른 응용 프로그램을 위해 OS로 반환되지 않습니다.

+0

VM에 어느 정도 달려 있다고 생각합니다. 머리 글자가 작아서 핫스팟 클라이언트 VM이 메모리를 OS로 다시 릴리스 할 가능성이 높지만 서버 VM은 메모리를 그대로 유지할 것입니다. – skaffman

+0

메모리 누수의 원인이 될 수있는 코드에는 아무런 문제가 없습니다. 메모리를 OS로 되돌릴 방법이 있습니까? –

+0

개체에 대한 모든 참조를 해제하는 경우 적절한 순서로 가비지 수집됩니다 (반드시 즉시 발생하는 것은 아님). 나는 당신이 프로그램 적으로 OS에 메모리를 반환 할 수 있다고 생각하지 않는다. –

2

Windows 작업 관리자가 Java JVM 힙이 운영 체제에 의해 할당 된 메모리를 표시한다는 사실을 알아야합니다. GC가 실행될 때 번호가 위아래로 이동하지 않습니다.

아마도 메모리가 걱정되고 너무 긴 참조에 매달려 있다면 WeakHashMap을 시도해야 할 것입니다.

또한 인터페이스 맵을 isc의 유형으로 사용하는 것이 좋습니다.

0

Windows 작업 관리자를 사용하여 프로그램에서 사용하는 메모리의 양을 정확히 알 수 없습니다. JVM은 메모리를 보유하고 있기 때문에 아무 것도 사용하지 않습니다. JVM과 GC 알고리즘이 프로그램이 실제로 사용하는 것보다 더 많은 메모리를 확보하는 것이 더 효과적입니다. 실제 메모리 사용량을 확인하려면 VisualVM과 같은 도구가 필요합니다 (최신 JDK와 함께 제공됨).

0

다른 사람들이 언급했듯이 JVM은 일반적으로 GC로 메모리를 OS로 반환하지 않습니다.

JVM에서 사용 된 메모리와 사용 가능한 메모리의 비율을 보려면 VisualVM을 사용하고 메모리 누출의 원인을 추적하기 위해 힙 스냅 샷 기능을 통해 메모리 프로파일 링을 사용할 수도 있습니다.

JVM 으로 메모리를 반환하지만 기본 설정은 사용하지 않은 메모리보다 훨씬 많은 공간이있을 때만이 작업을 수행합니다. -XX:MinHeapFreeRatio and -XX:MaxHeapFreeRatio options을 통해이 동작을 조정할 수 있습니다.

1

답변이 하나뿐입니다.

profile 응용 프로그램입니다.

http://www.google.com/search?q=java+profile 중 하나가 있으며, 사용 후 클래스가 정리되지 않은 경우 정확하게 알 수있는 이러한 prfoilers입니다.

0

이제 VisualVM을 다운로드하여 사용하면 그래프와 차트가 너무 예쁘다 ... 어쨌든, 나는 그것을 사용하여 응용 프로그램을 프로파일 링합니다. 고마워요.