2016-02-03 9 views
13

मैंने सुना है किक्या जावा 9 में स्टार्टअप टाइम रिग्रेशन है?

    प्रत्येक प्रमुख रिलीज के साथ
  1. JVM तेजी से हो जाता है (कुछ मायनों में)
  2. 9 की
  3. प्रतिरूपकता तेजी से स्टार्टअप समय लाएगा।

मैवेन बिल्ड को तेज करने के प्रयास में, मैंने jdk9-ea डाउनलोड किया है और यह पता लगाया है कि इसमें और भी समय लगता है। इसके अलावा, ऐसा लगता है कि मेवेन शुरू होने से पहले एक लंबी देरी है।

मैं करने के लिए कोशिश की है मोटे तौर पर उपयोग करते हुए मापने JVM स्टार्टअप समय कोड निम्नलिखित

public class Sampler { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     long t = System.currentTimeMillis(); 
     if (args.length == 0 || args[0].startsWith("-")) { 
      sample(30, args); 
     } else { 
      long t0 = Long.parseLong(args[0]); 
      System.out.println(t - t0); 
     } 
    } 

    static void sample(int n, String[] options) throws IOException, InterruptedException { 
     File samples = new File("samples.txt"); 
     for (int i = 0; i < n; i++) { 
      String javaPath = String.join(
        System.getProperty("file.separator"), 
        System.getProperty("java.home"), 
        "bin", 
        "java"); 

      List<String> command = new ArrayList<String>(); 
      command.add(javaPath); 
      command.addAll(Arrays.asList(options)); 
      command.add("Sampler"); 
      command.add(Long.toString(System.currentTimeMillis())); 

      ProcessBuilder processBuilder = new ProcessBuilder(command) 
        .inheritIO() 
        .redirectOutput(ProcessBuilder.Redirect.appendTo(samples)); 

      Process process = processBuilder.start(); 
      process.waitFor(); 
     } 
     prettyPrint(samples); 
     samples.delete(); 
    } 
    ... 
} 

और यह दो बार के रूप में लंबे समय लेता है जावा 9

 
>java -version 
java version "1.8.0_74" 
Java(TM) SE Runtime Environment (build 1.8.0_74-b02) 
Java HotSpot(TM) Client VM (build 25.74-b02, mixed mode, sharing) 

>javac Sampler.java && java Sampler 
n=30 units=milisec min=124 max=205 mean=143 median=132 


>java -version 
java version "9-ea" 
Java(TM) SE Runtime Environment (build 9-ea+111) 
Java HotSpot(TM) Client VM (build 9-ea+111, mixed mode) 

>javac Sampler.java && java Sampler 
n=30 units=milisec min=279 max=387 mean=301 median=294 

>javac Sampler.java && java Sampler -XX:+UseParallelGC 
n=30 units=milisec min=279 max=382 mean=297 median=292 


>java -version 
java version "1.8.0_76-ea" 
Java(TM) SE Runtime Environment (build 1.8.0_76-ea-b04) 
Java HotSpot(TM) Client VM (build 25.76-b04, mixed mode, sharing) 

>javac Sampler.java && java Sampler 
n=30 units=milisec min=123 max=227 mean=159 median=141 

>java Sampler -XX:+UseG1GC 
n=99 units=milisec min=188 max=340 mean=213 median=199 

नोट के साथ शुरू करने के लिए: मूल रूप से मैं का उपयोग किया है सर्वर वीएम (x64), एक ही 2x अंतराल, जावा 9 स्टार्टअप समय लगभग 0.6sec था।


बाद java -Xshare:dump

 
>java -version 
java version "9-ea" 
Java(TM) SE Runtime Environment (build 9-ea+111) 
Java HotSpot(TM) Client VM (build 9-ea+111, mixed mode, sharing) 

>javac Sampler.java && java Sampler 
n=50 units=milisec min=228 max=422 mean=269 median=269 

>javac Sampler.java && java Sampler -Xshare:on 
<error messages> 
n=44 units=milisec min=227 max=392 mean=247 median=238 

>javac Sampler.java && java Sampler -Xshare:off 
n=50 units=milisec min=280 max=513 mean=315 median=288 

>javac Sampler.java && java Sampler -Xshare:auto 
n=50 units=milisec min=228 max=361 mean=283 median=285 
जावा 8 ईए के साथ

 
>java -Xshare:off Sampler 
n=99 units=milisec min=124 max=264 mean=150 median=136 

त्रुटि संदेश: 50 से बाहर

 
An error has occurred while processing the shared archive file. 
Unable to map ReadOnly shared space at required address. 
Error occurred during initialization of VM 
Unable to use shared archive. 

44 सफल शुरू होता है उच्चतम संख्या है बियर मैं मिल सकता था। सबसे कम था - 13.

+4

क्या आप वास्तव में वीएम स्टार्टअप समय, अपने मेवेन बिल्ड समय या जेवीएम गति पर केंद्रित हैं? आप इन सभी शर्तों का उपयोग करना प्रतीत करते हैं जैसे वे समान हैं, लेकिन वे नहीं हैं। – eis

+2

मैं स्टार्टअप समय पर ध्यान केंद्रित कर रहा हूं क्योंकि शीर्षक का तात्पर्य है। अन्य 'नियम' का उपयोग बराबर के रूप में नहीं किया जाना चाहिए, लेकिन निश्चित रूप से एक दूसरे से संबंधित है। मेवेन एक प्रसिद्ध कार्यक्रम का उदाहरण है जहां समग्र निष्पादन समय में स्टार्टअप समय का महत्वपूर्ण हिस्सा होता है। मेरी समझ स्टार्टअप _is_ में वीएम प्रदर्शन (गति) और एमवीएन बिल्ड की एक महत्वपूर्ण विशेषता कार्रवाई में वीएम प्रदर्शन है।निश्चित नहीं है कि यह मूल रूप से लेकिन यहां पर उदास की तुलना में अधिक स्पष्ट है। – user2418306

+2

मेवेन निश्चित रूप से जावा 9 में दिमाग में अभी तक लिखा नहीं है। जेवीएम गति आमतौर पर निष्पादन गति को संदर्भित करती है - सर्वर/क्लाइंट मोड के आधार पर आप वास्तव में चुन सकते हैं कि क्या आप स्टार्टअप समय या जेवीएम गति, और किस प्रकार की मेमोरी विशेषताओं पर जोर देना चाहते हैं। – eis

उत्तर

9

हां, वर्तमान ईए बिल्डों में निश्चित रूप से कुछ स्टार्टअप रिग्रेशन हैं - कुछ कारण ज्ञात हैं और सक्रिय रूप से काम करते हैं - दूसरों को "हजारों कटौती से मौत" की परीक्षा होती है: विकास के दौरान संचित छोटी, महत्वहीन अक्षमताएं जेडीके 9 के रूप में सुविधाओं को कार्यान्वित और एकीकृत किया जाता है, जिसे वास्तविक रिलीज से पहले ठीक-ठीक और अनुकूलित किया जाना चाहिए।

मैं यह भी ध्यान दूंगा कि आपका 8/8-ए रन रन क्लास डेटा साझाकरण सक्षम है, लेकिन आपका 9-ए इंस्टॉल इंस्टॉल नहीं है (-वर्जन आउटपुट में "साझाकरण" की कमी को ध्यान में रखें)। यदि आप जावा-एक्सशेयर चलाते हैं तो आपको 9-एए पर बेहतर संख्या मिल सकती है: डिफ़ॉल्ट सीडीएस संग्रह उत्पन्न करने के लिए डंप करें, अधिक जानकारी के लिए https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html देखें।

संपादित करें: मुझे अभी एहसास हुआ है कि 9 बिल्डों में डिफ़ॉल्ट रूप से साझाकरण बंद कर दिया गया है, इसलिए आपको साझा करने में सक्षम करने के लिए 9-एए में ऑटो-एक्सएयर भी जोड़ना होगा।

+0

क्या आप अपने उत्तर में * ज्ञात कारणों * की सूची जोड़ना चाहते हैं? – user2418306

+0

लिंक किए गए मार्गदर्शिका में कहा गया है कि * कक्षा डेटा साझाकरण केवल धारावाहिक कचरा कलेक्टर * के साथ समर्थित है। क्या आप उस पर भी टिप्पणी कर सकते हैं? – user2418306

+1

आरा स्वयं वर्तमान में स्टार्टअप के दौरान कुछ सेटअप कार्य जोड़ता है, लेकिन स्टार्टअप अनुकूलन कहीं और सक्षम बनाता है, उदाहरण के लिए, [जेडीके -8152641] (https://bugs.openjdk.java.net/browse/JDK-8152641)। 9 + 108 ने बहु-रिलीज जेएआर से संबंधित एक रिग्रेशन का कारण बना दिया जो इसे 9 + 113 में बनाना चाहिए, [जेडीके -8152733] (https://bugs.openjdk.java.net/browse/JDK-8152733) देखें। –

3

ऐसा लगता है कि जी-कचरा कलेक्टर, जो जावा -9 पर डिफ़ॉल्ट है, महत्वपूर्ण स्टार्टअप देरी का कारण बनता है। उसी कचरा कलेक्टर से जांचने के लिए जावा -8 पर जावा-9 या -XX:+UseG1GC पर -XX:+UseParallelGC आज़माएं।

+0

आप कैसे समझा सकते हैं कि 'समानांतर जीसी' जावा 9 को बेहतर प्रदर्शन नहीं करता है? – user2418306

+1

जी 1 के स्टार्टअप प्रदर्शन को जावा 9 में 8 की तुलना में काफी सुधार किया गया है (जहां यह अक्सर स्टार्टअप समय को दोगुना कर सकता है)। यह अभी भी '-XX: + UseParallelGC' की तुलना में एक मापनीय लागत है, लेकिन यह हमारे द्वारा मापने वाले अधिकांश हार्डवेयर पर शोर या लगभग 10ms है। –

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