जावा 7 (JDK 7) G1 पर कचरा संग्रहण और प्रलेखन


82

जावा 7 अब कुछ समय के लिए बाहर हो गया है, लेकिन मुझे कचरा संग्रहकर्ताओं , विशेष रूप से नए जी 1 कलेक्टर के कॉन्फ़िगरेशन पर कोई अच्छा संसाधन नहीं मिल सकता है ।

मेरे सवाल:

  1. क्या G1 जावा 7 में डिफ़ॉल्ट कलेक्टर है और अगर मैं G1 को कैसे सक्रिय नहीं कर सकता?
  2. Java7 में g1 की क्या वैकल्पिक सेटिंग्स हैं?
  3. क्या जावा 7 में cms या समानांतर कलेक्टर जैसे अन्य कलेक्टरों में कोई बदलाव हुआ है ?
  4. मुझे जावा 7 में कचरा संग्रहण पर अच्छे दस्तावेज कहां मिल सकते हैं?

6
G1 गारबेज कलेक्टर के साथ आरंभ करना सर्वोत्तम प्रथाओं के साथ एक अच्छा अवलोकन भी देता है।
जॉन मैक्कार्थी

जवाबों:


47

जावा की मेरी स्थापना में G1 कचरा कलेक्टर डिफ़ॉल्ट नहीं है, संस्करण 1.7.0_01। आप कुछ अतिरिक्त कमांड लाइन विकल्पों का उपयोग करके अपने लिए देख सकते हैं:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)

आपको G1 कलेक्टर को चालू करने के लिए प्रयोगात्मक विकल्पों को सक्षम करने की आवश्यकता नहीं है, हालांकि:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.

मुझे नहीं पता कि आपको कोई अच्छा दस्तावेज कहां मिल सकता है।


2
यह OSX पर अभी भी 1.7.0_09 के लिए वैध है
आयु मोइज

Oracle के लिए सही नहीं है JDK 7u17 linux / amd64 पर सीधे Oracle वेबसाइट से लाया गया। यह कहता है -XX:+UseParallelGC
user1050755

31

Oracle ने अंततः Java 7 U4 में G1 को आधिकारिक बना दिया: http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

विवरण: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

कमांड लाइन विकल्प: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

फिर भी, मुझे नहीं लगता कि यह जावा 7 में डिफ़ॉल्ट कलेक्टर है। सर्वरों के लिए डिफ़ॉल्ट 6 जावा में समानांतर कलेक्टर है।


1
और सर्वर को 2 कोर और 2 जीबी रैम या अधिक से परिभाषित किया गया है। विवरण hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/0d82bf449a61/src के माध्यम से प्राप्त किया जा सकता है - फ़ाइलों को देखें। /। os.cpp
user1050755

22

हां, G1 जावा 1.7 JVM में नया मानक कचरा संग्राहक है।

यहां आप नए कचरा संग्रहकर्ता का उपयोग और कॉन्फ़िगर करने के तरीके के बारे में बहुत सारी जानकारी पा सकते हैं:

G1 G1 का उपयोग करना अभी भी प्रयोगात्मक माना जाता है और इसे निम्नलिखित दो मापदंडों के साथ सक्षम किया जा सकता है:

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

GC पॉज़ टाइम लक्ष्य सेट करने के लिए, निम्न पैरामीटर का उपयोग करें:

-XX: MaxGCPauseMillis = 50 (50ms के ठहराव समय लक्ष्य के लिए)

जी 1 के साथ, एक समय अंतराल निर्दिष्ट किया जा सकता है, जिसके दौरान एक जीसी ठहराव ऊपर दिए गए समय से अधिक नहीं होना चाहिए:

-XX: GCPauseIntervalMillis = 200 (200ms के ठहराव अंतराल लक्ष्य के लिए)

ध्यान दें कि उपरोक्त दो विकल्प लक्ष्यों का प्रतिनिधित्व करते हैं, वादों या गारंटीओं का नहीं। वे कुछ परिस्थितियों में अच्छा काम कर सकते हैं लेकिन दूसरों में नहीं, और जीसी हमेशा उन्हें मानने में सक्षम नहीं हो सकते हैं।

वैकल्पिक रूप से, युवा पीढ़ी का आकार स्पष्ट रूप से निकासी ठहराव समय को प्रभावित करने के लिए निर्दिष्ट किया जा सकता है:

-XX: + G1YoungGenSize = 512m (512 मेगाबाइट युवा पीढ़ी के लिए)

जी 1 भी उत्तरजीवी रिक्त स्थान के बराबर का उपयोग करता है, जो स्वाभाविक रूप से, (संभावित गैर-संक्रामक) क्षेत्रों का एक सेट है। उनका आकार सामान्य मापदंडों (जैसे, -XX: उत्तरजीवी अनुपात = 6) के साथ निर्दिष्ट किया जा सकता है।

अंत में, G1 को अपनी पूरी क्षमता पर चलाने के लिए, इन दो मापदंडों को सेट करने का प्रयास करें जो वर्तमान में डिफ़ॉल्ट रूप से अक्षम हैं क्योंकि वे एक दुर्लभ दौड़ की स्थिति को उजागर कर सकते हैं:

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRSetScanningEnabled

एक और बात ध्यान देने योग्य है कि जब -XX: + PrintGCDetails सेट किया जाता है, तो G1 अन्य हॉटस्पॉट GCs की तुलना में बहुत क्रियात्मक होता है। ऐसा इसलिए है क्योंकि यह प्रति-जीसी-थ्रेड टाइमिंग और अन्य जानकारी को प्रोफाइलिंग और परेशानी-शूटिंग में बहुत मददगार साबित करता है। यदि आप अधिक संक्षिप्त GC लॉग चाहते हैं, तो कृपया -verbosegc का उपयोग करके स्विच करें (हालांकि यह अनुशंसा की जाती है कि अधिक विस्तृत GC लॉग प्राप्त किया जाए)।

मैंने यह भी पाया है यह लेख को G1 के iners को समझने में बहुत मददगार ।

और भी जानकारी यहाँ


6
मैंने इन संसाधनों को देखा है। लेकिन पहला लेख JDK 6 में G1 के बारे में है जब यह अभी भी एक प्रायोगिक विकल्प था। अन्य लेख जेडीके 7 के बीटा रिलीज़ और कम से कम 1 वर्ष पुराने हैं। मैं ओरेकल या जेडीके टीम से अद्यतित जानकारी या आधिकारिक दस्तावेज की तलाश कर रहा हूं।
फ्लोरकेल

13

1. क्या G1 जावा 7 में डिफ़ॉल्ट कलेक्टर है (...)

इस जावा 5 पेज पर नियम अभी भी जावा 7 (और AFAIK, जावा 8) में लागू है:

पर सर्वर स्तरीय एक समानांतर कलेक्टर को (-XX: + UseParallelGC): सर्वर वीएम चल मशीनों, कचरा कलेक्टर (जीसी) पिछले धारावाहिक कलेक्टर (+ UseSerialGC -XX) से बदल गया है।

लेकिन यह भी विचार करें:

  • 64-बिट JVM एक के साथ नहीं आते हैं -client वीएम के हैं, इसलिए हमेशा "सर्वर क्लास" होते हैं
  • जावा 7 के बाद से, -XX: + UseParallelGC (चाहे सेट या निहित हो) इसके अतिरिक्त निहित हैं -XX: + UseParallelOldGC (अर्थात जब तक कि स्पष्ट रूप से अक्षम न हो)

उदाहरण के लिए, यदि Windows x64 पर आप चलाते हैं ...

  • जावा 7 64-बिट, आपको डिफ़ॉल्ट रूप से समानांतर जीसी (युवा और पुरानी दोनों पीढ़ियों के लिए) मिलता है।
  • जावा 8 32-बिट, आपको डिफ़ॉल्ट रूप से सीरियल जीसी (दोनों पीढ़ियों के लिए) मिलता है

1. () मैं G1 को कैसे सक्रिय करूं?

जावा 7 के रूप में, बस -XX:+UseG1GC। शायद ब्याज की भी है जब आप चाहते हैं:

यदि आवेदन में निम्नलिखित में से एक या अधिक लक्षण हैं तो CMS या ParallelOld कचरा संग्रहकर्ता के साथ चल रहे एप्लिकेशन को G1 पर स्विच करने में लाभ होगा।

  • 50% से अधिक जावा हीप लाइव डेटा के साथ व्याप्त है।
  • ऑब्जेक्ट एलोकेशन रेट या प्रमोशन की दर में काफी अंतर होता है।
  • अघोषित लंबा कचरा संग्रह या संघनन रुका हुआ (0.5 से 1 सेकंड से अधिक)

2. जावा 7 में g1 की क्या वैकल्पिक सेटिंग है?

मैंने खुद जी 1 का उपयोग नहीं किया है, लेकिन मैं इकट्ठा करता हूं कि यह उसी मूल "थ्रूपुट / एर्गोनोमिक" झंडे का पालन करता है जिसका उपयोग अन्य समानांतर कलेक्टरों को ट्यून करने के लिए किया जाता है। समानांतर जीसी के साथ मेरे अनुभव -XX:GCTimeRatioमें, अपेक्षित गति-मेमोरी ट्रेडऑफ़ प्रदान करने में महत्वपूर्ण रही है। YMMV।

G1- विशिष्ट विकल्प यहां सूचीबद्ध हैं

3. जावा 7 में (...) सेमी या समांतर कलेक्टर में परिवर्तन होते हैं?

पता नहीं, लेकिन ...

G1 को समवर्ती मार्क-स्वीप कलेक्टर (CMS) के दीर्घकालिक प्रतिस्थापन के रूप में योजनाबद्ध किया गया है

4. मुझे जावा 7 में कचरा संग्रहण के लिए अच्छे दस्तावेज कहां मिल सकते हैं?

यह खोजने के लिए दर्द हो सकता है, है ना? संभवतः सबसे अच्छा "हब" पृष्ठ जो मैंने पाया है वह यह है:

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

कुछ गहरी पढ़ने की आवश्यकता है, लेकिन समय के लायक अगर आपको कुछ ट्यूनिंग करने की आवश्यकता है। विशेष रूप से व्यावहारिक है: कचरा कलेक्टर एर्गोनॉमिक्स


13
  1. क्या G1 जावा 7 में डिफ़ॉल्ट कलेक्टर है और अगर मैं G1 को कैसे सक्रिय नहीं कर सकता?

G1 जावा 7 में डिफ़ॉल्ट कलेक्टर नहीं है। -XX:+UseG1GCG1GC को सक्षम करेगा

  1. Java7 में g1 की क्या वैकल्पिक सेटिंग्स हैं?

वहां कई हैं। पूरी जानकारी के लिए इस अलंकृत लेख को देखें।

G1 GC चूक के साथ एक अनुकूली कचरा संग्रहकर्ता है जो इसे संशोधन के बिना कुशलता से काम करने में सक्षम बनाता है।

इस कारण के कारण, महत्वपूर्ण मापदंडों को अनुकूलित करें

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

और डिफ़ॉल्ट मान के लिए अन्य सभी मापदंडों को छोड़ दें

यहां महत्वपूर्ण विकल्पों और उनके डिफ़ॉल्ट मूल्यों की एक सूची दी गई है। यह सूची नवीनतम जावा हॉटस्पॉट वीएम पर लागू होती है, 24 का निर्माण करती है। आप जेवीएम कमांड लाइन पर जी 1 जीसी सेटिंग्स को अनुकूलित और ट्यून कर सकते हैं।

महत्वपूर्ण कमी:

-XX:G1HeapRegionSize=n

G1 क्षेत्र का आकार सेट करता है। मान दो की शक्ति होगी और 1MB से 32MB तक हो सकती है। लक्ष्य न्यूनतम जावा हीप आकार के आधार पर लगभग 2048 क्षेत्रों का होना है।

-XX:MaxGCPauseMillis=200

वांछित अधिकतम ठहराव समय के लिए एक लक्ष्य मान सेट करता है। डिफ़ॉल्ट मान 200 मिलीसेकंड है। निर्दिष्ट मान आपके ढेर आकार के अनुकूल नहीं है।

-XX:G1NewSizePercent=5

युवा पीढ़ी के आकार के लिए न्यूनतम के रूप में उपयोग करने के लिए ढेर का प्रतिशत निर्धारित करता है। डिफ़ॉल्ट मान आपके जावा हीप का 5 प्रतिशत है।

-XX:G1MaxNewSizePercent=60

युवा पीढ़ी के आकार के लिए अधिकतम के रूप में उपयोग करने के लिए ढेर आकार का प्रतिशत निर्धारित करता है। डिफ़ॉल्ट मूल्य आपके जावा ढेर का 60 प्रतिशत है।

-XX:ParallelGCThreads=n

STW कार्यकर्ता थ्रेड्स का मान सेट करता है। तार्किक प्रोसेसर की संख्या के लिए n का मान सेट करता है। N का मान 8 के मान तक तार्किक प्रोसेसर की संख्या के समान है।

यदि आठ से अधिक तार्किक प्रोसेसर हैं, तो तार्किक प्रोसेसर के लगभग 5/8 के एन सेट करें। यह बड़े स्पार्क सिस्टम को छोड़कर ज्यादातर मामलों में काम करता है जहां n का मान तार्किक प्रोसेसर का लगभग 5/16 हो सकता है।

-XX:ConcGCThreads=n

समानांतर अंकन धागे की संख्या निर्धारित करता है। समानांतर कचरा संग्रह थ्रेड्स (ParallelGCThreads) की संख्या के लगभग 1/4 भाग के लिए n सेट करता है।

-XX:InitiatingHeapOccupancyPercent=45

जावा हीप अधिभोग दहलीज सेट करता है जो एक अंकन चक्र को ट्रिगर करता है। डिफ़ॉल्ट अधिभोग पूरे जावा हीप का 45 प्रतिशत है।

-XX:G1MixedGCLiveThresholdPercent=65

पुराने क्षेत्र के लिए एक मिश्रित कचरा संग्रह चक्र में शामिल होने के लिए अधिभोग सीमा निर्धारित करता है। डिफ़ॉल्ट अधिभोग 65 प्रतिशत है

-XX:G1HeapWastePercent=10

ढेर का प्रतिशत निर्धारित करता है जिसे आप बर्बाद करने के लिए तैयार हैं। जावा हॉटस्पॉट वीएम मिश्रित कचरा संग्रहण चक्र की शुरुआत नहीं करता है जब पुनर्प्राप्त करने योग्य प्रतिशत ढेर कचरे के प्रतिशत से कम होता है

-XX:G1MixedGCCountTarget=8

अधिकांश G1MixedGCLIveThresholdPercent लाइव डेटा के साथ पुराने क्षेत्रों को इकट्ठा करने के लिए एक अंकन चक्र के बाद मिश्रित कचरा संग्रह की लक्ष्य संख्या निर्धारित करता है। डिफ़ॉल्ट 8 मिश्रित कचरा संग्रह है

-XX:G1OldCSetRegionThresholdPercent=10

मिश्रित कचरा संग्रह चक्र के दौरान एकत्र किए जाने वाले पुराने क्षेत्रों की संख्या पर एक ऊपरी सीमा निर्धारित करता है। डिफ़ॉल्ट जावा हीप का 10 प्रतिशत है

-XX:G1ReservePercent=10

स्थान की अधिकता के जोखिम को कम करने के लिए मुक्त रखने के लिए आरक्षित मेमोरी का प्रतिशत निर्धारित करता है। डिफ़ॉल्ट 10 प्रतिशत है। जब आप प्रतिशत बढ़ाते या घटाते हैं, तो कुल जावा हीप को उसी राशि से समायोजित करना सुनिश्चित करें।

आपने कई G1GC मापदंडों को फिर से कॉन्फ़िगर किया है, जो कि आवश्यक नहीं हैं यदि आप प्रलेखन पृष्ठ से ऊपर हैं। कृपया विशेष रूप से Par समानांतर GCThreads और ConcGCThreads पर उपरोक्त सिफारिशों के साथ क्रॉस चेक करें , जो आपके CPU कोर पर आधारित हैं। गैर-आवश्यक मापदंडों का पुनः कॉन्फ़िगरेशन निकालें।

सिफारिशोंओरेकल से :

जब आप G1 GC का मूल्यांकन करते हैं, तो निम्न अनुशंसाओं को ध्यान में रखें:

  1. युवा पीढ़ी का आकार : -Xmnविकल्प या किसी अन्य संबंधित विकल्प जैसे कि स्पष्ट रूप से युवा पीढ़ी का आकार निर्धारित करने से बचें -XX:NewRatioयुवा पीढ़ी के आकार को ठीक करने से लक्ष्य ठहराव-समय लक्ष्य ओवरराइड होता है

  2. ठहराव समय लक्ष्य: जब आप किसी भी कचरा संग्रह का मूल्यांकन या धुन करते हैं, तो हमेशा एक विलंबता बनाम थ्रूपुट व्यापार बंद होता है। G1 GC यूनिफ़ॉर्म पॉज़ के साथ एक वृद्धिशील कचरा संग्रहकर्ता है, लेकिन एप्लिकेशन थ्रेड्स पर अधिक ओवरहेड भी है। G1 GC के लिए थ्रूपुट लक्ष्य 90 प्रतिशत आवेदन समय और 10 प्रतिशत कचरा संग्रह समय है

  1. क्या जावा 7 में cms या समानांतर कलेक्टर जैसे अन्य कलेक्टरों में कोई बदलाव हुआ है?

जावा 7 के साथ कुछ बदलाव हैं। इस लेख पर एक नज़र डालें

  1. मुझे जावा 7 में कचरा संग्रहण पर अच्छे दस्तावेज कहां मिल सकते हैं?

Gc और संबंधित SE प्रश्न के बारे में ओरेकल प्रलेखन पृष्ठ देखें :

उत्पादन में जावा जी 1 कचरा संग्रह


3

कोई G1 डिफ़ॉल्ट कचरा संग्राहक नहीं है jdk 1.7.0_02 में। डिफ़ॉल्ट कचरा कलेक्टर मशीन के वर्ग पर निर्भर करता है। यदि मशीन सर्वर वर्ग की है तो डिफ़ॉल्ट कचरा संग्राहक थ्रूपुट कलेक्टर है। यदि मशीन क्लाइंट क्लास की है तो डिफॉल्ट कचरा कलेक्टर सीरियल कलेक्टर है।


1
मैं कहता हूं कि यह पूरी तरह से सही है। जावा 5 संदर्भ , अभी भी मान्य है। एक विंडोज सिस्टम (32/64) पर: जावा 32-बिट (5..8) >> सीरियल जीसी को डिफ़ॉल्ट रूप से चलाएं। डिफ़ॉल्ट रूप से जावा 64-बिट (5..6) >> ParallelGC (केवल युवा जीन) चलाएं। डिफ़ॉल्ट रूप से जावा 64-बिट (7..8) >> ParallelOldGC (समानांतर यंग और ओल्ड) चलाएं। जावा 7 परिवर्तन का संदर्भ , अंत में 'समानांतर' कलेक्टर == 'थ्रूपुट' कलेक्टर "
ल्यूक उशारवुड

3
(इस व्यक्ति की पहली, और सटीक, एसओ योगदान के लिए एक कठोर प्रतिक्रिया। मैं ध्यान दें कि यह उनका आखिरी भी है।)
ल्यूक उशेरवुड

2

पर उपलब्ध दस्तावेज Http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html (Wojtek द्वारा प्रदान किया गया लिंक) जानकारी के साथ एकमात्र आधिकारिक लिंक लगता है लेकिन जानकारी पुराना प्रतीत होता है क्योंकि उल्लिखित कुछ झंडे केवल टेस्ट बिल्ड में उपलब्ध थे, वे अब उत्पादन रिलीज में मौजूद नहीं हैं। ओरेकल के कुछ लोगों को जी 1 जीसी पर कुछ अद्यतन दस्तावेज प्रदान करने चाहिए।


0

डिफ़ॉल्ट रूप से आप वास्तव में G1 कलेक्टर का उपयोग नहीं करना चाहते हैं, क्योंकि यह वास्तव में दूसरों की तुलना में बेहतर नहीं है। यह केवल विशेष उद्देश्यों के लिए अच्छा है।

कम विलंबता में आवेदन सीएमएस की तुलना में थोड़ा बेहतर होता है, क्योंकि इसमें थोड़ा कम, और अधिक पूर्वानुमानित ठहराव समय होता है। बदले में थ्रूपुट विनिमय में सीएमएस की तुलना में बहुत खराब है।

तो यह केवल अच्छा है यदि विलंबता महत्वपूर्ण है, लेकिन थ्रूपुट बिल्कुल भी महत्वपूर्ण नहीं है। यदि दोनों महत्वपूर्ण हैं, तो सीएमएस के साथ रहें।

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