जावा एप्लिकेशन के अंदर से वीएम तर्क कैसे प्राप्त करें?


162

मुझे यह जांचने की आवश्यकता है कि क्या जेवीएम को पास किया जा सकता है या नहीं, इसका कोई विकल्प स्पष्ट रूप से निर्धारित है या इसका डिफ़ॉल्ट मूल्य है।

अधिक विशिष्ट होने के लिए: मुझे डिफ़ॉल्ट की तुलना में उच्च देशी स्टैक आकार के साथ एक विशिष्ट थ्रेड बनाने की आवश्यकता है, लेकिन उपयोगकर्ता जिस -Xssविकल्प को निर्दिष्ट करके मैं डिफ़ॉल्ट स्टैक आकार के साथ सभी थ्रेड्स बनाना चाहते हैं, उनके द्वारा ऐसी चीज़ों की देखभाल स्वयं करना चाहता है। (जो उपयोगकर्ता द्वारा -Xss विकल्प में निर्दिष्ट किया जाएगा)।

मैंने कक्षाओं की तरह जाँच की है java.lang.Systemऔर java.lang.Runtime, लेकिन ये मुझे VM तर्कों के बारे में कोई उपयोगी जानकारी नहीं दे रहे हैं।

क्या मेरे पास आवश्यक जानकारी प्राप्त करने का कोई तरीका है?

जवाबों:


183

इस कोड से आप JVM तर्क प्राप्त कर सकते हैं:

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

अफसोस की बात है कि यदि आप कमांड लाइन पर दिए गए हैं तो आपको मुख्य वर्ग का नाम नहीं मिल सकता है।
डैनियल

@ डैनियल, यह आपको मुख्य वर्ग का नाम मिलना चाहिए: final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); final String mainClassName = stackTrace[stackTrace.length - 1].getClassName());
laz

3
यदि आपको ओरेकल के जेवीएम पर चलने की गारंटी दी गई है और उन तर्कों को पार्स करने के लिए कोड है जो उपयोगी हो सकते हैं।
laz

2
@Vulcan जिसे VM तर्क नहीं मिलते हैं। इसमें मुख्य वर्ग का नाम है, और मुख्य विधि के लिए आर्ग्स सरणी है।
डकॉन्गी

@ डॅकॉन्गी ने कभी यह नहीं कहा कि वीएम के तर्क sun.java.commandसिस्टम प्रॉपर्टी में स्थित हैं; मैंने कहा कि संपत्ति का उपयोग मुख्य वर्ग नाम प्राप्त करने के लिए किया जा सकता है (हालांकि मैंने उल्लेख नहीं किया था, जैसा कि @ लाज़ ने बताया, वह संपत्ति केवल ओरेकल के जेवीएम पर मौजूद है)।
FThompson

206

स्टार्टअप में यह पास -Dname=value

और फिर अपने कोड में आपको उपयोग करना चाहिए

value=System.getProperty("name");

उस मूल्य को पाने के लिए


4
मैं इसे पाने के लिए इस्तेमाल नहीं कर सकता -debug
petertc

20
यह सुनिश्चित नहीं है कि इस उत्तर को क्यों उतारा गया है, यह केवल अनुप्रयोग मापदंडों (निर्दिष्ट -D के साथ) को पुनः प्राप्त करता है, VM पैरामीटर (-X के साथ निर्दिष्ट) को नहीं। सवाल विशेष रूप से -X परम के बारे में है।
क्लेबरज

4
मैं यहाँ इसलिए आया क्योंकि मुझे विश्वास था कि प्रकार के पैरामीटर -Dname=valueJVM तर्क हैं और तर्क में कोई अंतर नहीं -Xहै। वास्तव में, वे दोनों जावा और कमांड लाइन पर आवेदन नहीं करते हैं और उदाहरण के लिए सबूत के रूप में, मावेन में आप दोनों को पास कर सकते हैं -Drun.jvmArguments=...। मेरा मानना ​​है कि इसीलिए इसे उखाड़ा जाता है।
kap

यह मूल पोस्टर की जरूरत का जवाब बिल्कुल नहीं है।
dan.m

4
हो सकता है ! लेकिन यह "कोड में वीएम विकल्प कैसे पढ़ें" के लिए खोज करते समय सबसे ऊपर जाता है और यही कारण है कि यह प्रासंगिक है)
62mkv

4

मैंने पाया कि हॉटस्पॉट, प्रबंधन-सेम में सभी वीएम तर्कों को -client और -server को छोड़कर सूचीबद्ध करता है। इस प्रकार, यदि आप VM नाम से -client / -server तर्क का अनुमान लगाते हैं और इसे रनटाइम मैनेजमेंट बीन की सूची में जोड़ते हैं, तो आपको तर्कों की पूरी सूची मिल जाती है।

यहाँ 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>

अंतिम नोट: हम कमांड लाइन के तर्कों के भीतर रिक्त स्थान होने के दुर्लभ मामले को संभालने के लिए इसका विस्तार करना चाहते हैं।


हाँ, बस किया। चीयर्स :)
स्टीफन रीच

2

मैंने विशेष रूप से वीएम सेटिंग्स प्राप्त करने की कोशिश नहीं की है, लेकिन जेएमएक्स उपयोगिताओं में विशेष रूप से एमएक्सबीएन उपयोगिताओं में जानकारी का खजाना है। यह वह जगह होगी जहां मैं शुरू करूंगा। उम्मीद है कि आपकी मदद के लिए आपको वहां कुछ मिलेगा।

सूर्य वेबसाइट का प्रौद्योगिकी पर एक गुच्छा है:

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


0

यदि आप अपनी जावा प्रक्रिया की पूरी कमांड लाइन चाहते हैं, तो आप उपयोग कर सकते हैं: JvmArguments.java (सबसे यूनिक्स कार्यान्वयन को कवर करने के लिए JNA + / proc के संयोजन का उपयोग करता है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.