ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
653
653
EMPFEHLEN
-
19.10.11 10:08 #1
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
unter http://www.oracle.com/technetwork/ja...sp-140102.html
findet man eine Aufstellung aller JVM Optionen die man bei Sun / Oracle basierten JVMs tunen kann.
Diese Liste ist aber leider nicht vollständig, denn es gibt noch viel mehr interne JVM Optionen die dort nicht genannt werden.
Hier mal an Beispiel wie man an eine umfangreichere Liste von JVM Optionen mit den Werten der aktuellen JVM Instanz inklusive defaults kommt:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
package de.tutorials.training; import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.net.URL; import java.util.LinkedHashMap; import java.util.Map; import java.util.Scanner; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.openmbean.CompositeData; public class JvmOptionsAnalyzer { //private final String supportedOptionCategories = "diagnostic|develop|notproduct|product_pd|product"; private final String supportedOptionCategories = "product"; /* * Thank god for the invention of code conventions *g* */ private final Pattern defaultOpenJdkJvmOptionExtractorPattern = Pattern.compile("\\s*(" + supportedOptionCategories + ")\\([\\w\\d]+,\\s*([\\w\\d]+)\\s*,\\s[\\w\\d]+.*\\\\"); @SuppressWarnings("serial") private final Map<String, Pattern> jvmOptionSourceUrlsToOptionPatternMap = new LinkedHashMap<String, Pattern>() { { put( "http://hg.openjdk.java.net/jdk7/hotspot-gc/hotspot/raw-file/162b62460264/src/share/vm/runtime/globals.hpp", defaultOpenJdkJvmOptionExtractorPattern); put( "http://hg.openjdk.java.net/jdk7/build/hotspot/raw-file/cd8e33b2a8ad/src/share/vm/gc_implementation/g1/g1_globals.hpp", defaultOpenJdkJvmOptionExtractorPattern); } }; private final Map<String, Set<String>> alreadyFoundJvmOptions = new TreeMap<String, Set<String>>(); public static void main(String[] args) throws Exception { new JvmOptionsAnalyzer().listCurrentJVMOptions(); } private void listCurrentJVMOptions() { printCurrentJVMVersion(); downloadOpenJdkVMOptionList(); printJvmOptionSummary(); printCurrentJVMOptions(); } private void printCurrentJVMVersion() { RuntimeMXBean rmxb = ManagementFactory.getRuntimeMXBean(); System.out.printf("%s %s %s %s", System.getProperty("java.version"), rmxb.getVmVersion(), rmxb.getVmName(),rmxb.getVmVendor()).println(); } private void printCurrentJVMOptions() { JvmOptionAccessor joa = new JvmOptionAccessor(); for (Map.Entry<String, Set<String>> options : alreadyFoundJvmOptions.entrySet()) { String categoryName = options.getKey(); System.out.println("#### Options in Category: " + categoryName + " " + options.getValue().size()); for (String optionName : options.getValue()) { Object vmOption = joa.getVMOption(optionName); if (vmOption == null) { System.out.println(optionName + " is not supported by this JVM"); } else { // Name, Origin, Value, Writeable System.out.println(vmOption); } } } } private void downloadOpenJdkVMOptionList() { for (Map.Entry<String, Pattern> sourceUrlToOptionPatternMap : jvmOptionSourceUrlsToOptionPatternMap.entrySet()) { String jvmOptionSourceUrl = sourceUrlToOptionPatternMap.getKey(); Pattern optionExtractorPattern = sourceUrlToOptionPatternMap.getValue(); loadJvmOptionsFromSourceUrl(jvmOptionSourceUrl, alreadyFoundJvmOptions, optionExtractorPattern); } } private void printJvmOptionSummary() { System.out.println("##### JvmOptionSummary:"); for (String optionCategory : alreadyFoundJvmOptions.keySet()) { System.out.println("Options in Category: " + optionCategory + ": " + alreadyFoundJvmOptions.get(optionCategory).size()); } System.out.println("#####"); } private void loadJvmOptionsFromSourceUrl(String jvmOptionSourceUrl, Map<String, Set<String>> alreadyFoundJvmOptions, Pattern optionExtractorPattern) { System.out.println("loading options from: " + jvmOptionSourceUrl); Scanner scanner = null; try { scanner = new Scanner(new URL(jvmOptionSourceUrl).openStream()); while (scanner.hasNextLine()) { String line = scanner.nextLine(); Matcher matcher = optionExtractorPattern.matcher(line); if (matcher.matches()) { String optionCategory = matcher.group(1); String optionName = matcher.group(2); registerJvmOption(alreadyFoundJvmOptions, optionCategory, optionName); } } } catch (IOException e) { e.printStackTrace(); } finally { scanner.close(); } System.out.println("done."); } protected void registerJvmOption(Map<String, Set<String>> alreadyFoundJvmOptions, String optionCategory, String optionName) { Set<String> optionNames = alreadyFoundJvmOptions.get(optionCategory); if (optionNames == null) { optionNames = new TreeSet<String>(); alreadyFoundJvmOptions.put(optionCategory, optionNames); } optionNames.add(optionName); } static class JvmOptionAccessor { private final static String GET_VM_OPTION_METHOD_NAME = "getVMOption"; private final static String HOTSPOT_DIAGNOSTICS_OBJECT_NAME = "com.sun.management:type=HotSpotDiagnostic"; private MBeanServer platformMBeanServer; private ObjectName hotSpotDiagnosticName; public JvmOptionAccessor() { try { platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); hotSpotDiagnosticName = new ObjectName(HOTSPOT_DIAGNOSTICS_OBJECT_NAME); } catch (MalformedObjectNameException e) { throw new RuntimeException(e); } catch (NullPointerException e) { throw new RuntimeException(e); } } public Object getVMOption(String optionName) { Object result = null; try { Object[] paramValues = new Object[] { optionName }; String[] paramTypes = new String[] { String.class.getName() }; CompositeData cd = (CompositeData) platformMBeanServer.invoke(hotSpotDiagnosticName,GET_VM_OPTION_METHOD_NAME, paramValues, paramTypes); result = cd != null ? cd.values() : null; } catch (Exception e) { // ignore } return result; } } }
Anbei zwei Beispielausgaben für eine Oracle JVM 1.6.x und 1.7.x unter 64-Bit Windows
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
19.10.11 10:22 #2SE Tutorials.de Gastzugang
Da hab ich aber n Veto einzulegen !
Anhand der verwendeten Links welche schon OpenJDK im namen stehen haben gehe ich davon aus das man damit sicher nicht an die Flags einer Sun/Oracle VM herankommt da die Informaitonen auch nur von einem SpreadSheet aus dem Netz geladen werden.
-
19.10.11 10:30 #3
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
na ja, OpenJdk basiert ja (zumindest Teilweise) auf dem Code der Sun JVM. Deshalb gibt es da eine gewisse abwärts) Kompatibilität was die internen switches angeht... von daher würde ich schon sagen, dass man das durchaus verwenden kann um eine umfangreichere Übersicht zu bekommen. Wie du den Beispielen für (1.6 und 1.7er JVMs 1.5 hab ich leider nicht mehr Installiert) entnehmen kannst kommt auch (bis auf wenige Ausnahmen) tatsächlich ein entsprechende VMOptions Informationen zurück.
Deshalb würde ich mal behaupten, dass beim obigen Ansatz doch etwas mehr Information entsteht als die "offiziell" verfügbaren Tabellen mit JVM Switches bieten können.
Diese JVM Switches gelten, wie im Beitrag schon genannt nur für OpenJDK, Sun / Oracle JVMs (natürlich nicht JRockit). Andere JVMs, beispielsweise von IBM oder HP habennatürlich andere JVM Switches.
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
19.10.11 10:37 #4SE Tutorials.de Gastzugang
Ja ... versteh ich doch ... ich wollte lediglich mit zum ausdruck bringen das man nicht an ALLE Switches der Oracle VM kommt ... und es sicherlich auch passieren kann das man in dieser Liste *welche ja nun mal fürs OpenJDK ist* switches hat welche es in der Oracle VM überhaupt nicht gibt. Das ein großteil kompatibel ist ist klar da ja zumindest seit v7 das OpenJDK die offizielle Referenzimplementierung darstellt ... aber 100% passen wird es nicht.
-
19.10.11 22:36 #5
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
Code ist jetzt auf github:
https://github.com/thomasdarimont/jvmoa
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
07.11.11 09:20 #6
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
es gibt auch noch eine andere Möglichkeit alle JVM Einstellungen einer "lokalen" JVM auszugeben:
Code :1
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
Mit: -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal wird eine Liste der JVM Optionen ausgegeben.
Dieses Flag stand auch in den beiden oben angehängten TXT Dateien drinnen: PrintFlagsFinal
Quelle: http://www.jroller.com/ethdsy/entry/print_all_jvm_flags
Danke an Heinz Kabutz für den Tipp
-version ist notwendig, damit die JVM gestartet wird...
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
Ähnliche Themen
-
Auflistung aller geladenen Klassen und Ermittlung Platformspezifischer Objektgroessen
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 30.05.06, 10:55 -
[Oracle] Name der aktuellen Instanz per SQL ermitteln
Von Thomas Darimont im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 20.12.05, 22:10 -
IP-Adressen-Ermittlung
Von Andreas703 im Forum C/C++Antworten: 9Letzter Beitrag: 12.07.05, 19:36 -
User-Agent-Ermittlung
Von Gumbo im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 10.12.04, 23:06 -
Zeitmessungs zur Ermittlung des unterschieds...
Von Valentin- im Forum PHPAntworten: 5Letzter Beitrag: 16.12.01, 13:31






Zitieren
Login





