2012-07-26 3 views
2

내 jboss 서버가 x96이 4096m, xmx가 4096m, permsize가 512m 인 상태에서 최근 hprof 형식의 힙 덤프를 만들었습니다.힙 덤프 크기 대 hprof 크기

생성 된 hprof 파일의 크기가 5GB 이상입니다. 내가 visualvm, 매트 분석기 또는 yourkit에서 힙 덤프를로드하면 약 1GB의 전체 바이트 만 표시됩니다. 나는 yourkit의 도달 범위를 변경하려고 시도했지만 1GB를 초과하지는 않습니다.

파일 크기와 표시된 힙 덤프 크기의 큰 차이는 무엇입니까?

PS : 나는 jdk1.6.0_23

사용하고 불행하게도 여기 스크린 샷을 제출할 수 아니에요.

객체 : 9.738.282/얕은 크기 7백40메가바이트/유지 크기 : 7백40메가바이트에 도달 할 문자열을 그 (것)들의 사이에서 : 파일 시스템 HPROF 크기가 5.227.659 KB이며 yourkit에이 상태에

6.652.515 (68 %)/얕은 크기 : 3백81메가바이트 (51 %)/유지 크기 : 381메가바이트 (51 %)

유지 최대 사이즈가 바이트 []이다 206.810.176 사용 않은 명령

+0

VisualVM에서 '요약'탭의 스크린 샷을 게시 할 수 있습니까? –

+0

스크린 샷을 추가 할 수 없지만 yourkit의 정보를 추가했습니다. – Michael

+0

YourKit의 데이터가 도움이되지 않습니다. 어떻게 계산되는지 모르겠습니다. VisualVM에서이 작업이 어떻게 수행되는지 알고 있습니다. 내가 당신을 도우려는 경우 '기본 정보'부분의 데이터를 제공하거나 (컨텍스트 메뉴에 사본이 있음) 압축 된 힙 덤프를 어딘가에 업로드하고 링크를 보내주십시오. –

답변

2

힙 덤프를 생성 하시겠습니까?

$JAVA_HOME/bin/jmap -dump:live,format=b,file=c:/tmp/heap_dump.bin PID 

어쩌면 당신은

-dump:<dump-options> to dump java heap in hprof binary format 
        dump-options: 
        live   dump only live objects; if not specified, 
            all objects in the heap are dumped. 
+0

안녕하세요, 다음 명령을 사용합니다 : jmap -F -dump : format = b, file = $ {filename} $ PID. 라이브 옵션을 oracle에 따르면 "지정된 경우 힙의 활성 객체 만 덤프됩니다." 그래서 이것을 지정하면 힙 덤프가 더 작아 지지만 메모리 누수의 원인을 찾는 기회가 줄어들 수도 있습니다 – Michael

+0

이것은 정말 좋은 질문입니다 - 라이브 객체 란 무엇입니까? 그 라이브 개체가 GC에 사용할 수없는 것이라고 가정합니다. 그래서 라이브 옵션은 그냥 가비지 개체를 제거하고 당신은 살아있는 개체를 갖게 될 것입니다 - 이것은 이것이 발견 가능성을 감소시키지 않는다는 것을 의미합니다 ... 나는 정말로 거대한 덤프 (약 16 GB)의 라이브 옵션으로 최근에 거의 메모리 누출을 발견하지 못했습니다. ... –

+0

안녕하세요 Andrey, 답장을 보내 주셔서 감사합니다. "실제로 거대한 덤프 (약 16GB)의 라이브 옵션으로 메모리 누수가 거의 발견되지 않았습니다."도움이 될지 모르지만 여전히 디스크의 hprof 크기와 이러한 도구에서 hprof (힙 덤프)를로드하면 분석기 도구의 크기가 표시됩니다 ... – Michael

2

당신이 "도달 할 수없는 객체 히스토그램"(당신이 "개요"페이지 상단에서 링크를 찾을 수 있습니다)을 시도해 봤어 사양에 따라, 라이브 옵션을 통과해야합니까? 1509MB 크기의 힙 덤프 중 하나에서 매트는 454MB 만 표시되지만 나머지는 기본적으로 가비지이므로 도달 할 수없는 개체 막대 그래프의 "얕은 힙"의 합계는 966MB입니다.

1

이것은 GC가 실행될 때 가비지 수집되었을 수있는 많은 양의 도달 할 수없는 개체로 구성되었을 가능성이 가장 높다는 것을 의미합니다. 이제 누설이 없다는 의미는 아닙니다. 5GB Hprof에서 4GB의 개체에 연결할 수 없으므로 누출의 원인이 흥미롭지 않습니다.

자바에서 메모리 누수는 가비지 콜렉션이 객체에 대한 참조를 보유하고있어 (예기치 않게) 객체를 지울 수없는 경우에만 발생할 수 있습니다. 따라서 누출 (있는 경우)은 hprof에 남아있는 1GB 개체에서 발견됩니다.