2013-01-15 14 views
7

मेरे पास जावा एप्लिकेशन है, जो विशिष्ट स्मृति उपयोग के साथ कुछ काम करता है। मैंने देखा, कि जब मैं युवा पीढ़ी के लिए लगभग 80% हीप सेटअप के साथ आवेदन शुरू करता हूं, तो मेरे अनुप्रयोग डिफ़ॉल्ट 1: 2 सेटिंग्स के साथ बहुत तेज काम करते हैं। विशेष रूप से, मैं साथ JVM की शुरूआत कर रहा हूँ:जावा ढेर का बड़ा नया आकार लंबे समय के लिए प्रक्रिया को अनियंत्रित बनाता है

java -XX:NewSize=10G -XX:+UseParallelOldGC -server -Xmx12G -Xms12G

सर्वर मुक्त भौतिक स्मृति की कम से कम 14 जीबी है, तो यह काफी मुझे लगता है कि होना चाहिए, जावा ढेर और 'अन्य' अंतरिक्ष के लिए।

अब चीजें इस तरह होती हैं:

25.289: [GC [PSYoungGen: 7872317K->1058813K(9175040K)] 7872533K->1059029K(11272192K), 0.1876420 secs] [Times: user=1.92 sys=1.01, real=0.18 secs] 
28.918: [GC [PSYoungGen: 8923133K->1091124K(9175040K)] 8923349K->1091340K(11272192K), 0.2206940 secs] [Times: user=1.92 sys=1.70, real=0.22 secs] 
32.946: [GC [PSYoungGen: 8955444K->1060567K(9175040K)] 8955660K->1060783K(11272192K), 0.1804050 secs] [Times: user=2.86 sys=0.01, real=0.18 secs] 
37.166: [GC [PSYoungGen: 8924887K->1080085K(8329344K)] 8925103K->1080301K(10426496K), 0.1891370 secs] [Times: user=3.08 sys=0.01, real=0.19 secs] 
41.326: [GC [PSYoungGen: 8098709K->1088209K(8106880K)] 8098925K->1088425K(10204032K), 0.2284920 secs] [Times: user=3.49 sys=0.04, real=0.23 secs] 
45.779: [GC [PSYoungGen: 8106833K->59784K(8672768K)] 8107049K->1039790K(10769920K), 0.2195770 secs] [Times: user=2.02 sys=1.91, real=0.22 secs] 
49.963: [GC [PSYoungGen: 6953352K->75043K(8689664K)] 7933358K->1062837K(10786816K), 0.0384440 secs] [Times: user=0.63 sys=0.01, real=0.04 secs] 
54.171: [GC [PSYoungGen: 6968611K->140387K(8737984K)] 7956405K->1129497K(10835136K), 0.0715690 secs] [Times: user=1.12 sys=0.00, real=0.07 secs] 
58.455: [GC [PSYoungGen: 7093923K->194024K(8701312K)] 8083033K->1205300K(10798464K), 0.0952730 secs] [Times: user=1.66 sys=0.02, real=0.10 secs] 
62.825: [GC [PSYoungGen: 7147560K->122912K(8840256K)] 8158836K->1298466K(10937408K), 0.1671770 secs] [Times: user=2.89 sys=0.10, real=0.16 secs] 
67.302: [GC [PSYoungGen: 7270304K->117888K(8792896K)] 8445858K->1377169K(10890048K), 0.1156200 secs] [Times: user=1.98 sys=0.05, real=0.12 secs] 
71.785: [GC [PSYoungGen: 7265280K->119002K(8950720K)] 8524561K->1464556K(11047872K), 0.1152940 secs] [Times: user=1.97 sys=0.09, real=0.11 secs] 
76.448: [GC [PSYoungGen: 7477018K->206455K(8893056K)] 8822572K->1642652K(10990208K), 0.1607870 secs] [Times: user=2.63 sys=0.06, real=0.16 secs] 
81.051: [GC [PSYoungGen: 7564471K->114350K(9084608K)] 9000668K->1649307K(11181760K), 0.1145730 secs] [Times: user=1.89 sys=0.16, real=0.12 secs] 
86.020: [GC [PSYoungGen: 7739630K->125895K(9026432K)] 9274587K->1743248K(11123584K), 0.1125030 secs] [Times: user=1.95 sys=0.06, real=0.11 secs] 
91.007: [GC [PSYoungGen: 7751175K->202320K(9221952K)] 9368528K->1905769K(11319104K), 0.1523180 secs] [Times: user=2.58 sys=0.06, real=0.15 secs] 
95.817: [GC [PSYoungGen: 8085136K->327488K(9146624K)] 9788585K->2203753K(11243776K), 0.2542190 secs] [Times: user=4.44 sys=0.10, real=0.25 secs] 
96.071: [Full GC [PSYoungGen: 327488K->0K(9146624K)] [ParOldGen: 1876265K->1032314K(2097152K)] 2203753K->1032314K(11243776K) [PSPermGen: 27528K->21277K(48128K)], 1.4351920 secs] [Times: user=5.12 sys=0.36, real=1.44 secs] 

जैसा कि आप देख, सब कुछ ठीक है और पूर्ण जीसी ठीक काम करता है। लेकिन अगली बार जीसी (पूर्ण नहीं) प्रक्रिया नाटकीय रूप से प्रक्रिया के स्मृति उपयोग को बढ़ाता है, और सर्वर स्वैप का उपयोग शुरू कर रहा है।

102.741: [GC-- [PSYoungGen: 7882816K->7882816K(9146624K)] 8915130K->9979962K(11243776K), 133.4433280 secs] [Times: user=69.73 sys=602.83, real=133.46 secs] 
236.191: [Full GC [PSYoungGen: 7882816K->0K(9146624K)] [ParOldGen: 2097146K->1069237K(2097152K)] 9979962K->1069237K(11243776K) [PSPermGen: 21277K->21251K(48192K)], 6.9285350 secs] [Times: user=12.75 sys=0.23, real=6.93 secs] 

सवाल यह है - क्यों? जहां तक ​​मैं समझता हूं, पूर्ण जीसी जीसी प्रसंस्करण में सबसे दर्दनाक बिंदु है। फिर पूर्ण जीसी सफलतापूर्वक पूरा होने के बाद एप्लिकेशन क्यों बंद हो जाता है?

उत्तर

2

बहुत उच्च सिस्टम समय (उपयोगकर्ता समय से काफी अधिक) को देखते हुए यह सुझाव देता है कि ओएस में कुछ चल रहा है। आप कहते हैं कि आपके पास बहुत मेमोरी है, लेकिन यदि JVM का एक छोटा सा हिस्सा डिस्क पर बदल जाता है, तो यह जीसी टाइम्स को मार सकता है।

मुझे सलाह है कि को ढेर के कुल आकार को कम करने के लिए यह सुनिश्चित करने के लिए कि आपके पास ओएस/डिस्क कैश/अन्य प्रोग्राम के लिए अधिक निःशुल्क मेमोरी है।

अपने आवेदन को बेहतर बनाने के लिए मैं एक मेमोरी प्रोफाइलर का उपयोग करूंगा (सबसे अधिक संभावना है कि आपको एक वाणिज्यिक, एक eval लाइसेंस करना होगा) आप 1.5 जीबी प्रति सेकंड कचरा उत्पन्न कर रहे हैं जो अविश्वसनीय राशि है। यदि आप प्रति सेकंड कुछ 100 एमबी में कटौती कर सकते हैं तो इसे आपके प्रदर्शन में काफी सुधार करना चाहिए (साथ ही साथ देरी को कम करना)

बीटीडब्ल्यू: -server किसी भी 64-बिट मशीन पर डिफ़ॉल्ट होना चाहिए।

2

मैंने कई वर्षों तक एक आवेदन के साथ काम किया है जिसके लिए एक हीप आकार और मेमोरी मंथन की आवश्यकता है (20 जीबी हीप, 1 जीबी +/दूसरा मंथन)। जैसा कि @ पीटर लॉरी ने कहा, यदि आप या तो कुल मेमोरी खपत या मंथन को कम कर सकते हैं, तो आप आगे आ जाएंगे (एफवाईआई - मुझे आपकेकिट प्रोफाइलर के साथ शुभकामनाएं मिली हैं। कंपनी के साथ कोई सहयोग नहीं है, लेकिन मेरे अनुभव में अच्छा रहा। वाईएमएमवी।)

लेकिन, यदि आप वास्तव में ढेर के उपयोग या मंथन को कम नहीं कर सकते हैं, तो मैं आपको कुछ और जीसी ट्यूनिंग पर विचार करने की सलाह दूंगा। आपने स्पष्ट रूप से कुछ किया है; यहाँ कुछ चीजें हैं जो हमारे लिए काम किया है इस प्रकार हैं:

  • नई पीढ़ी आकार कम करें (वर्तमान में आप 10 जीबी का आवंटन कर रहे हैं, और यह लगभग सभी हर कुछ सेकंड का संग्रह आप 1-2 आवंटित करने के लिए बेहतर कर सकता है। । जीबी से अधिक बार इकट्ठा यह आपको कुल ढेर आकार के साथ-साथ कम करने के लिए अनुमति होगी, और शायद अदला-बदली से बचने

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -। कभी कभी यह जीसी लॉग में वास्तविक दिनांक)

-XX:+UseConcMarkSweepGC होना अच्छा रहेगा जो - समवर्ती पुरानी जीन जीसी अधिक सीपीयू का उपभोग करती है, लेकिन कम विराम प्रदान करती है। हमारे आवेदन के लिए, यह हमारी वरीयता है, और ऐसा लगता है कि यह शायद आपका भी है।

आप अपने हार्डवेयर के लिए उचित कुछ -XX:ParallelGCThreads=<threads> भी सेट कर सकते हैं (हम 12-कोर मशीनों पर 6 का उपयोग कर रहे हैं, लेकिन मुझे नहीं पता कि हमने इसे बेहतर तरीके से ट्यून किया है)।

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