webentwicklung-frage-antwort-db.com.de

Was sind ReservedCodeCacheSize und InitialCodeCacheSize?

Kann jemand bitte erklären, was die JVM-Option ReservedCodeCacheSize und InitialCodeCacheSize ist? Insbesondere wann/warum sollte ich es ändern wollen? Wie bestimme ich die richtige Größe?

Dies ist, was die Dokumente sagen:

-XX: ReservedCodeCacheSize = 32m Reservierte Codecachegröße (in Byte) - maximale Codecachegröße. [Solaris 64-Bit, AMD64 und -server x86: 2048m; In 1.5.0_06 und früheren Versionen, Solaris 64-Bit und and64: 1024m.]

76
Raghu

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 folgenden Warnungen 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 Java HotSpot(TM) Client VM warning: Exception Java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated folgt.

Wann muss diese Option eingestellt werden?

  1. bei Hotspot-Compiler-Fehlern
  2. reduzierung des von der JVM benötigten Speichers (und damit Gefahr von JIT-Compiler-Fehlern)

Normalerweise würden Sie diesen Wert nicht ändern. Ich denke, dass die Standardwerte ziemlich ausgeglichen sind, da diese Probleme nur in sehr seltenen Fällen (in meiner Erfahrung) auftreten.

69
jeha

@jeha beantwortet alles, was ich aus dieser Frage wissen wollte, abgesehen von dem Wert, auf den die Parameter eingestellt werden sollen. Da ich den bereitgestellten Code nicht schrieb, 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 die Registerkarte "Speicher" verwenden, um die Code-Cache-Größe zu ermitteln. Der Vollständigkeit halber sind die Schritte (Linux VM - Umgebung, obwohl ich mir sicher bin, dass andere Umgebungen ähnlich sind):

  1. Starten Sie Jconsole auf Ihrer Maschine
  2. Finden Sie die richtige Prozess-ID und hängen Sie jconsole an (dies dauert einige Augenblicke).
  3. Navigieren Sie zur Registerkarte 'Speicher'
  4. Wählen Sie in der Dropdown-Liste "Diagramm" die Option "Memory Pool" Code Cache "aus.
  5. Auch hier kann es einige Momente dauern, bis der Bildschirm aktualisiert wird, und dann sollte Folgendes angezeigt werden: jconsole code cache image

    Wie Sie sehen, verbraucht mein Code-Cache ca. 49 MB. Zu diesem Zeitpunkt hatte ich noch den Standardwert, der laut Dokumentation (und @jeha) 48 MB beträgt. Für mich sicherlich eine große Motivation, die Einstellung zu erhöhen!

    Ben.


    Wahrscheinlich übertrafen 1024 MB es standardmäßig, aber 48 MB standardmäßig scheinen es zu übertreiben ...

12
Animal451

Eine gute Lernerfahrung aus dem Indeed Engineering Team und Herausforderungen, denen sie bei der Migration zu jdk 8 gegenüberstanden.

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 etwa 250 MB, etwa fünfmal mehr als die 48 MB-Standardeinstellung für JRE 7. Nach unserer Erfahrung benötigt JRE 8 diesen zusätzlichen Codecache. Wir haben bisher etwa zehn Dienste auf JRE 8 umgestellt und alle verwenden etwa viermal mehr Codecache als zuvor.

2
vsingh

aus https://blogs.Oracle.com/poonam/entry/why_do_i_get_message :

Im Folgenden sind zwei bekannte Probleme in jdk7u4 + in Bezug auf die CodeCache-Spülung aufgeführt:

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

Dieses Leistungsproblem und das Problem, dass der Compiler nicht erneut aktiviert wird, wurde in JDK8 behoben. Um diese Probleme in JDK7u4 + zu umgehen, können Sie die Code-Cache-Größe mithilfe der Option ReservedCodeCacheSize erhöhen, indem Sie einen höheren Wert als den Footprint für kompilierten Code festlegen, sodass der CodeCache nie voll wird. Eine andere Lösung hierfür ist das Deaktivieren der CodeCache-Flushing mithilfe der JVM-Option -XX: -UseCodeCacheFlushing.

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

Daher können diese Informationen für Systeme, die unter JDK 6 (mit deaktivierter Code-Bereinigung) und 7 ausgeführt werden, erwähnenswert sein.

0