2009-12-10 3 views
17

저는 많은 튜빙과 실험이 필요한 GC 튜닝 (prior question 참조) 문제를 계속 조사하고 있습니다.실행중인 JVM은 어떤 GC 매개 변수입니까?

Sun Java ™ 5 + JVM은 환경에 따라 최적의 GC 전략과 매개 변수를 자동으로 선택하려고 시도하지만 이는 실행중인 JVM에 쿼리하여 이러한 매개 변수가 무엇인지 알아낼 수 없습니다.

이상적으로, VM에 의해 자동으로 선택된 다양한 GC 관련 -XX 옵션의 값이 사용되고 있는지 알고 싶습니다. 내가 그랬다면, 나는 조정을 시작하기위한 기준선을 가질 수 있었다.

실행중인 VM에서이 값을 복구하는 사람은 누구입니까?

답변

18

체크 아웃 다음 예제에서는 옵션의 값을 출력 할 HotSpotDiagnosticMBean

을뿐만 아니라 :

당신은 SO 대답 서로 참조 할 수 프로그래밍 방식으로이 작업을 수행하려면 VM_CREATION는 :

당신이 빠르고 쉽게 사람이 읽을 수있는 도구를 찾고 있다면
import java.lang.management.ManagementFactory; 

import javax.management.ObjectName; 
import javax.management.openmbean.CompositeData; 
import javax.management.openmbean.CompositeDataSupport; 

public class HotSpotTest { 

    public static void main(String [] args) throws Exception { 
     printHotSpotOption("MaxHeapFreeRatio"); 
     printHotSpotOption("SurvivorRatio"); 
     printHotSpotOptions(); 
    } 

    private static void printHotSpotOption(String option) throws Exception { 
     ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic"); 
     String operationName = "getVMOption"; 
     Object [] params = new Object [] {option}; 
     String [] signature = new String[] {String.class.getName()}; 
     Object result = ManagementFactory.getPlatformMBeanServer().invoke(name, operationName, params, signature); 
     CompositeDataSupport data = (CompositeDataSupport) result; 

     System.out.println(option); 
     System.out.println("- Value: "+data.get("value")); 
     System.out.println("- Origin: "+data.get("origin")); 
    } 

    private static void printHotSpotOptions() throws Exception { 
     ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic"); 
     String attributeName = "DiagnosticOptions"; 
     Object result = ManagementFactory.getPlatformMBeanServer().getAttribute(name, attributeName); 
     CompositeData [] array = (CompositeData[]) result; 
     for (CompositeData d : array) { 
      System.out.println(d.get("name")); 
      System.out.println("- Value: "+d.get("value")); 
      System.out.println("- Origin: "+d.get("origin")); 
     } 
    } 
} 
+0

+1 흥미 롭습니다. 전에는 그것을 보지 못했습니다. 나는 놀이를 할 것이고, 그것이 충분히 자세히 설명되어 있는지 살펴볼 것이다. – skaffman

+0

이것은 내가 필요한 VMOptions를 알아야한다는 점을 제외하면 필자가 필요로하는 것에 매우 가깝습니다. 사용할 수있는 것이 무엇인지 말할 수없는 것은 정말 유감입니다. – skaffman

+0

사용 가능한 진단 옵션을 인쇄하도록 예제를 수정했습니다. 그러나 사용 가능한 모든 VM 옵션이 인쇄되지는 않습니다. 모든 VM 옵션이 여기에 나열됩니다. 원하는 VM 목록을 만들고 쿼리 할 수 ​​있습니다. http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp – Kevin

0

JMX를 사용할 수 있습니다. JConsole을 시작하면 VM 요약 탭 아래에 표시되어야합니다. JVM에 전달 된 모든 인수를 표시해야합니다. 값이 DEFAULT가 여부를 How to get vm arguments from inside of java application?

+0

감사합니다.하지만 VM을 실행 한 스크립트가 있기 때문에 VM에 전달한 인수를 알고 있습니다. 내가 지정하지 않은 매개 변수에 대해 VM이 기본값으로 설정 한 값을 알고 싶습니다. – skaffman

0

, jconsole 여기 당신의 친구가 될 수 있습니다. 특히, 나는 나의 현재 실행중인 FindBugs 과정에서 "VM 요약"탭을 찾고 있어요 나는 이러한 세부 사항을 참조하십시오

현재 힙 크기 : 788,720 킬로바이트

최대 힙 크기 : 932,096 킬로바이트

커밋 된 메모리 : 923,648 킬로바이트

대기 종결 : 0 개체

가비지 컬렉터 이름 = 'PS MarkSweep'컬렉션 = 324, 합계 = 시간이 소비 12분

가비지 컬렉터 : jvisualvm 당신에게 관련 정보를 제공하지만 아주로 될 것 같지 않습니다 이름 = 'PS 폐품', 컬렉션 = 1132, 총 시간은, 분명히 분

= 1 달러 (예 : 가비지 수집기에서 빠르게 읽을 수있는 세부 정보).

7

이상적으로, VM에 의해 자동으로 선택된 다양한 GC 관련 -XX 옵션의 값이 무엇인지보고 싶습니다. 내가 그랬다면, 나는 조정을 시작하기위한 기준선을 가질 수 있었다.

제공된 명령 줄 플래그만으로 정확한 힙 구성을 추론하는 것은 일반적으로 쉽지 않습니다.

힙 구성이 필요하고 비 Windows 환경에있는 경우이 blog entry에서 설명한 것처럼 jmap -heap을 사용할 수 있습니다.

 
    using parallel threads in the new generation. 
    using thread-local object allocation. 
    Concurrent Mark-Sweep GC 

    Heap Configuration: 
     MinHeapFreeRatio = 40 
     MaxHeapFreeRatio = 70 
     MaxHeapSize  = 1073741824 (1024.0MB) 
     NewSize   = 268435456 (256.0MB) 
     MaxNewSize  = 268435456 (256.0MB) 
     OldSize   = 805306368 (768.0MB) 
     NewRatio   = 7 
     SurvivorRatio = 6 
     PermSize   = 21757952 (20.75MB) 
     MaxPermSize  = 88080384 (84.0MB) 
27

-XX : + PrintCommandLineFlags 인쇄 플래그 인체 공학적으로 명령 라인에 전달하거나 구성 (자동 크기) 기능 여기

는 제공된 정보의 예이다.

-XX : + PrintFlagsInitial 모든 기본 플래그와 값을 덤프합니다.

-XX : + PrintFlagsFinal 명령 줄 및 인간 공학을 처리 한 후 모든 플래그를 덤프합니다.

그래서 나는 후자가 당신을 위해 할 것이라고 생각합니다. 그냥 명령 줄 스크립트에 추가하십시오.

관련 문제