ReservedCodeCacheSize และ InitialCodeCacheSize คืออะไร


89

ใครจะกรุณาอธิบายสิ่งที่ตัวเลือก JVM ReservedCodeCacheSizeและInitialCodeCacheSizeมีอะไรบ้าง โดยเฉพาะเมื่อใด / เหตุใดฉันจึงต้องการเปลี่ยนแปลง ฉันจะตัดสินใจได้อย่างไรว่าขนาดที่เหมาะสมคืออะไร?

นี่คือสิ่งที่เอกสารกล่าวว่า:

-XX: ReservedCodeCacheSize = 32m ขนาดแคชของรหัสที่สงวนไว้ (เป็นไบต์) - ขนาดแคชโค้ดสูงสุด [Solaris 64-bit, amd64 และ -server x86: 2048m; ใน 1.5.0_06 และรุ่นก่อนหน้า Solaris 64 บิตและ 64: 1024 ม.]


2
OP ของโพสต์นี้เขียนว่า:> -XX: ReservedCodeCacheSize = 32m ขนาดแคชโค้ดสำรอง (เป็นไบต์) - ขนาดแคชโค้ดสูงสุด [Solaris 64-bit, amd64 และ -server x86: 48m; ใน 1.5.0_06 และก่อนหน้านี้ Solaris 64-bit และ and64: 1024m] ฉันแค่ต้องการแก้ไขว่าขีด จำกัด สูงสุดที่กล่าวถึงที่ 48m ต้องเป็นคำที่พิมพ์ผิด มันคือ 2048m
Lasse Aagren

คำตอบ:


74

ReservedCodeCacheSize(และInitialCodeCacheSize) เป็นตัวเลือกสำหรับคอมไพเลอร์ (แบบทันเวลา) ของ Java Hotspot VM โดยทั่วไปจะกำหนดขนาดสูงสุดสำหรับแคชโค้ดของคอมไพเลอร์

แคชอาจเต็มได้ซึ่งส่งผลให้มีคำเตือนดังต่อไปนี้:

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

Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminatedมันเลวร้ายมากในขณะที่ตาม

ควรตั้งค่าตัวเลือกนี้เมื่อใด

  1. เมื่อคอมไพเลอร์ Hotspot ล้มเหลว
  2. เพื่อลดหน่วยความจำที่ JVM ต้องการ (และด้วยเหตุนี้จึงเสี่ยงต่อความล้มเหลวของคอมไพเลอร์ JIT)

โดยปกติคุณจะไม่เปลี่ยนค่านี้ ฉันคิดว่าค่าเริ่มต้นค่อนข้างสมดุลดีเพราะปัญหานี้เกิดขึ้นในบางครั้งที่หายากมากเท่านั้น (จากประสบการณ์ของฉัน)


1
ดี. ค่าเริ่มต้นคืออะไรและควรจะเพิ่มขึ้นเป็นเท่าใดหากเราเห็นข้อความ "CodeCache เต็ม" คำเตือน?
axel22

3
@ axel22: ค่าจริงขึ้นอยู่กับแพลตฟอร์มและเวอร์ชัน JVM ค่าจากเอกสารสำหรับ 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 การเพิ่มขึ้นในระดับปานกลางควรเพียงพอ (การตั้งค่าก่อนหน้านี้ที่ 1024m นั้นเกินความชั่วร้าย)
jeha

12

@jeha ตอบทุกสิ่งที่ฉันอยากรู้จากคำถามนี้นอกเหนือจากค่าที่จะตั้งค่าพารามิเตอร์เป็น เนื่องจากฉันไม่ได้เขียนโค้ดฉันกำลังปรับใช้ฉันจึงไม่สามารถมองเห็นได้มากนักในหน่วยความจำที่มี

อย่างไรก็ตามคุณสามารถใช้ jconsole เพื่อเชื่อมต่อกับกระบวนการ java ของคุณจากนั้นใช้แท็บ 'Memory' เพื่อค้นหาขนาด Code Cache เพื่อความสมบูรณ์ขั้นตอนคือ (สภาพแวดล้อม Linux VM แม้ว่าฉันแน่ใจว่าสภาพแวดล้อมอื่น ๆ จะคล้ายกัน):

  1. จุดไฟ jconsole บนเครื่องของคุณ
  2. ค้นหา ID กระบวนการที่ถูกต้องและแนบ jconsole เข้าไป (จะใช้เวลาสักครู่)
  3. ไปที่แท็บ 'Memory'
  4. จากรายการแบบเลื่อนลง "แผนภูมิ:" ให้เลือก "Memory Pool" Code Cache ""
  5. อีกครั้งอาจใช้เวลาสักครู่เพื่อรีเฟรชหน้าจอจากนั้นคุณจะเห็นสิ่งต่างๆเช่น: รูปภาพแคชรหัส jconsole

    อย่างที่คุณเห็นรหัสแคชของฉันใช้ประมาณ 49 MB ณ จุดนี้ฉันยังคงมีค่าเริ่มต้นซึ่งเอกสาร (และ @jeha) ระบุว่าคือ 48 MB แน่นอนว่าเป็นแรงจูงใจที่ดีสำหรับฉันในการเพิ่มการตั้งค่า!

    เบน.


    1024 MB โดยค่าเริ่มต้นอาจจะใช้งานมากเกินไป แต่โดยค่าเริ่มต้น 48 MB ดูเหมือนจะทำงานน้อยเกินไป ...


ข้อเสนอแนะที่ดี .... ฉันกำลังลองกับ -J-XX: ReservedCodeCacheSize = 512m
MarcoZen

Netbeans จะไม่เริ่มต้นด้วย 512m ทำด้วย 256m
MarcoZen

และหลังจากการทดสอบประมาณ 2 วันฉันสามารถพูดได้ว่าการตั้งค่าไม่ได้แสดงให้เห็นถึงการปรับปรุงใด ๆ / ใด ๆ ที่เห็นได้ชัดและทำให้ netbeans รู้สึกไม่สบายแทน ฉันก็แค่ถอดมันออก
MarcoZen

3

ประสบการณ์การเรียนรู้ที่ดีจากทีมวิศวกรของ Indeed และความท้าทายที่พวกเขาต้องเผชิญเมื่อย้ายไปที่ jdk 8

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

สรุป: Jdk 8 ต้องการรหัสแคชมากขึ้นและ JDK 7

ขนาดตัวแปลงสัญญาณเริ่มต้นสำหรับ JRE 8 คือประมาณ 250MB ซึ่งใหญ่กว่าค่าเริ่มต้น 48MB สำหรับ JRE 7 ประมาณ 5 เท่าประสบการณ์ของเราคือ JRE 8 ต้องการตัวแปลงสัญญาณเพิ่มเติมนั้น เราได้เปลี่ยนบริการประมาณสิบรายการเป็น JRE 8 แล้วและทั้งหมดนี้ใช้ตัวแปลงสัญญาณมากกว่าเดิมประมาณสี่เท่า


0

จากhttps://blogs.oracle.com/poonam/entry/why_do_i_get_message :

ต่อไปนี้เป็นปัญหาที่ทราบสองประการใน jdk7u4 + เกี่ยวกับการล้าง CodeCache:

  1. คอมไพเลอร์อาจไม่ได้รับการรีสตาร์ทแม้ว่าจำนวนผู้ใช้ CodeCache จะลดลงเหลือเกือบครึ่งหลังจากการล้างฉุกเฉิน
  2. การล้างฉุกเฉินอาจทำให้เกิดการใช้งาน CPU สูงโดยเธรดคอมไพเลอร์ซึ่งส่งผลให้ประสิทธิภาพโดยรวมลดลง

ปัญหาด้านประสิทธิภาพนี้และปัญหาของคอมไพเลอร์ที่ไม่ได้รับการเปิดใช้งานใหม่อีกครั้งได้รับการแก้ไขแล้วใน JDK8 ในการแก้ไขปัญหาเหล่านี้ใน JDK7u4 + เราสามารถเพิ่มขนาดแคชของโค้ดโดยใช้ตัวเลือก ReservedCodeCacheSize โดยตั้งค่าให้ใหญ่กว่ารอยเท้าที่คอมไพล์เพื่อไม่ให้ CodeCache เต็ม อีกวิธีหนึ่งคือการปิดการใช้งาน CodeCache Flushing โดยใช้ -XX: -UseCodeCacheFlushing JVM option

ปัญหาดังกล่าวข้างต้นได้รับการแก้ไขแล้วใน JDK8 และการอัปเดต

ดังนั้นข้อมูลที่ควรกล่าวถึงสำหรับระบบที่ทำงานบน JDK 6 (ปิดใช้งานการล้างโค้ด) และ 7

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.