Dimensionierung und Konfiguration des jadice web toolkit bei Inbetriebnahme
Zur Inbetriebnahme einer Installation des jadice web toolkit sind verschiedene Einstellungen vorzunehmen.
Die meisten Werte sind bereits sinnvoll voreingestellt - jedoch mindestens die grundsätzliche Dimensionierung der Server sowie die Konfiguration der Caches müssen anhand der erwarteten Last passend eingestellt werden - gerne auch in Rücksprache mit levigo.
In der nachfolgenden Tabelle sind die verschiedenen Parameter zusammengestellt.
Stellgrößen für Dimensionierung und Performance im jadice web toolkit
Bereich | Details | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Pods/VM |
| ||||||||||||||||||||||||||||||||||||||||||||
Tile-Rendering | PNG statt WebP im Container:
| ||||||||||||||||||||||||||||||||||||||||||||
Connection | Verbindungstyp setzen: Websocket, Server Sent Events oder Longpoll (siehe Connection Framework)
| ||||||||||||||||||||||||||||||||||||||||||||
Deployment |
| ||||||||||||||||||||||||||||||||||||||||||||
Performance |
| ||||||||||||||||||||||||||||||||||||||||||||
Cache | Serverseitiges Tile-Caching: an/aus Clientseitiger Cache (Browser): immer aktiv Serverseitiger Cache - typische Richtwerte:
Empfehlung: Serverseitig ggf. auf LRUCache umstellen, falls man sieht, dass trotz geringer Belegung des Caches häufig aufgeräumt wird. Das macht man wie folgt: Überschreiben des Caches im ConfigurationContextListener// Im WebtoolkitServerContext wurde folgendes bereits statisch vorgenommen:
// CacheManager.setDefault(DefaultCacheProvider.getDefaultServerCache());
// Das überschreiben wir hier:
LRUCache cache = new LRUCache(120000);
cache.setSizeHighwaterMark(1000 * 1024 * 1024);
CacheManager.setDefault(cache);
// ConfigurationManager.getServerConfiguration().setTileCachingEnabled(false); | ||||||||||||||||||||||||||||||||||||||||||||
Formatinterpretation der jadice document platform | Format-Einstellungen:
| ||||||||||||||||||||||||||||||||||||||||||||
UX |
|
JVM-Parameter für Spring Boot mit Java 25 (Docker, 8GB RAM)
Garbage Collection
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1ReservePercent=10
Erklärung:
-XX:+UseG1GC- Aktiviert den G1 Garbage Collector (Standard in Java 25, für niedrige Latenz optimiert)-XX:MaxGCPauseMillis=200- Ziel-Pausenzeit von 200ms für GC-Zyklen (Balance zwischen Durchsatz und Latenz)-XX:G1HeapRegionSize=16m- Größe der Heap-Regionen auf 16MB (gut für 6GB Heap)-XX:InitiatingHeapOccupancyPercent=45- Startet Concurrent Marking bei 45% Heap-Belegung (früher = weniger Full GCs)-XX:G1ReservePercent=10- Reserviert 10% des Heaps als Puffer für Allocation Spikes
Heap-Konfiguration
-XX:InitialRAMPercentage=75.0
-XX:MaxRAMPercentage=75.0
-XX:MinRAMPercentage=75.0
-XX:+AlwaysPreTouchErklärung:
-XX:InitialRAMPercentage=75.0- Initiale Heap-Größe auf 75% des Container-RAMs (~6GB bei 8GB)-XX:MaxRAMPercentage=75.0- Maximale Heap-Größe auf 75% begrenzt-XX:MinRAMPercentage=75.0- Minimale Heap-Größe (verhindert dynamisches Resizing)-XX:+AlwaysPreTouch- Alloziert den gesamten Heap beim Start (vermeidet Latenz-Spikes später, bessere Performance)
Metaspace
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512mErklärung:
-XX:MetaspaceSize=256m- Initiale Metaspace-Größe (für Klassen-Metadaten)-XX:MaxMetaspaceSize=512m- Maximale Metaspace-Größe (Spring Boot lädt viele Klassen, daher großzügig bemessen)
Java 25 spezifische Optimierungen
-XX:+UnlockExperimentalVMOptions
-XX:+UseCompactObjectHeadersErklärung:
-XX:+UnlockExperimentalVMOptions- Aktiviert experimentelle Features-XX:+UseCompactObjectHeaders- Neu in Java 25! Reduziert Object-Header von 12→8 Bytes (10-20% weniger Heap-Verbrauch, bessere Cache-Lokalität)
Performance-Optimierungen
-XX:+UseStringDeduplication
-XX:+OptimizeStringConcat
-XX:+UseCompressedOops
-XX:+UseCompressedClassPointersErklärung:
-XX:+UseStringDeduplication- Dedupliziert identische Strings im Heap (spart Speicher bei vielen gleichen Strings)-XX:+OptimizeStringConcat- Optimiert String-Konkatenation zur Laufzeit-XX:+UseCompressedOops- Komprimiert Object-Pointer auf 32 Bit (bei Heaps <32GB, spart Speicher)-XX:+UseCompressedClassPointers- Komprimiert Class-Pointer (zusätzliche Speicherersparnis)
Container-Support
-XX:+UseContainerSupportErklärung:
-XX:+UseContainerSupport- Erkennt Container-Limits (cgroups) automatisch (in Java 25 standardmäßig aktiv, aber explizit ist sicherer)
Diagnostik & Monitoring
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof
-Xlog:gc*:file=/tmp/gc.log:time,uptime,level,tags:filecount=5,filesize=10M
-XX:+ExitOnOutOfMemoryErrorErklärung:
-XX:+HeapDumpOnOutOfMemoryError- Erstellt Heap-Dump bei OutOfMemoryError (für Post-Mortem-Analyse)-XX:HeapDumpPath=/tmp/heapdump.hprof- Speicherort für Heap-Dumps-Xlog:gc*:file=/tmp/gc.log:...- GC-Logging in rotierenden Dateien (max 5 Dateien à 10MB)-XX:+ExitOnOutOfMemoryError- Beendet die JVM bei OOM (Container-Orchestrierung kann neu starten)
Sonstiges
-Djava.security.egd=file:/dev/./urandomErklärung:
-Djava.security.egd=file:/dev/./urandom- Nutzt/dev/urandomfür Zufallszahlen (verhindert Blocking bei/dev/random, wichtig für schnellen Start)
Speicher-Verteilung bei 8GB Container
Heap: ~6GB (75%)
Metaspace: max 512MB
Direct Memory, Thread Stacks, Native Memory: ~1.5GB
Container-Overhead: minimal
Hinweise
Compact Object Headers ist experimentell → unbedingt testen vor Produktion
Bei hoher Last ggf.
MaxRAMPercentageauf 80% erhöhenGC-Logs mit Tools wie GCViewer oder GCEasy analysieren
Bei sehr niedriger Latenz-Anforderung: ZGC als Alternative zu G1GC erwägen