2009-03-26 3 views
5

Websphere6.1, Solaris 10, JDK 1.5.0_13의 Java 웹 응용 프로그램입니다. 최대 힙 크기를 1024m로 설정했습니다. jmap은 힙 상태가 양호 함을 나타냅니다. 힙 메모리 사용량은 57 %에 불과합니다. OutOfMemory 없음.-Xmx1024m이있는 Java 프로세스가 3GB 상주 메모리를 차지하는 방법은 무엇입니까?

하지만 ps에서이 Java 프로세스에 대해 매우 높은 RSS (3GB)를 보았습니다. pmap은 1.9G 개인용 메모리 블록을 보여줍니다.

 
3785: /dmwdkpmmkg/was/610/java/bin/java -server -Dwas.status.socket=65370 -X 
Address Kbytes  RSS Anon Locked Pgsz Mode Mapped File 
... 
0020A000 2008 2008 2008  - 8K rwx-- [ heap ] 
00400000 1957888 1957888 1957888  - 4M rwx-- [ heap ] 
8D076000  40  40  40  - 8K rw--R [ stack tid=10786 ] 
... 

네이티브 코드에서 C 힙 메모리 누수가 있습니까? 근본 원인을 찾기 위해 어떤 접근 방법을 권장합니까?

답변

4

Troubleshooting Memory Leaks 문서는 Sun의 높은 RSS, 특히 섹션 3.4에있는 문제점을 찾는 데 도움이 될 수 있습니다.

Websphere를 실행하면서 VM에 -memorycheck을 사용할 수 있습니다. 자세한 내용은 here을 참조하십시오.

네이티브 코드의 누수가 반드시 필요한 것은 아닙니다. here을 보면 Solaris에서 파일을 열어 두는 데 문제가있을 수 있습니다.

단지 링크와 힌트이지만, 문제를 추적하는 데 도움이 될 수 있습니다.

+0

도움이됩니다. -memorycheck는 IBM JDK에서만 사용할 수있는 것처럼 보입니까? Solaris에는 IBM JDK가없고 SUN JDK 만 있습니다. 맞습니까? – gengmao

+0

모르겠다. 솔라리스에 대한 경험이 없지만 아마도 ... IBM JDK는 Websphere와 함께 제공 될 것입니다. 그게 내가 생각한거야. – MicSim

1

JNI 라이브러리를 사용하고 있습니까? 네이티브 코드가 RAM을 어떻게 할당하는지는 확실하지 않지만 그것이 어디에서부터 시작해야 할 것인가.

2

힙 크기가 Java 힙 크기보다 작 으면 프로세스의 일부인 VM 및 기타 라이브러리가 여전히 있습니다.

1024m 힙 크기와 "for;")가있는 Hello World를 실행하고 소요량을 확인하십시오. 전체 메모리 사용에 대한 기준을 제공해야합니다.

3

(숨겨진 Zip 리소스와 같은) 원시 메모리 누수가없는 경우에도 이러한 현상이 발생할 수 있습니다.

같은 문제가 발생했습니다. 이 glibc에 알려진 문제> = 2.10 치료가 MALLOC_ARENA_MAX에 대한 MALLOC_ARENA_MAX https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

구글 설정에 대한이 ENV 변수를 export MALLOC_ARENA_MAX=4

IBM 문서를 설정하거나 찾아 SO에 대한 그것을 검색하는 것입니다

많은 참고 자료.

당신은 할당 된 메모리의 낮은 조각화 최적화하기 위해 조정 다른 malloc에 ​​옵션으로 할 수 있습니다 :

# tune glibc memory allocation, optimize for low fragmentation 
# limit the number of arenas 
# requires glibc >= 2.16 since there was a bug in 
# MALLOC_ARENA_TEST parameter handling that cause MALLOC_ARENA_MAX not to work 
export MALLOC_ARENA_MAX=2 
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt" 
export MALLOC_MMAP_THRESHOLD_=131072 
export MALLOC_TRIM_THRESHOLD_=131072 
export MALLOC_TOP_PAD_=131072 
export MALLOC_MMAP_MAX_=65536 

당신은 메모리 할당에 대한 정보를 얻을 수있는 기본 malloc_info 함수를 호출 할 수 있습니다. 다음은 using JNA to call the native malloc_info method의 예입니다.

+0

고마워 라리! 당신의 대답은 매우 설득력이 있습니다. 그러나 나는 더 이상 확인할 수있는 app과 solaris env가 없다. 6 년 전에 기원 문제가 제기되었다. :) 그러나 어쨌든 알려 주셔서 감사합니다. 질문은 잠시 동안 나를 위해 신비했다. – gengmao

관련 문제