VM argümanlarını Java uygulamasından nasıl alabilirim?


162

JVM geçirilebilir bazı seçenek açıkça ayarlanmış veya varsayılan değeri olup olmadığını kontrol etmek gerekir.

Daha spesifik olmak gerekirse: Varsayılan olandan daha yüksek yerel yığın boyutuna sahip belirli bir iş parçacığı oluşturmam gerekiyor, ancak kullanıcı -Xssvarsayılan yığın boyutuna sahip tüm iş parçacıklarını oluşturmak istediğim seçeneği belirterek kullanıcı tarafından bu tür şeylerle ilgilenmek istiyorsa (kullanıcı tarafından -Xss seçeneğinde belirtilir).

Ben gibi sınıflar kontrol ettim java.lang.Systemve java.lang.Runtimeancak bu bana VM argümanlar hakkında yararlı bilgi vermiyor.

İhtiyacım olan bilgiyi almanın bir yolu var mı?

Yanıtlar:


183

Bu kodla JVM argümanlarını alabilirsiniz:

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

Ne yazık ki komut satırında verilirse ana sınıfın Adını alamazsınız.
Daniel

@Daniel, bu ana sınıfın adını almalıdır: final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); final String mainClassName = stackTrace[stackTrace.length - 1].getClassName());
laz

3
Oracle'ın JVM'sinde çalışacağınız ve faydalı olabilecek bağımsız değişkenleri ayrıştırma kodunuz varsa.
laz

2
@Vulcan Bu VM argümanlarını almaz. Ana sınıf adını ve ana yöntemin args dizisini içerir.
dacongy

@dacongy VM argümanlarının sun.java.commandsistem özelliğinde bulunduğunu hiç ima etmedim ; Ben özelliği (@laz belirttiği gibi, söz konusu özellik sadece Oracle'ın JVM mevcut) bahsetmiyorum rağmen ana sınıf adı elde etmek için kullanılabilir dedi.
FThompson

207

Başlangıçta bunu geçin -Dname=value

ve sonra kodunuzda

value=System.getProperty("name");

bu değeri elde etmek için


4
-Xdebug
petertc

20
Bu cevabın neden bu kadar yükseltildiğinden emin değilsiniz, bu sadece VM parametrelerini değil (-X ile belirtilenleri) uygulama parametrelerini (-D ile belirtilir) alır. Soru özellikle -X parametreleriyle ilgilidir.
cleberz

5
Buraya geldim çünkü tip parametrelerinin -Dname=valueJVM argümanları olduğuna ve argümanlarda içsel bir fark olmadığına inandım -X. Aslında, her ikisi de java'ya iletilir ve komut satırındaki uygulamaya değil ve örnek olarak kanıt olarak maven'de her ikisini de aktarabilirsiniz -Drun.jvmArguments=.... İnanıyorum ki bu yüzden iptal edildi.
kap

Bu, orijinal posterlerin ihtiyaçlarına hiç cevap vermez.
dan.m kullanici2321368

4
Olabilir ! ancak "koddaki VM seçeneklerini nasıl okuyacağınızı" ararken üstlerde googles ve bu yüzden alakalı)
62mkv

4

HotSpot'un -client ve -server dışında yönetim çekirdeğindeki tüm VM argümanlarını listelediğini gördüm. Böylece, VM adından -client / -server bağımsız değişkenini çıkarırsanız ve bunu çalışma zamanı yönetimi çekirdeği listesine eklerseniz, bağımsız değişkenlerin tam listesini alırsınız.

İşte 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();
  }
}

A argümanlarını istiyorsanız daha kısa yapılabilir List<String>.

Son not: Komut satırı bağımsız değişkenleri içinde nadir boşluklar olması için bunu genişletmek isteyebiliriz.


Evet, yeni yaptı. Şerefe :)
Stefan Reich


0

Java işleminizin tüm komut satırını istiyorsanız şunları kullanabilirsiniz: JvmArguments.java (çoğu unix uygulamasını kapsayacak şekilde bir JNA + / proc birleşimi kullanır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.