Umfang der Java-Systemeigenschaften

Lesezeit: 5 Minuten

Umfang der Java Systemeigenschaften
Chathuranga Chandrasekara

In Java verwenden wir die Methode System.setProperty(), um einige Systemeigenschaften festzulegen. Gemäß Dieser Beitrag die Verwendung von Systemeigenschaften ist etwas knifflig.

System.setProperty() kann ein böser Aufruf sein.

  • Es ist 100% Fadenfeindlich
  • Es enthält superglobale Variablen
  • Es ist extrem schwierig zu debuggen, wenn sich diese Variablen zur Laufzeit auf mysteriöse Weise ändern.

Meine Fragen sind wie folgt.

  1. Wie sieht es mit dem Umfang der Systemeigenschaften aus? Sind sie spezifisch für jede einzelne virtuelle Maschine oder haben sie eine “superglobale Natur”, die dieselben Eigenschaften für jede einzelne Instanz einer virtuellen Maschine aufweist? Ich denke, die Option 1

  2. Gibt es Tools, mit denen die Laufzeitänderungen überwacht werden können, um die Änderungen in den Systemeigenschaften zu erkennen. (Nur für die einfache Problemerkennung)

Umfang der Java Systemeigenschaften
Gurken

Umfang der Systemeigenschaften

Zumindest aus dem Lesen der API-Spezifikationen für die System.setProperties -Methode konnte ich keine Antwort erhalten, ob die Systemeigenschaften von allen Instanzen der JVM gemeinsam genutzt werden oder nicht.

Um das herauszufinden, habe ich zwei Schnellprogramme geschrieben, die die Systemeigenschaft über . setzen System.setProperty, mit dem gleichen Schlüssel, aber unterschiedlichen Werten:

class T1 {
  public static void main(String[] s) {
    System.setProperty("dummy.property", "42");

    // Keep printing value of "dummy.property" forever.
    while (true) {
      System.out.println(System.getProperty("dummy.property"));
      try {
        Thread.sleep(500);
      } catch (Exception e) {}
    }
  }
}

class T2 {
  public static void main(String[] s) {
    System.setProperty("dummy.property", "52");

    // Keep printing value of "dummy.property" forever.
    while (true) {
      System.out.println(System.getProperty("dummy.property"));
      try {
        Thread.sleep(500);
      } catch (Exception e) {}
    }
  }
}

(Beachten Sie, dass das Ausführen der beiden oben genannten Programme dazu führt, dass sie in eine Endlosschleife geraten!)

Es stellt sich heraus, dass beim Ausführen der beiden Programme mit zwei separaten java -Prozesse hat der Wert für die Eigenschaft, die in einem JVM-Prozess festgelegt wurde, keinen Einfluss auf den Wert des anderen JVM-Prozesses.

Ich sollte hinzufügen, dass dies die Ergebnisse für die Verwendung von Suns JRE 1.6.0_12 sind und dieses Verhalten zumindest in den API-Spezifikationen nicht definiert ist (oder ich es nicht gefunden habe), das Verhalten kann variieren.

Gibt es Tools zur Überwachung von Laufzeitänderungen?

Meines Wissens nicht. Wenn Sie jedoch überprüfen müssen, ob Änderungen an den Systemeigenschaften vorgenommen wurden, können Sie eine Kopie der Properties auf einmal und vergleichen Sie es mit einem anderen Aufruf an System.getProperties — schließlich, Properties ist eine Unterklasse von Hashtable, so dass der Vergleich auf ähnliche Weise durchgeführt würde.

Im Folgenden finden Sie ein Programm, das zeigt, wie Sie überprüfen können, ob Änderungen an den Systemeigenschaften vorgenommen wurden. Wahrscheinlich keine elegante Methode, aber sie scheint ihren Zweck zu erfüllen:

import java.util.*;

class CheckChanges {

  private static boolean isDifferent(Properties p1, Properties p2) {
    Set<Map.Entry<Object, Object>> p1EntrySet = p1.entrySet();
    Set<Map.Entry<Object, Object>> p2EntrySet = p2.entrySet();

    // Check that the key/value pairs are the same in the entry sets
    // obtained from the two Properties.
    // If there is an difference, return true.
    for (Map.Entry<Object, Object> e : p1EntrySet) {
      if (!p2EntrySet.contains(e))
        return true;
    }
    for (Map.Entry<Object, Object> e : p2EntrySet) {
      if (!p1EntrySet.contains(e))
        return true;
    }

    return false;
  }

  public static void main(String[] s)
  {
    // System properties prior to modification.
    Properties p = (Properties)System.getProperties().clone();
    // Modification of system properties.
    System.setProperty("dummy.property", "42");
    // See if there was modification. The output is "false"
    System.out.println(isDifferent(p, System.getProperties()));
  }
}

Eigenschaften ist nicht threadsicher?

Hashtable ist threadsicher, also habe ich damit gerechnet Properties wären es auch, und zwar die API-Spezifikationen für die Properties Klasse bestätigt es:

Diese Klasse ist Thread-sicher: Mehrere Threads können sich einen einzigen teilen Properties
Objekt ohne die Notwendigkeit einer externen Synchronisation., Serialisiertes Formular

1641736491 433 Umfang der Java Systemeigenschaften
Max Nanasy

Systemeigenschaften gelten pro Prozess. Dies bedeutet, dass sie globaler sind als statische Felder, die pro Klassenlader gelten. Wenn Sie beispielsweise eine einzelne Instanz von Tomcat haben, auf der mehrere Java-Webanwendungen ausgeführt werden, von denen jede eine Klasse hat com.example.Example mit einem statischen Feld namens globalField, dann teilen sich die Webapps die Systemeigenschaften, aber com.example.Example.globalField kann in jeder Webapp auf einen anderen Wert gesetzt werden.

  • @Dejel Sie sind nicht Thread-lokal. Alle Threads innerhalb desselben JVM-Prozesses haben einen gemeinsamen Satz von Systemeigenschaftswerten.

    – Max Nanasy

    31. Dezember ’14 um 18:15

Ja, “Systemeigenschaften” gelten pro VM (obwohl es eine Reihe von “magischen” Eigenschaften gibt, die Informationen über das Hostsystem enthalten, zB: “os.name”, “os.arch” usw.).

Zu Ihrer zweiten Frage: Mir ist ein solches Tool nicht bekannt, aber wenn Sie Bedenken haben, dass sich die Systemeigenschaften ändern, können Sie ein spezielles verwenden Sicherheitsmanager um Änderungen der Systemeigenschaften zu verhindern (und vielleicht sogar zu verfolgen).

Umfang der Java Systemeigenschaften
Tom Hawtin – Taktik

Es gibt eine Kopie der Eigenschaften pro VM. Sie haben die gleichen Probleme wie andere Statiken (einschließlich Singletons).

Ich denke, als Hacker rufst du an System.setProperties zu einer Version von Properties die je nach Kontext (Thread, Callstack, Tageszeit usw.) unterschiedlich reagiert. Es könnte auch alle Änderungen mit protokollieren System.setProperty. Du könntest auch a setzen SecurityManager protokolliert Sicherheitsüberprüfungen für die entsprechenden Berechtigungen.

Ihr Geltungsbereich ist die laufende JVM, aber wenn Sie keine esoterischen Klassenladerprobleme haben, wird eine statische Variable mit einem Eigenschaftenobjekt dasselbe tun und die Möglichkeit haben, zu synchronisieren oder alles andere zu tun, was Sie sonst noch benötigen.

1641736491 885 Umfang der Java Systemeigenschaften
Robin73

Wenn Sie eine neue JVM starten, erstellt sie eine Kopie der Umgebungsvariablen und verwendet sie für ihren gesamten Lebenszyklus. Wenn Sie also Änderungen an dieser Umgebung vornehmen, bleiben sie darauf beschränkt. Das seltsame Verhalten, auf das ich gestoßen bin und das ich untersuche, ist etwas anders: Wenn ich eine JVM starte, deklariere ich einige der Umgebungsvariablen (-D-Argument in der cmd-Zeile), die das Verhalten von Bibliotheken beeinflussen, die ich in meinen Anwendungen verwende. Aber wenn ich innerhalb des Java-Codes (wo sie sichtbar sind) Änderungen daran vornehme, scheinen diese Änderungen das Verhalten von Bibliotheken nicht zu beeinflussen. Das Seltsame ist, dass wir uns in derselben JVM befinden!

1641736491 713 Umfang der Java Systemeigenschaften
Vierzigläufer

Sie sagen nicht, was Ihre Motivation für die Verwendung von Systemeigenschaften ist.

Wir verwenden Spring für unsere Konfiguration und legen anfängliche Eigenschaften mithilfe einer Eigenschaftendatei fest, die in das XML eingefügt wird. Änderungen an der Konfiguration während der Ausführung der App werden mithilfe von JMX vorgenommen.

Es gibt natürlich viele andere Möglichkeiten, die Konfiguration in Java mithilfe von Eigenschaftendateien, XML-basierten Konfigurationen usw. zu ändern.

.

215390cookie-checkUmfang der Java-Systemeigenschaften

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy