ReservedCodeCacheSize ve InitialCodeCacheSize nedir?


89

Birisi JVM seçeneği lütfen açıklayabilir ReservedCodeCacheSizeve InitialCodeCacheSizenelerdir? Özellikle onu ne zaman / neden değiştirmek isteyeyim? Doğru bedenin ne olduğuna nasıl karar veririm?

Dokümanların söylediği bu:

-XX: ReservedCodeCacheSize = 32m Ayrılmış kod önbellek boyutu (bayt cinsinden) - maksimum kod önbellek boyutu. [Solaris 64-bit, amd64 ve -server x86: 2048m; 1.5.0_06 ve önceki sürümlerde, Solaris 64-bit ve and64: 1024m.]


2
Bu yazının OP'si şunu yazdı:> -XX: ReservedCodeCacheSize = 32m Ayrılmış kod önbellek boyutu (bayt cinsinden) - maksimum kod önbellek boyutu. [Solaris 64-bit, amd64 ve -server x86: 48m; 1.5.0_06 ve önceki sürümlerde, Solaris 64-bit ve ve64: 1024m.] Sadece 48m'de belirtilen üst sınırın bir yazım hatası olması gerektiğini düzeltmek istiyorum. 2048m.
Lasse Aagren

Yanıtlar:


74

ReservedCodeCacheSize(ve InitialCodeCacheSize), Java Hotspot VM'nin (tam zamanında) derleyicisi için bir seçenektir. Temel olarak, derleyicinin kod önbelleği için maksimum boyutu belirler.

Önbellek dolabilir ve bu da aşağıdaki gibi uyarılara neden olabilir:

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

Takip edildiğinde çok daha kötü Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated.

Bu seçenek ne zaman ayarlanmalı?

  1. Hotspot derleyici hataları olduğunda
  2. JVM'nin ihtiyaç duyduğu belleği azaltmak (ve dolayısıyla JIT derleyici arızalarını riske atmak)

Normalde bu değeri değiştirmezsiniz. Varsayılan değerlerin oldukça dengeli olduğunu düşünüyorum çünkü bu sorunlar sadece çok nadir durumlarda ortaya çıkıyor (benim tecrübemde).


1
Güzel. Varsayılan değerler nelerdir ve "CodeCache dolu" ifadesini görürsek neye yükseltilmelidirler. uyarı?
axel22

3
@ axel22: Değerler aslında platforma ve JVM sürümüne bağlıdır; Sun JVM için dokümandaki değerler: 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 değerlerini bilmiyorum. Makul bir artış yeterli olmalıdır (daha önceki 1024m ayarı iyinin ve kötünün ötesinde idi).
jeha

12

@jeha, parametreleri hangi değere ayarlayacağım dışında bu sorudan bilmek istediğim her şeyi yanıtlıyor. Konuşlandırdığım kodu yazmadığım için, sahip olduğu bellek ayak izini pek göremedim.

Ancak, çalışan java sürecinize eklemek için jconsole kullanabilir ve ardından Kod Önbelleği boyutunu bulmak için 'Bellek' sekmesini kullanabilirsiniz. Tamlık için adımlar şunlardır (Linux VM ortamı, ancak diğer ortamların benzer olduğundan eminim):

  1. Makinenizde jconsole ateşleyin
  2. Doğru işlem kimliğini bulun ve ona jconsole ekleyin (bu birkaç dakika sürecektir)
  3. 'Bellek' sekmesine gidin
  4. "Grafik:" açılır listesinden "Bellek Havuzu" Kod Önbelleği "ni seçin.
  5. Yine, ekranın yenilenmesi birkaç dakika sürebilir ve ardından aşağıdaki gibi bir şey görmelisiniz: jconsole kodu önbellek görüntüsü

    Gördüğünüz gibi, kod önbelleğim yaklaşık 49 MB kullanıyor. Bu noktada hala belgelerin (ve @jeha'nın) 48 MB olduğunu söylediği varsayılana sahibim. Ortamı yükseltmem için kesinlikle büyük bir motivasyon!

    Ben.


    Varsayılan olarak 1024 MB muhtemelen aşırıya kaçıyordu, ancak varsayılan olarak 48 MB bunun altında kalıyor gibi görünüyor ...


İyi öneri .... -J-XX ile deniyorum: ReservedCodeCacheSize = 512m
MarcoZen

Netbeans 512 metre ile başlamadı, 256
metre

Ve yaklaşık 2 gün test ettikten sonra, ayarın herhangi bir / belirgin bir iyileşme göstermediğini ve bunun yerine net fasulyeleri sarhoş yaptığını söyleyebilirim. Sonunda onu kaldırdım.
MarcoZen

3

Indeed mühendislik ekibinden iyi bir öğrenme deneyimi ve jdk 8'e geçerken karşılaştıkları zorluklar.

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

Sonuç: Jdk 8, JDK 7 için daha fazla kod önbelleğine ihtiyaç duyar

JRE 8 için varsayılan codecache boyutu yaklaşık 250MB'dir ve JRE 7 için varsayılan 48MB'den yaklaşık beş kat daha büyüktür. Deneyimlerimiz, JRE 8'in bu ekstra codecache'e ihtiyacı olduğudur. Şimdiye kadar yaklaşık on hizmeti JRE 8'e geçirdik ve hepsi öncekinden yaklaşık dört kat daha fazla codecache kullanıyor.


0

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

Aşağıdakiler, jdk7u4 + 'da CodeCache temizleme ile ilgili bilinen iki sorundur:

  1. Derleyici, CodeCache kullanımının acil temizlemeden sonra neredeyse yarıya düştükten sonra bile yeniden başlatılamayabilir.
  2. Acil durum temizleme, derleyici iş parçacıkları tarafından yüksek CPU kullanımına neden olabilir ve bu da genel performans düşüşüne yol açar.

Bu performans sorunu ve derleyicinin yeniden etkinleştirilememesi sorunu JDK8'de ele alınmıştır. Bunları JDK7u4 + 'da çözmek için, ReservedCodeCacheSize seçeneğini kullanarak kod önbellek boyutunu, CodeCache'nin hiçbir zaman dolmaması için derlenmiş kod ayak izinden daha büyük bir değere ayarlayarak artırabiliriz. Bunun bir başka çözümü de -XX: -UseCodeCacheFlushing JVM seçeneğini kullanarak CodeCache Flushing'i devre dışı bırakmaktır.

Yukarıda belirtilen sorunlar, JDK8 ve güncellemelerinde düzeltilmiştir.

Bu nedenle, JDK 6 (kod temizleme devre dışı bırakılmış) ve 7 üzerinde çalışan sistemler için bu bilgilerden bahsetmeye değer olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.