2016-06-07 1 views
0

Linux CentOS 시스템에서 java 8 프로세스를 모니터링하고 사용중인 메모리 양을 수 있습니다. 나는 결국 나는 또한 사용되는 메모리의 양에 영향을주지 않습니다 보인다 java8에서 -Xmx 옵션에 당황하고실제 메모리 사용량을 확인하기 위해 Java 8 프로세스 모니터링

우리의 중앙 모니터링 시스템에 출력을 공급하기 위해 원하는대로 쉘 유틸리티를 사용하는 것을 선호

여기

다음
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
services 1409 0.0 10.8 4672536 872440 ?  Tl Jun03 3:53 /usr/java/lates 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
services 1574 0.0 11.4 4743036 925536 ?  Sl Jun03 3:13 /usr/java/lates 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
services 19839 0.7 10.9 4735664 881420 ?  Sl 09:43 0:15 /usr/java/lates 

일부 설정 FR은 자바 프로그램에 대한 ps 정보

for jvm in `sudo -u services jps|awk '/.jar/ {print $1}'`; do ps up $jvm;done 

출력을 얻을 수있는 스크립트입니다 톰 프로그램

sudo -u services jps -lvm 
1409 /usr/local/content-adapters/pmc-adapter/pmc-adapter.jar -Xmx1024m -Xms512m 
1574 /usr/local/content-adapters/tools-adapter/tools-adapter.jar -Xmx512m 
20685 sun.tools.jps.Jps -lvm -Dapplication.home=/usr/java/jdk1.8.0_65 -Xms8m 
19839 /usr/local/content-adapters/cas-adapter/cas-adapter.jar 

내가 그러면 jstat를 사용하는 경우, 내가 여러 숫자가 위의 어느 4.5GiB VSZ 번호를 추가 할 "사용"할 수 없습니다

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' 
    intx CompilerThreadStackSize     = 0         {pd product} 
    uintx ErgoHeapSizeLimit       = 0         {product} 
    uintx HeapSizePerGCThread      = 87241520       {product} 
    uintx InitialHeapSize       := 130023424       {product} 
    uintx LargePageHeapSizeThreshold    = 134217728       {product} 
    uintx MaxHeapSize        := 2063597568       {product} 
    intx ThreadStackSize       = 1024        {pd product} 
    intx VMThreadStackSize       = 1024        {pd product} 
java version "1.8.0_65" 
Java(TM) SE Runtime Environment (build 1.8.0_65-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode) 

서버 기본값에 대한 몇 가지 정보 또는 800-900MiB RSS

내 질문에 내가 관련이 어떻게

  1. 있는 -Xmx 및 기타 설정 사용 된 실제 메모리의 양은 얼마입니까?
  2. jstat를 사용하여 사용중인 메모리 양을 표시하는 방법은 무엇입니까?
  3. 아마도 VSZ와 RSS의 차이는 모든 Java 프로그램에서 사용하는 공유 리소스의 일부 때문일 수 있습니다. 이 측정 항목을 어떻게 예측하거나 찾을 수 있습니까?

답변

2

vm.overcommit_memory = 2을 설정하지 않으면 가상 메모리에 많은주의를 기울여서는 안됩니다. 예약되었지만 할당되지 않은 주소 공간 및 메모리 매핑 파일은 그 수를 의미하므로 java가 연속 영역을 사용할 수 있도록 미리 전체 힙을 예약하므로 메트릭은 거의 쓸모가 없습니다.

RSS는 일반적으로 더 재미 있고 페이징 없다고 가정하면 결과적으로 (-Xmx)

최대 힙 용량이 가정하면 최대 Java 힙보다 작을 수있는 현재 할당 된 자바 힙보다 약간 커야 발생 하지 사용되는 메모리 매핑 또는 직접 바이트 버퍼 할당의 소량 발생 및 페이징는 관계가이 같은 것입니다 발생하지 :

비 쓰레기 < 자바 힙이 < 자바 힙 < Java 힙 소유 < RSS를 할당 사용 개체 (Xmx) < VSZ

+0

예제에서 "tools-adapter.jar"의 RSS는 903MB이지만 Xmx는 512M입니다. 거의 두 배처럼, 우리가 실행중인 내용에 대해서는 무언가가 가정에 부합해야합니다. – Vorsprung

+0

매핑 된 파일을 찾기 위해'pmap'을 사용할 수 있고, 자바가 아닌 힙을 찾기 위해 [java NMT] (https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html)를 사용할 수 있습니다. 직접 바이트 버퍼를 찾기위한 JVM 및 힙 덤프네이티브 라이브러리도 범인이 될 수 있지만 추적하기는 어렵습니다. – the8472

+0

@ Vorsprung : 아마 당신의 주장이 실제로 효과가 없을까요? 'java -Xfoo -jar bar.jar'와'java -jar bar.jar -Xfoo' 사이의 의미상의 차이점에 유의하십시오. 불행히도,'-v' 옵션으로'jps'를 사용하면, 둘 다 똑같이 인쇄됩니다 ... – Holger

0

또한 Java는 메타 공간으로 메모리를 사용합니다. 또한 코드에 따라 Java는 바이트 버퍼, 직접 메모리에 추가 메모리를 사용할 수 있습니다.