2009-09-25 2 views
23

리눅스에서 실행중인 자바 프로세스에 대한 내 메모리가 어디에 있는지 찾으려고합니다. 누군가는 pmap -x를 사용하여 메모리가 무엇을하는지 정확히 알 수 있다고 제안했습니다.누출 위치를 찾으려고합니다! pmap의 의미는 무엇입니까?

출력은 정말 긴하지만, 기본적으로 그것의 좋은 부분이의 반복이다 :

00007fbf75f6a000 1016  -  -  - rwx-- [ anon ] 
00007fbf76068000  12  -  -  - ----- [ anon ] 

정확히 무엇을 의미 하는가은? 왜이 항목이 너무 많습니까 (4000 이상)?

답변

28

Anon 블록은 malloc 또는 mmap을 통해 할당 된 "큰"블록입니다. 맨 페이지를 참조하십시오. 따라서, 그들은 자바 힙과는 아무런 관련이 없다. (힙 전체를 이런 블록에 저장해야한다는 것 말고는).

제 경험상 스레드 스택도 anon 블록을 사용합니다. 모든 크기가 같고 크기가 512k에서 4Mb 인 수많은 익명 블록이있는 경우 (아래 예제는 내가 실행중인 Tomcat 프로세스에 대해 12 번 이상 반복됩니다), 그럴 가능성이 높습니다. 프로그램에 따라 최대 수십 가지가있을 수 있습니다. 수천 명이 보이면 스레딩에 문제가 있음을 의미합니다. 왜 자바 메모리 문제를 진단 에서 pmap을 사용하고 있습니다 :

b089f000 504K rwx-- [ anon ] 
b091d000  12K ----- [ anon ] 
b0920000 504K rwx-- [ anon ] 
b099e000  12K ----- [ anon ] 
b09a1000 504K rwx-- [ anon ] 
b0a1f000  12K ----- [ anon ] 

는하지만 그 질문을 남긴다?

+0

> pmap을 사용하여 Java 메모리 문제를 진단하는 이유는 무엇입니까? 힙이 최대 256MB로 설정된 Java 프로세스가 있지만 RSS 메모리는 8.9GB입니다. 이것을 진단하기 위해 우리는 다른 어떤 도구를 사용할 수 있습니까? – Opher

+1

@Opher - 물론, 당신에게 의미가 있습니다. 하지만 너 OP 야? (그렇다면 8 년 후에 왜 의견을 말합니까?). 원래 질문에서 OP가 자신이 원하는 것을 알고 있는지 여부는 불분명했습니다. – kdgregory

+1

제안 사항 : 구성된 힙 크기와 RSS 사이에 이와 같은 불일치가있는 경우 메모리 매핑 파일이나 직접 버퍼를 찾습니다. 예를 들어 카프카 (Kafka) 또는 SOLR 서버에서 이러한 동작을 볼 수 있으며 이는 정상입니다. – kdgregory

3

익명 메모리에 대한 시스템 성능 튜닝의 this partthis part을 참조하십시오.

+0

익명 할당이 어떻게 관리되는지 알려줍니다. 비록 전반적인 링크가 꽤 좋은 것입니다. – kdgregory

2

Eclipse MAT를 사용하십시오 (원시 힙이 아닌 Java 힙에서 OutOfMemoryExceptions를 얻는 경우).

0

이전에 스레드 누출 패턴을 보았습니다. 쓰레드를 풀하려고하는 코드가 있지만 어떻게 든 엉망이되어 쓰레드가 누출된다면, pmap에서 그런 패턴을 얻을 수 있습니다.

저는 메모리의 각 비트가 스레드의 최소 스택 크기라고 생각합니다. 우리의 경우에는 힙과 관련이 없습니다.
우리는 OS 제한을 맞았을 때 여전히 OutOfMemoryErrors를 얻었습니다. 심지어는 힙을 분석 할 때 전체적으로 계산되지 않습니다.

이와 같은 문제가 발생했을 때 pmap [pid] | grep -c 12K은 사용중인 스레드 수로 밝혀졌습니다.