आरक्षितकोडेचेशे और प्रारम्भकचैकेज क्या हैं?


86

क्या कोई समझा सकता है कि जेवीएम विकल्प क्या है ReservedCodeCacheSizeऔर InitialCodeCacheSizeक्या है? विशेष रूप से कब / क्यों मैं इसे बदलना चाहूंगा? मैं कैसे तय करूं कि सही आकार क्या है?

यह डॉक्स का कहना है:

-XX: आरक्षितकोड कैश करें = 32 मीटर आरक्षित कोड कैश आकार (बाइट्स में) - अधिकतम कोड कैश आकार। [Solaris 64-बिट, amd64, और -server x86: 2048m; 1.5.0_06 और पूर्व में, सोलारिस 64-बिट और 64: 1024 मी।]


2
इस पोस्ट के ओपी ने लिखा:> -XX: RESCodeCacheSize = 32m आरक्षित कोड कैश आकार (बाइट्स में) - अधिकतम कोड कैश आकार। [Solaris 64-बिट, amd64, और -server x86: 48m; 1.5.0_06 और पूर्व में, सोलारिस 64-बिट और .64: 1024 मी।] मैं अभी यह सही करना चाहता हूं कि 48 मीटर पर उल्लिखित ऊपरी सीमा एक टाइपो होनी चाहिए। यह 2048 मी।
लास ऐग्रेन

जवाबों:


73

ReservedCodeCacheSize(और InitialCodeCacheSize) जावा हॉटस्पॉट वीएम के (सिर्फ-इन-टाइम) संकलक के लिए एक विकल्प है। मूल रूप से यह संकलक के कोड कैश के लिए अधिकतम आकार निर्धारित करता है।

कैश पूर्ण हो सकता है, जिसके परिणामस्वरूप निम्न की तरह चेतावनी होती है:

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. जब हॉटस्पॉट संकलक की विफलता हो रही है
  2. जेवीएम द्वारा आवश्यक मेमोरी को कम करने के लिए (और इसलिए जेआईटी कंपाइलर विफलताओं को जोखिम में डालना)

आम तौर पर आप इस मान को नहीं बदलेंगे। मुझे लगता है कि डिफ़ॉल्ट मान काफी अच्छे हैं क्योंकि यह समस्या बहुत ही कम मौकों (मेरे एक्सपीरियंस में) पर होती है।


1
अच्छा लगा। डिफ़ॉल्ट मान क्या हैं, और अगर हमें "CodeCache भरा हुआ है" तो उन्हें क्या बढ़ाया जाना चाहिए। चेतावनी?
axel22

3
@ axel22: मूल्य वास्तव में प्लेटफॉर्म और जेवीएम संस्करण पर निर्भर करते हैं; सूर्य 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 मान नहीं जानते। एक मध्यम वृद्धि पर्याप्त होनी चाहिए (पहले 1024 मीटर की सेटिंग अच्छी बुराई से परे थी)।
जेह

12

@ जेजा ने इस सवाल से जो कुछ भी जानना चाहा, उसके मापदंडों को निर्धारित करने के लिए किस मूल्य के अलावा उत्तर दिया। जैसा कि मैंने उस कोड को नहीं लिखा था जिसे मैं तैनात कर रहा था मेरे पास स्मृति पदचिह्न में बहुत दृश्यता नहीं थी।

हालाँकि, आप अपनी रनिंग जावा प्रक्रिया को संलग्न करने के लिए जोंकोस का उपयोग कर सकते हैं, और फिर कोड कैश आकार का पता लगाने के लिए 'मेमोरी' टैब का उपयोग कर सकते हैं। पूर्णता के लिए, चरण हैं (लिनक्स VM वातावरण, हालांकि मुझे यकीन है कि अन्य वातावरण समान हैं):

  1. अपनी मशीन पर जोंकॉस फायर करें
  2. सही प्रक्रिया आईडी खोजें और इसे जंक कंसोल संलग्न करें (इसमें कुछ समय लगेगा)
  3. 'मेमोरी' टैब पर नेविगेट करें
  4. 'चार्ट:' ड्रॉप-डाउन सूची से, 'मेमोरी पूल "कोड कैश चुनें।
  5. फिर, स्क्रीन को ताज़ा करने में कुछ समय लग सकता है, और फिर आपको कुछ इस तरह देखना चाहिए: jconsole कोड कैश छवि

    जैसा कि आप देख सकते हैं, मेरा कोड कैश लगभग 49 एमबी का उपयोग कर रहा है। इस बिंदु पर मेरे पास अभी भी डिफ़ॉल्ट था जो प्रलेखन (और @ जेजा) कहता है कि 48 एमबी है। निश्चित रूप से सेटिंग बढ़ाने के लिए मेरे लिए एक बड़ी प्रेरणा!

    बेन।


    डिफ़ॉल्ट रूप से 1024 MB शायद इसे ओवरडोज़ कर रहा था, लेकिन डिफ़ॉल्ट रूप से 48 MB इसे कम कर रहा है ...


अच्छा सुझाव .... मैं
-जे

Netbeans 512m से शुरू नहीं होगा, 256m के साथ किया
MarcoZen

और लगभग 2 दिनों के परीक्षण के बाद, मैं कह सकता हूं कि सेटिंग ने कोई / कोई ध्यान देने योग्य सुधार नहीं दिखाया और इसके बजाय netbeans tipsy बनाया। मैं इसे हटाकर ही समाप्त हुआ।
मार्कोज़ेन

3

वास्तव में इंजीनियरिंग टीम से एक अच्छा सीखने का अनुभव और चुनौतियों का सामना करना पड़ा जब 8 जुलाई को पलायन।

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

निष्कर्ष: Jdk 8 को अधिक कोड कैश की जरूरत है JDK 7

JRE 8 के लिए डिफ़ॉल्ट कोडेक का आकार लगभग 250MB है, JRE 7 के लिए 48MB डिफ़ॉल्ट से लगभग पांच गुना बड़ा है। हमारा अनुभव है कि JRE 8 को अतिरिक्त कोडेक की आवश्यकता है। हमने JRE 8 में अब तक लगभग दस सेवाओं को स्विच किया है, और उनमें से सभी पहले की तुलना में लगभग चार गुना अधिक कोडेक का उपयोग करते हैं।


0

से https://blogs.oracle.com/poonam/entry/why_do_i_get_message :

कोडकैश फ्लशिंग के संबंध में jdk7u4 + में दो ज्ञात समस्याएं हैं:

  1. हो सकता है कि कोडकेक ऑक्यूपेंसी इमरजेंसी फ्लशिंग के बाद लगभग आधे से कम हो जाने के बाद भी कंपाइलर दोबारा चालू न हो।
  2. आपातकालीन निस्तब्धता समग्र प्रदर्शन गिरावट के लिए अग्रणी संकलक थ्रेड्स द्वारा उच्च CPU उपयोग का कारण हो सकता है।

यह प्रदर्शन समस्या, और कंपाइलर की समस्या को फिर से सक्षम न करने की समस्या को JDK8 में संबोधित किया गया है। JDK7u4 + में इन्हें वर्कअराउंड करने के लिए, हम कोड-कैश साइज़ को बढ़ा सकते हैं जिसका उपयोग कर रिज़ॉल्यूशन-कोड विकल्प की तुलना में बड़े मान पर सेट करके, यह कोडकोड से भरा हुआ नहीं होता है। इसका एक और समाधान कोडक फ्लशिंग को -XX का उपयोग करके अक्षम करना है: -UseCodeCacheFlushing JVP विकल्प।

उपर्युक्त मुद्दे JDK8 और इसके अपडेट में तय किए गए हैं।

ताकि जानकारी JDK 6 (कोड फ्लशिंग अक्षम) और 7 पर चलने वाले सिस्टम के लिए उल्लेख के लायक हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.