2012-07-23 2 views
2

내가 가진 독립형 Java 응용 프로그램이 있습니다 더 많은 메모리를 독차지 시간의 과정을 통해문제 해결 무제한의 자바 상주 세트 크기 (RSS) 성장

-Xmx1024m -Xms1024m -XX:MaxPermSize=256m -XX:PermSize=256m 

를 교환 (그리고 느리게)하기 시작하고 결국 여러 번 죽었습니다 (OOM + 덤프가 아니라, 방금 죽었고,/var/log/messages에는 아무것도 없었습니다).

지금까지 시도했다 :

  1. 힙 덤프 : 라이브 객체가 1G 힙에서 200-300Mb을 - 힙> 확인
  2. 라이브 thread의
  3. 수는 오히려 일정 (~ 60 -70) -> 스레드 확인 (
  4. JMX 어떤 시점에서 응답을 중지 스택 MB가 대답하지만, 시간 제한이 낮은)
  5. 스왑 해제 - 더 빨리
  6. strace를 다이 - 모든 조금 느려 보인다, 앱이 아직 죽지 않았고 확실하지 않은 경우 어떤 일이 최고 확인이
  7. 보면 : VIRT은 (우리가 교환을 시작 분명히)
  8. 확인 vmstat를 3.7, 5.5Gb에 GB의 RSS 성장 :

    --------------------------procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ 
    Sun Jul 22 16:10:26 2012: r b swpd free buff cache si so bi bo in cs us sy id wa st 
    Sun Jul 22 16:48:41 2012: 0 0 138652 2502504 40360 706592 1 0 169 21 1047 206 20 1 74 4 0 
    . . . 
    Sun Jul 22 18:10:59 2012: 0 0 138648 24816 58600 1609212 0 0 124 669 913 24436 43 22 34 2 0 
    Sun Jul 22 19:10:22 2012: 33 1 138644 33304 4960 1107480 0 0 100 536 810 19536 44 22 23 10 0 
    Sun Jul 22 20:10:28 2012: 54 1 213916 26928 2864 578832 3 360 100 710 639 12702 43 16 30 11 0 
    Sun Jul 22 21:10:43 2012: 0 0 629256 26116 2992 467808 84 176 278 1320 1293 24243 50 19 29 3 0 
    Sun Jul 22 22:10:55 2012: 4 0 772168 29136 1240 165900 203 94 435 1188 1278 21851 48 16 33 2 0 
    Sun Jul 22 23:10:57 2012: 0 1 2429536 26280 1880 169816 6875 6471 7081 6878 2146 8447 18 37 1 45 0 
    
  9. 특별 행정구는 지속적으로 시스템 %의 성장을 보여줍니다 = 스와핑 :

    15:40:02   CPU  %user  %nice %system %iowait %steal  %idle 
    17:40:01   all  51.00  0.00  7.81  3.04  0.00  38.15 
    19:40:01   all  48.43  0.00  18.89  2.07  0.00  30.60 
    20:40:01   all  43.93  0.00  15.84  5.54  0.00  34.70 
    21:40:01   all  46.14  0.00  15.44  6.57  0.00  31.85 
    22:40:01   all  44.25  0.00  20.94  5.43  0.00  29.39 
    23:40:01   all  18.24  0.00  52.13  21.17  0.00  8.46 
    12:40:02   all  22.03  0.00  41.70  15.46  0.00  20.81 
    
  10. 확인 PMAP gaves 다음 가장 큰 참여자 :

    내가 strace를에 의해 버려진 물건에서 PMAP에서있어 주소의 상관 관계를 시도 744,655,783,210는
  11. 나를 더

  12. 는 전환 JVM의는 아니다 (단지 문제가 나중에 나타나게) 더 많은 메모리가 실용적이지 추가

  13. 일치주지 않았다 가능

(ENV는 우리의 통제하에 있지) 그리고 질문은 : 다른 내가 문제의 원인을 추적하거나 해결하려고 시도 할 수 있습니다?

+0

비슷한 질문 http://stackoverflow.com/questions/26041117/growing-resident-memory-usage- rss-of-java-process –

답변

1

문제는 프로파일 러 라이브러리에 첨부되었습니다 - CPU 호출/할당 사이트를 기록하므로이를 저장하는 데 필요한 메모리가 필요합니다.

그래서, 인간의 요소 여기가 :

1

JVM의 일부가 힙이 아닌 "제한되지 않은"메모리를 사용하고 있습니다. 가능한 후보자는 다음과 같습니다.

  • 스레드 스택.
  • 일부 원시 코드 라이브러리에 의해 할당 된 원시 힙.
  • 메모리 매핑 파일.

첫 번째 가능성은 스레드 스택 덤프를 가져갈 때 큰 (증가하는) 스레드 수로 표시됩니다. (그냥 확인 ... 확인?)

응용 프로그램 (또는 사용하는 일부 3 부 라이브러리)이 기본 라이브러리를 사용하지 않는 경우 두 번째로 제거 할 수 있습니다.

응용 프로그램 (또는 사용하는 제 3 부속 라이브러리)이 메모리 매핑 파일을 사용하지 않으면 제거 할 수있는 세 번째 방법입니다.


나는 당신이 오세요의가 표시되지 않는 이유는 당신의 JVM은 리눅스 OOM 킬러에 의해 살해되고 있다는 것을 생각합니다. JVM이 네이티브 코드 (예 : malloc 실패가 제대로 처리되지 않아서)로 해결 될 수도 있지만, JVM 크래시 덤프가 더 많은 결과로 나타날 것이라고 생각했을 것입니다 ...

1

자바와의 glibc> = 2.10 알려진 문제 (우분투> = 10.04, RHEL> = 6 포함)가있다.

치료법은 this env를 설정하는 것입니다. 변수는 : export MALLOC_ARENA_MAX=4

상주 메모리가 메모리 누수 또는 메모리 조각화 유사한 방식으로 크리프 알려져있다

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

This blog post says 설정에 대한 IBM 기사가있다.

Google에서 MALLOC_ARENA_MAX를 검색하거나 더 많은 참조를 위해

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

# tune glibc memory allocation, optimize for low fragmentation 
# limit the number of arenas 
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 
+0

JVM이 원시 메모리를 유출하여 유사한 증상을 일으킬 수 있습니다. 누수를 디버깅하려면 http://www.evanjones.ca/java-native-leak-bug.html을 참조하십시오. 버그의 예는 http://www.evanjones.ca/java-bytebuffer-leak.html 및 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8164293입니다. 닫히지 않은 GZIPInputStream 및 GZIPOutputStream 인스턴스도 누수의 원인 일 수 있습니다. –

+0

이 토론은 CloudFoundry에서 Java 프로세스 RSS 크기가 커지는 것에 대한 내용입니다. https://github.com/cloudfoundry/java-buildpack/issues/320#issuecomment-242350879 –

+0

"누수를 추적하려면 jemalloc을 사용하고 샘플링 프로파일을 켭니다 MALLOC_CONF 환경 변수를 사용합니다. " , http://www.evanjones.ca/java-native-leak-bug.html을 참조하십시오. –

관련 문제