2012-02-21 2 views
0

몇 시간 동안 실행하는 간단한 테스트 프로그램을 사용하고 있습니다.힙이 안정적 일 때 Java에서 RSS 유출을 진단하십시오.

public static void main(String[] args) { 
    for (int i=1; i<500; i++) { 
     run(); 
    } 
} 

public static void run() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       new String("Hello World"); 
      } 
     } 
    }).start(); 
} 

PS 또는 pmap을 통해 프로세스를 모니터링하면 jvisualvm이 힙을 안정적으로보고하는 동안 RSS 부분이 증가합니다.

모든 RSS anon 매핑을 요약하면 시간이 지남에 따라 증가하고 있습니다.

저는 Sun JDK 1.6.0_31과 함께 Centos 5.7 x64를 사용하고 있습니다.

시간이 지남에 따라 RSS가 증가해야합니까?

+0

프로그램이 무한 루프를 실행하는 499 개의 스레드를 생성합니까? – ydroneaud

+3

안녕하세요, RSS가 무엇을 의미하는지 모르지만이 새 문자열 ("Hello World")을 변경해보십시오. 이 "Hello World"에; 메모리 누출이 없을 때마다 새 문자열을 작성하게 만들지 마십시오. 어쨌든이 운동의 요점은 무엇입니까? –

+0

@yael : RSS는 상주 세트 크기를 나타냅니다. http://en.wikipedia.org/wiki/Resident_set_size – tr9sh

답변

0

백그라운드 작업이 더 많은 코드/리소스를 메모리로 가져옴에 따라 RSS는 시간이 지남에 따라 증가 할 수 있습니다. 귀하의 예에서는 그다지 중요하지 않습니다. 참고 : 공유 라이브러리가 메모리에로드 된 다른 JVM 인스턴스에서 공유 라이브러리를 사용하면 RSS가 증가 할 수 있습니다.

일반적으로 문제를 설명하는 가장 간단한 예제를 찾는 것이 가장 좋습니다. 500 개의 스레드 또는 코어 수만 있습니까? 바쁜 스레드가있을 때 발생합니까? 대신 new Object()을 생성하면 어떻게됩니까? 만약 당신이 물건을 만들지 않고 바쁘다면?

+0

에서 자세한 내용을 볼 수 있습니다. 500 개 이상의 코어가 필요합니다. 이것이 JAVA 앱이 실행될 때 RSS가 단순한 예제에서 증가하는 이유를 이해하려고합니다. 나는 그것이 공유 라이브러리가 메모리에로드되어 있다고 생각하는 경향이 있습니까? –

+0

예를 단순화하지 않으면 알기가 어렵습니다. 과도한 컨텍스트 스위칭이나 GCing으로 인해 문제가 될 수 있습니다. 어떤 식 으로든 귀하의 기계에만 국한 될 수 있습니다. 모니터링 도구를 연결하거나 다른 프로세스에서 공유 라이브러리를 사용하는 것이 원인 일 수 있습니다. –