Was sind ReservedCodeCacheSize und InitialCodeCacheSize?


86

Kann jemand bitte erklären, was die JVM-Option ist ReservedCodeCacheSizeund was InitialCodeCacheSizesind? Speziell wann / warum sollte ich es ändern wollen? Wie entscheide ich mich für die richtige Größe?

Dies ist, was die Dokumente sagen:

-XX: ReservedCodeCacheSize = 32m Reservierte Code-Cache-Größe (in Bytes) - maximale Code-Cache-Größe. [Solaris 64-Bit, amd64 und -Server x86: 2048 m; in 1.5.0_06 und früher Solaris 64-Bit und and64: 1024m.]


2
Das OP dieses Beitrags schrieb:> -XX: ReservedCodeCacheSize = 32m Reservierte Code-Cache-Größe (in Bytes) - maximale Code-Cache-Größe. [Solaris 64-Bit, amd64 und -Server x86: 48 m; in 1.5.0_06 und früher, Solaris 64-Bit und and64: 1024m.] Ich möchte nur korrigieren, dass die erwähnte Obergrenze bei 48m ein Tippfehler sein muss. Es ist 2048m.
Lasse Aagren

Antworten:


73

ReservedCodeCacheSize(und InitialCodeCacheSize) ist eine Option für den (Just-in-Time-) Compiler der Java Hotspot-VM. Grundsätzlich wird die maximale Größe für den Code-Cache des Compilers festgelegt.

Der Cache kann voll werden, was zu Warnungen wie den folgenden führt:

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=
Code Cache  [0x000000010958f000, 0x000000010c52f000, 0x000000010c58f000)
 total_blobs=15406 nmethods=14989 adapters=362 free_code_cache=835Kb largest_free_block=449792

Es ist viel schlimmer, wenn gefolgt von Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated.

Wann muss diese Option eingestellt werden?

  1. bei Hotspot-Compilerfehlern
  2. um den von der JVM benötigten Speicher zu reduzieren (und damit JIT-Compiler-Fehler zu riskieren)

Normalerweise würden Sie diesen Wert nicht ändern. Ich denke, die Standardwerte sind ziemlich ausgewogen, da diese Probleme nur sehr selten auftreten (nach meiner Erfahrung).


1
Nett. Was sind die Standardwerte und auf was sollten sie erhöht werden, wenn der CodeCache voll ist? Warnung?
Axel22

3
@ axel22: Die Werte hängen tatsächlich von der Plattform und der JVM-Version ab. Werte aus dem Dokument für Sun JVM: Reserved code cache size (in bytes) - maximum code cache size. [Solaris 64-bit, amd64, and -server x86: 48m; in 1.5.0_06 and earlier, Solaris 64-bit and amd64: 1024m.]OpenJDK-Werte sind nicht bekannt. Ein moderater Anstieg sollte ausreichen (eine frühere Einstellung von 1024 m war jenseits von Gut und Böse).
Jeha

12

@jeha beantwortet alles, was ich aus dieser Frage wissen wollte, abgesehen davon, auf welchen Wert die Parameter eingestellt werden sollen. Da ich den Code, den ich bereitstellte, nicht geschrieben habe, hatte ich nicht viel Einblick in den Speicherbedarf.

Sie können jedoch jconsole verwenden, um eine Verbindung zu Ihrem laufenden Java-Prozess herzustellen, und dann auf der Registerkarte "Speicher" die Größe des Code-Cache ermitteln. Der Vollständigkeit halber sind die Schritte (Linux-VM-Umgebung, obwohl ich sicher bin, dass andere Umgebungen ähnlich sind):

  1. Starten Sie die Jconsole auf Ihrem Computer
  2. Suchen Sie die richtige Prozess-ID und hängen Sie die jconsole daran an (dies dauert einige Momente).
  3. Navigieren Sie zur Registerkarte "Speicher"
  4. Wählen Sie in der Dropdown-Liste "Diagramm:" die Option "Speicherpool" Code-Cache "aus.
  5. Auch hier kann es einige Momente dauern, bis der Bildschirm aktualisiert wird, und dann sollten Sie Folgendes sehen: jconsole code cache image

    Wie Sie sehen können, verwendet mein Code-Cache ca. 49 MB. Zu diesem Zeitpunkt hatte ich noch die Standardeinstellung, die laut Dokumentation (und @jeha) 48 MB beträgt. Mit Sicherheit eine große Motivation für mich, die Einstellung zu verbessern!

    Ben.


    1024 MB standardmäßig haben es wahrscheinlich übertrieben, aber 48 MB standardmäßig scheinen es zu übertreiben ...


Guter Vorschlag .... Ich versuche es mit -J-XX: ReservedCodeCacheSize = 512m
MarcoZen

Netbeans würde nicht mit 512m starten, tat mit 256m
MarcoZen

Und nach ca. 2 Tagen Test kann ich sagen, dass die Einstellung keine / keine merkliche Verbesserung zeigte und stattdessen Netbeans beschwipst machte. Am Ende habe ich es einfach entfernt.
MarcoZen

3

Eine gute Lernerfahrung des Ingenieurteams von Indeed und Herausforderungen bei der Migration auf jdk 8.

http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-java-8-migration/

Fazit: Jdk 8 benötigt mehr Code-Cache als JDK 7

Die Standard-Codecache-Größe für JRE 8 beträgt ca. 250 MB und ist damit etwa fünfmal so groß wie die Standardgröße von 48 MB für JRE 7. Nach unserer Erfahrung benötigt JRE 8 diesen zusätzlichen Codecache. Wir haben bisher ungefähr zehn Dienste auf JRE 8 umgestellt, und alle verwenden ungefähr viermal mehr Codecache als zuvor.


0

von https://blogs.oracle.com/poonam/entry/why_do_i_get_message :

Im Folgenden sind zwei bekannte Probleme in jdk7u4 + in Bezug auf das CodeCache-Leeren aufgeführt:

  1. Der Compiler wird möglicherweise auch dann nicht neu gestartet, wenn die CodeCache-Belegung nach dem Notspülen auf fast die Hälfte gesunken ist.
  2. Das Notspülen kann zu einer hohen CPU-Auslastung durch die Compiler-Threads führen, was zu einer allgemeinen Leistungsverschlechterung führt.

Dieses Leistungsproblem und das Problem, dass der Compiler nicht wieder aktiviert wird, wurde in JDK8 behoben. Um dies in JDK7u4 + zu umgehen, können wir die Größe des Code-Caches mithilfe der Option ReservedCodeCacheSize erhöhen, indem wir einen Wert festlegen, der größer als der kompilierte Code-Footprint ist, damit der CodeCache niemals voll wird. Eine andere Lösung hierfür besteht darin, das CodeCache-Flushing mit der JVM-Option -XX: -UseCodeCacheFlushing zu deaktivieren.

Die oben genannten Probleme wurden in JDK8 und seinen Updates behoben.

Diese Informationen sind möglicherweise für Systeme erwähnenswert, die unter JDK 6 (Code-Flushing deaktiviert) und 7 ausgeführt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.