2015-02-27 5 views
10

मैं सिर्फ जावा (ग्रोवी) एप्लिकेशन में अपने सभी धागे के लिए स्टैक आकार को नियंत्रित करना चाहता हूं। हॉटस्पॉट ओरेकल वीएम के लिए, मुझे पता है कि दो पैरामीटर ऐसा कर रहे हैं (-Xss और XX:ThreadStackSize)।-Xss और -XX: ThreadStackSize के बीच क्या अंतर है?

पसंदीदा क्या है? क्या उनके बीच कोई अंतर है? ओपन जेडीके 7 someone asked on the mailing list के बारे में बताते हुए, -Xss हॉटपॉट वीएम के लिए -XX:ThreadStackSize के समान है।

मुद्दा यह है कि मैं माप रहा हूं कि मेरे सिस्टम पर कितने धागे शुरू किए जा सकते हैं। - XX:ThreadStackSize

int count = 0 

def printCountThreads = { 
    println("XXX There were started $count threads.") 
} 

try { 
    while(true){ 
      new Thread({Thread.sleep(Integer.MAX_VALUE)}).start() 
      count++ 
      if(count % 1000 == 0){ 
        printCountThreads() 
      } 
    } 
} catch (Throwable e){ 
    printCountThreads() 
    throw e 
} 

दिलचस्प बात यह मैं सिर्फ का उपयोग कर धागे की की संख्या कम मिलती है: मेरे ग्रूवी स्क्रिप्ट जो ऐसा करता है की तरह लग रहा है। मैं पर्यावरण चर JAVA_OPTS में विभिन्न सामग्री के साथ और साथ groovy आवेदन शुरू कर रहा हूँ।

groovy countmax-threads.groovy 

जब मैं -XX:ThreadStackSize=2m को JAVA_OPTS निर्धारित करते हैं, मैं 1000 के बारे में धागे शुरू कर दिया जब तक स्मृति सेवन किया जाता है मिलता है। लेकिन, जब मैं JAVA_OPTS='-Xss2m' का उपयोग करता हूं, तो मुझे अपेक्षित त्रुटि उत्पन्न होने तक लगभग 32000 धागे मिलते हैं। तो ऐसा लगता है कि -Xss बिल्कुल काम नहीं करता है।

मैं

उपयोग कर रहा हूँ जावा संस्करण "1.8.0_05"
जावा (टीएम) एसई रनटाइम वातावरण (निर्माण 1.8.0_05-B13)
जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वी एम (25.5 निर्माण -b02, मिश्रित मोड)

औबंटू 14.04 64 बिट मशीन पर चार हार्डवेयर धागे और लगभग 8 जीबी रैम के साथ।

अद्यतन:

मैं अपने विंडोज 7 64 बिट मशीन और एक अन्य JDK पर इस पुन: सत्यापित:

जावा संस्करण "1.8.0_20" जावा (टीएम) एसई रनटाइम वातावरण (निर्माण 1.8.0_20-B26) जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वी एम (25.20-B23, मिश्रित मोड का निर्माण)

और वहाँ -Xss और -XX:ThreadStackSize काम अपेक्षा के अनुरूप (के रूप में कुछ जवाब ने बताया)। तो मुझे लगता है कि यह एक लिनक्स विशिष्ट समस्या है या जेडीके संस्करण 1.8.05 में भी एक बग है।

+0

हो सकता है कि किसी को एक अन्य वी एम के साथ अपने मशीन पर पुष्टि कर सकते हैं? मैंने स्क्रिप्ट के लिए groovy 2.3.9 का उपयोग किया ... – user2078148

+0

लिनक्स पर समान व्यवहार: जावा संस्करण "1.8.0_45" जावा (टीएम) एसई रनटाइम पर्यावरण (1.8.0_45-बी 14 बनाएँ) जावा हॉटस्पॉट (टीएम) 64- बिट सर्वर वीएम (25.45-बी 022, मिश्रित मोड का निर्माण) मुझे लिनक्स विशिष्ट जेवीएम समस्या की तरह लगता है ... – user2078148

उत्तर

3

-Xss जावा हॉटस्पॉट वीएम द्वारा मान्यता प्राप्त मानक विकल्प हैं।

-XX:ThreadStackSize अन्य -XX विकल्प स्थिर नहीं हैं और बिना किसी सूचना के बदल सकते हैं।

देखें Java HotSpot VM Options

+2

व्यवहार क्यों भिन्न है? – user2078148

+1

@ user2078148 क्या आप ओरेकल से जावा हॉटस्पॉट डाउनलोड करते हैं? लिंक जहां यह कहा गया है कि -Xss और -XX: थ्रेडस्टैक आकार बराबर हैं openjdk के बारे में है। ओपनजेड और ओरेकल हॉटस्पॉट वीएम भिन्न हो सकता है। Http://stackoverflow.com/a/11580321/1140748 देखें। तो -XX: थ्रेडस्टैक आकार जो विफल हो सकता है क्योंकि -XX विकल्प स्थिर नहीं हैं। –

+0

आपके सुझाव के लिए धन्यवाद ... लेकिन क्यों-XX: ThreadStackSize = 2m बस काम करता है और -Xss नहीं करता है? – user2078148

5

-Xss OpenJDK और Oracle JDK के लिए -XX:ThreadStackSize दोनों के लिए एक उपनाम है।

हालांकि वे अलग-अलग तर्कों का विश्लेषण करते हैं:
-Xss के, एम या जी प्रत्यय के साथ एक संख्या स्वीकार कर सकता है;
-XX:ThreadStackSize= एक पूर्णांक (प्रत्यय के बिना) की अपेक्षा करता है - किलोबाइट्स में ढेर आकार।

+0

ठीक है मुझे निर्दिष्ट करने में कोई समस्या नहीं आई है-XX: ThreadStackSize = 2m, altrough आप सही हैं, दस्तावेज़ कहते हैं कि आपने मुझे क्या बताया ... लेकिन यह सब इसे स्पष्ट नहीं करता – user2078148

2

-Xss केवल main जावा थैड पर काम करता है, लेकिन -XX:ThreadStackSize सभी जावा थ्रेड पर काम करता है।

तो -Xss (या -ss) कमांड लाइन पर पारित किए गए, यह लांचर से सीधे उठाया हो जाता है और "मुख्य" जावा धागा बनाने के लिए बाद में प्रयोग किया जाता है, के लिए वी एम बिना पूछे पसंदीदा थ्रेड स्टैक आकार। जहां असंगतता आती है: यदि -Xss -XX के बाद दिया जाता है: ThreadStackSize, तो चीजें अभी भी अच्छी हैं; अन्यथा, "मुख्य" जावा थ्रेड में एक स्टैक आकार होगा जो -Xss द्वारा निर्दिष्ट किया गया है, जहां अन्य जावा थ्रेड का स्टैक आकार अभी भी थ्रेडस्टैक आकार का पालन करेगा।

Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher

+0

उद्धृत मेलिंग सूची पोस्ट के लिए आवेदन करना प्रतीत होता है जेडीके 6 और 7. जेडीके 8 के लिए, मैं फिर से अपनी स्थानीय मशीन पर सत्यापित कर दूंगा। आप संकेत वास्तव में उपयोगी था, धन्यवाद! – user2078148

+2

क्रिस मोक द्वारा मेलिंग सूची पोस्ट का विस्तार करने के बाद, मुझे आपको सही करना होगा। -एक्सएसएस थ्रेड स्टैक आकार के लिए काम करेगा -XX: थ्रेडस्टैक आकार भी। समस्या तब उत्पन्न होती है जब आप एक ही समय में (ऑर्डर -Xss -XX: थ्रेडस्टैक आकार) दोनों का उपयोग कर रहे हैं। इस मामले में, vm केवल मुख्य थ्रेड के लिए -Xss में निर्दिष्ट मान उठाएगा और अन्य सभी उपयोगकर्ता थ्रेड के लिए -XXTreadStackSize में निर्दिष्ट मान उठाएगा। उन दो विकल्पों के बराबर होना चाहिए! दोनों को उपयोग करते समय सावधान रहना होगा (जो आमतौर पर कोई समझ नहीं लेता) – user2078148

+0

@ user2078148 हाँ, आप सही हैं ~ – lichengwu

संबंधित मुद्दे