[java] Java 응용 프로그램 내부에서 VM 인수를 얻는 방법은 무엇입니까?

JVM에 전달할 수있는 옵션이 명시 적으로 설정되어 있는지 또는 기본값이 있는지 확인해야합니다.

더 구체적으로 말하면 : 기본 스레드보다 기본 스택 크기가 더 높은 하나의 특정 스레드를 만들어야하지만 사용자가 -Xss옵션 을 지정하여 직접 처리 하려는 경우 기본 스택 크기의 모든 스레드를 만들고 싶습니다. (-Xss 옵션에서 사용자가 지정 함).

java.lang.Systemand과 같은 클래스를 확인 java.lang.Runtime했지만 VM 인수에 대한 유용한 정보를 제공하지 않습니다.

필요한 정보를 얻을 수있는 방법이 있습니까?



답변

이 코드를 사용하면 JVM 인수를 얻을 수 있습니다.

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();


답변

시작시 이것을 통과 -Dname=value

그런 다음 코드에서 사용해야합니다

value=System.getProperty("name");

그 가치를 얻기 위해


답변

HotSpot은 -client 및 -server를 제외한 관리 Bean의 모든 VM 인수를 나열합니다. 따라서 VM 이름에서 -client / -server 인수를 유추하여이를 런타임 관리 Bean의 목록에 추가하면 전체 인수 목록이 표시됩니다.

SSCCE는 다음과 같습니다.

import java.util.*;
import java.lang.management.ManagementFactory;

class main {
  public static void main(final String[] args) {
    System.out.println(fullVMArguments());
  }

  static String fullVMArguments() {
    String name = javaVmName();
    return (contains(name, "Server") ? "-server "
      : contains(name, "Client") ? "-client " : "")
      + joinWithSpace(vmArguments());
  }

  static List<String> vmArguments() {
    return ManagementFactory.getRuntimeMXBean().getInputArguments();
  }

  static boolean contains(String s, String b) {
    return s != null && s.indexOf(b) >= 0;
  }

  static String javaVmName() {
    return System.getProperty("java.vm.name");
  }

  static String joinWithSpace(Collection<String> c) {
    return join(" ", c);
  }

  public static String join(String glue, Iterable<String> strings) {
    if (strings == null) return "";
    StringBuilder buf = new StringBuilder();
    Iterator<String> i = strings.iterator();
    if (i.hasNext()) {
      buf.append(i.next());
      while (i.hasNext())
        buf.append(glue).append(i.next());
    }
    return buf.toString();
  }
}

의 인수를 원하면 더 짧아 질 수 있습니다 List<String>.

마지막 참고 사항 : 명령 줄 인수 내에 공백이있는 드문 경우를 처리하기 위해이를 확장 할 수도 있습니다.


답변

특별히 VM 설정을 얻으려고 시도하지는 않았지만 JMX 유틸리티, 특히 MXBean 유틸리티에 대한 많은 정보가 있습니다. 이것은 내가 시작할 곳입니다. 바라건대 당신을 도울 무언가를 찾으십시오.

썬 웹 사이트에는이 기술이 많이 있습니다 :

http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html


답변

Java 프로세스의 전체 명령 행을 원하는 경우 다음을 사용할 수 있습니다. JvmArguments.java
(JNA + / proc의 조합을 사용하여 대부분의 유닉스 구현을 포괄)


답변