왜 태양 JVM 를 소모하는 것을 계속 더 RSS 경우에도 메모리는 힙 등 크기는 안정되어 있는가?

StackOverflow https://stackoverflow.com/questions/1612939

문제

지난 한 해 동안 내가 거대한 향상을 만들어 내는 응용 프로그램의 Java 힙 사용-고체 66%감소입니다.의 추구에서는,모니터링은 다양한 통계,Java 와 같은 힙 사이즈,cpu,Java 비 힙,etc.을 통해 SNMP.

최근에,나는 모니터링을 얼마나 많은 실시 메모리(RSS,주민 설정)JVM 고 다소 놀랐습니다.실제 사용하는 메모리 JVM 보이 완전히 독립적인 내용 힙 크기,비 힙 공간 에덴,thread count,etc.

힙 크기로 측정된 자바 SNMP Java 힙 사용되는 그래프 http://lanai.dietpizza.ch/images/jvm-heap-used.png

실시 메모리에서 KB 입니다.(E.g.:1MB KB=1GB) Java 힙 사용되는 그래프 http://lanai.dietpizza.ch/images/jvm-rss.png

(세 딥에 힙 그래프에 해당하는 응용 프로그램 업데이트/가 다시 시작됩니다.)

이 문제는 나를 위해 때문에 모든 것을 추가 메모리 JVM 은 소비하는'을 훔치는'메모리에 의해 사용 될 수 있는 OS 가 파일을 캐시합니다.에 사실은,일단 RSS 값에 도달~2.5-3GB 을 확인하는 응답 시간이 느려집하고 더 높은 CPU 사용률을 내 응용 프로그램에서 주로 수행하 IO 기다립니다.일부로 포인트 페이징 스왑 파티션이 있습니다.이 모든 것이 매우 바람직하지 않습니다.

그래서 제 질문:

  • 왜 이런 일이 무엇입니까?에 무슨 일이 일 "후드"?
  • 나는 무엇을 할 수 있을 유지하는 JVM 에서의 실제에서 메모리 사용량을 확인합니까?

의 처참한 상세정보:

  • RHEL4 64 비트(Linux2.6.9-78.0.5.ELsmp#1SMP Wed24Sep...2008x86_64...GNU/Linux)
  • Java6(빌 1.6.0_07-b06)
  • Tomcat6
  • 응용 프로그램(on-demand HTTP 비디오 스트리밍)
    • 높은 I/O via java.nio FileChannels
    • 수백을 낮은 수천 개의 스레드
    • 저렴한 데이터베이스 사용
    • 봄,최대 절전 모드

관련 JVM 매개변수:

-Xms128m  
-Xmx640m  
-XX:+UseConcMarkSweepGC  
-XX:+AlwaysActAsServerClassMachine  
-XX:+CMSIncrementalMode    

-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps  
-XX:+PrintGCApplicationStoppedTime  
-XX:+CMSLoopWarn  
-XX:+HeapDumpOnOutOfMemoryError 

어떻게 측정 RSS:

ps x -o command,rss | grep java | grep latest | cut -b 17-

이것은 텍스트 파일로 읽어는 파일을 읽은 데이터베이스 내 모니터링 시스템에서 정기적인 간격으로.Note ps 출력 킬로 바이트입니다.


문제&솔루션s:

는 동안에 말 ATorras의 응답을 입증하는 궁극적으로 올바른지 kdgregory 누가 나를 안내하는 올바른 진단 경로의 사용과 pmap.(투표까지 모두 그들의 답변!) 여기에 무슨 일이 일어나고 있었:

것 나는 확실히 알:

  1. 내용을 기록하고 표시합과 함께 데이터 JRobin1.4, 뭔가 코드로 내 응용 프로그램을 통해 세 년 전입니다.
  2. 가장 바쁜 응용 프로그램의 인스턴스를 만들고 현재
    1. 1000 몇 가지 새로운 JRobin 데이터베이스 파일(대략 1.3MB 각)시간 이내에 시작
    2. ~100+각 후 하루를 시작-up
  3. 응용 프로그램 업데이 이러한 JRobin 데이터베이스 객체를 한번의 모든 15s,무언가가 있다면을 작성합니다.
  4. 기본 구성에서 JRobin:
    1. java.nio기반 파일 액세스를니다.이 back-end 지도 MappedByteBuffers 하는 파일 자체.
    2. 에 한 번씩 다섯 분 JRobin 데몬 스레드 전화 MappedByteBuffer.force() 모든 JRobin 기본 데이터베이스의 MBB
  5. pmap 나열된:
    1. 6500 매핑
    2. 5500 는 1.3MB JRobin 데이터베이스 파일을 밖으로 작동합~7.1GB

마지막 포인트 내 "유레카!" 순간입니다.

나의 해결 조치를 취합니다.

  1. 업데이트를 고려하고 최신 JRobinLite1.5.2 는 분명히 더 나은
  2. 를 구현하는 적절한 자원 처리에 JRobin 데이터베이스가 있습니다.순간에 한번 내 응용 프로그램의 데이터베이스를 만들고 그 결코 덤프를 그 후 데이터베이스가 더 이상이 적극적으로 사용됩니다.
  3. 실험으로 이동 MappedByteBuffer.force() 데이터베이스로 업데이트 및 이벤트지 않는 정기적인 타이머입니다.니다 문제는 마술이 있나요?
  4. 즉시, 변경 JRobin back-end java.io 구현--라인 라인을 변경합니다.이 느리게 될 것입니다,하지만 그것은 아마도 문제가 되지 않습니다.여기에는 것은 나타낸 그래프이 즉각적인 영향이 변경됩니다.

Java RSS 메모리 사용되는 그래프 http://lanai.dietpizza.ch/images/stackoverflow-rss-problem-fixed.png

는 질문을 내지 않을 수도 있 수도 있습니다:

  • 에서 무슨 일이 일어나 JVM 과 MappedByteBuffer.force()?아무 것도 변경되지 않으면,그것은 여전히 쓰는 전체 파일입니까?파트의 파일입니까?그것은 먼저 로드?
  • 특정 금액의 MBB 에 항상 RSS 에서 모든 배?RSS(대략 절반에 할당된 총 MBB 크기입니다.우?내가 의심하지 않습니다.)
  • 는 경우 이동 MappedByteBuffer.force() 데이터베이스로 업데이트 및 이벤트지 않을 주기 타이머,니다 문제는 마술이 있나요?
  • 왜 RSS 경사도록 정기적인?그것은 연관되지 않고 모든 프로그램의 로드시킵니다.
도움이 되었습니까?

해결책

그냥 아이디:NIO 버퍼는 외부로 배치 JVM.

편집: 당 2016 고려 가치가 그@Lari Hotari 댓글[ 왜 태양 JVM 를 소모하는 것을 계속 더 RSS 경우에도 메모리는 힙 등 크기는 안정되어 있는가? ]기 때문에 다시 2009,RHEL4 했 glibc < 2.10(~2.3)

니다.

다른 팁

RSS 을 나타내는 페이지에 적극적으로 사용하여--예 Java,그것은 주로 살고 객체를 힙에서 내부터 데이터 구조에서 JVM.많지 않는 것을 감소시키기 위하여 당신이 할 수 있는 크기를 제외하고 사용하여 적은 수의 개체를 또는 보다 적게 처리합니다.

귀하의 경우에,나는 생각하지 않는 문제입니다.그래프 표시가 나타납 3 멕 소비,3 공연으로 당신에 쓰기 텍스트입니다.는 정말 작은,가능성이 일으키는 원인이 될이징이다.

그래서 다른 무엇이에서 일어나는 시스템입니까?그것은 상황이 많이 있는 Tomcat 서버,각 소비 3M RSS?당신이 던지기에서 많은 GC 플래그,그들을 나타내는 과정은 지출의 대부분의 시간에서 GC?당신은 데이터베이스에서 실행되는 동일한 기?

편집에 응하여 의견

에 관한 3M RSS 크기 같아요 그래서 그들은 그것을 듯 너무 낮에 대한 톰캣 프로세스(내가 제자가 하나에 89M 되지 않은 잠시 동안 비활성 상태).그러나 나는 하지 않기를 기대야>힙 크기,그리고 나는 확실히 기대하지 않는것은 거의 5 시간 힙 크기(사용할-Xmx640)-그것은 나쁜에 있는 힙 크기+일부 응용 프로그램별 일정하다.

는 원인이 되는 날을 의심하시기 바랍니다.그래서 보다 시간이 지남에 따라 그래프,실행하십시오 얻기 위해 다음과 같은 스냅샷(대체 7429 에 의한 모든 프로세스 ID 당신이 사용하는):

ps -p 7429 -o pcpu,cutime,cstime,cmin_flt,cmaj_flt,rss,size,vsize

(편집하여 스튜를 할 수 있도록 우리는 형식의 결과는 위 요청을 ps 정보:)

[stu@server ~]$ ps -p 12720 -o pcpu,cutime,cstime,cmin_flt,cmaj_flt,rss,size,vsize
%CPU - - - -  RSS SZ  VSZ
28.8 - - - - 3262316 1333832 8725584

편집을 설명한 후손을 위해 이러한 숫자

RSS 으로,주가 주민 설정 크기:이 페이지에서는 물리 메모리입니다.SZ 을 보유하고 수의 페이지를 쓰기 가능한 프로세스에서(커밋 담당);는 ncursesw 에는 와이드에 대해 설명합 이 값으로"매우 거친".VSZ 을 보유하고 크기의 가상 메모리 맵을 위한 프로세스:쓰기 가능한 페이지는 플러스 공유 페이지입니다.

일반적으로,VSZ 은 약간>SZ,매>RSS.이 출력을 나타내는 아주 특별한 상황이다.

정교한 이유에 대한 유일한 솔루션을 감소시키는 개체

RSS 의 수를 나타내는 페이지를 RAM 에--페이지는 적극적으로 액세스합니다.Java,쓰레기 수집가는 것을 주기적으로 전체 그래프입니다.이 경우 개체 그래프의 대부분을 차지 힙 공간,다음은 모든 페이지에 힙 요구하는 사람들의 모든 페이지를 되는 메모리 주민입니다.GC 은 매우 좋은에 대한 압축 힙 후 각각의 주요 컬렉션,그래서 당신은 실행 중인 부분 힙 있는 대부분의 페이지를하지 않아야 될 필요에서 RAM.

다른 옵션

나는 당신이 언급한 수백을 낮은 수천 개의 스레드입니다.스택을 위한 이러한 스레드 또한 추가 할 수 RSS 지만,그것은 없다.다고 가정하면 쓰레드가 얕은 전화를 깊이(에 대한 일반적인 응용 프로그램-서버 핸들러 스레드),각어야만 소비하는 페이지 또는 두 개의 물리 메모리에도 불구하고,반 멕 commit 충전됩니다.

왜 이런 일이 무엇입니까?무슨"후드"?

JVM 을 사용하여 더 많은 메모리보다 그냥합니다.예를 들어 Java 방법,및 네이티브 스레드 스택을 처리 할당되는 메모리에서 별도의 힙에서뿐만 아니라,JVM 내부터 데이터 구조입니다.

귀하의 경우에는,가능한 한 원인의 문제를 수 있습니다:모(이미 언급했),JNI(이미 언급했),과도한 스레드 생성.

에 대한 JNI,당신을 썼다는 것을 응용 프로그램를 사용하지 않 JNI 하지만...어떤 유형의 JDBC 드라이버를 사용하고 있습니까?가 될 수 있는 유형 2,새?그것은 매우 어렵지만 당신이 말한 대로 데이터베이스의 사용량이 낮았다.

에 대한 과도한 스레드의 생성,각각의 스레드 스택을 제공하는 매우 커질 수 있습니다.스택 크기에 따라서 VM OS 과 건축의 예:대 JRockit 그것은 256K 리눅스에서 x64,지 않았을 찾아에서 참조하는 태양의 문서에 대한 태양의 VM.이 영향은 직접 스레드 메모리(스레드 메모리=스레드 스택 크기*스레드 수).과를 만드는 경우와 많이 파괴의 스레드,메모리는 아마도 다시 사용되지 않습니다.

나는 무엇을 할 수 있을 유지하는 JVM 에서의 실제에서 메모리 사용량을 확인합니까?

솔직히 말해서,수백을 낮은 수천 개의 스레드가 보인다 거대한다.는 말했다,당신이 정말로 필요한 경우에는 많은 스레드,스레드 스택 크기를 할 수 있습을 통해 구성 -Xss 옵션입니다.이를 줄일 수 있는 메모리 소비가 있습니다.그러나 나는 생각하지 않는 이를 해결하는 것이 문제이다.내가 생각하는 경향이 있는 누출이 어딘가에 때 나는 모습에 실시 메모리를 그래프입니다.

현재 쓰레기 수집에서 Java 은에 대한 잘 알려진 방출되는 메모리를 할당되지만,메모리가 더 이상 필요하지 않다.그것의 아주 이상한 그러나,그 RSS 크기가 증가하기>3GB 지만 당신의 힙 크기 제한 640MB.당신은 당신을 사용하여 어떤 기본 코드에서는 응용 프로그램 또는 당신은 기본 성능을 최적화 팩 Tomcat 를 사용할 수 있습니까?는 경우에는,당신은 물론 네이티브 메모리 누수에 코드 또는 Tomcat.

Java6u14,태양이 도입되는 새로운"쓰레기 처음"쓰레기 수집가,할 수 있는 메모리를 해제시하는 경우 운영 체제 그가 더 이상 필요하지 않다.그것은 아직도로 분류된 실험적이고 기본적으로 사용되지 않습니다,그러나 만약 그것이 가능한 옵션은 강화되거나 주사 맞거나 그저 자연 것입 업그레이드하려고 최신 Java6 릴리스도록 새로운 쓰레기 수집가와 명령줄 인수"-XX:+UnlockExperimentalVMOptions-XX:+UseG1GC".그것은 문제가 해결될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top