2015-10-02 9 views
5

मैं सार्वजनिक रूप से दिए गए Java 8 व्याकरण के साथ ANTLR V4 उपयोग करने के लिए कोशिश कर रहा हूँ - https://github.com/antlr/grammars-v4/blob/master/java8/Java8.g4ANTLR V4 + Java8 व्याकरण -> OutOfMemoryException

मैं वर्ग फ़ाइलों उत्पन्न और Java 8 JRE पार्स करने के लिए कोशिश की, लेकिन java.text.SimpleDateFormat.java पर किसी भी तरह इसके साथ दुर्घटनाओं :

java.lang.OutOfMemoryError: GC overhead limit exceeded 

यह भी दुर्घटनाओं, जब मैं अकेला कि एकल फाइल पार्स करने का प्रयास कर रहा हूँ।

क्या इसे किसी भी तरह हल किया जा सकता है? जाहिर है ANTLR V42000 LOC से अधिक फ़ाइलों को संभाल नहीं सकता है? क्या यह एक सही धारणा है?

क्या मैं अब तक क्या किया है: JVM करने के लिए कई चरणों में 256MB से ऊपर 4GB को

  • सौंपा स्मृति बदलने - यह तो

    में परिवर्तन java.lang.OutOfMemoryError: जावा हीप स्पेस

  • यह सुनिश्चित करने के लिए कि इनपुट-फ़ाइल
    के साथ कोई वाक्य रचनात्मक समस्या नहीं है, पहले I हटाया फ़ाइल की पहली छमाही ->पार्स लगता है ठीक,
    तो उस कार्रवाई undid और फ़ाइल की दूसरी छमाही से हटाया ->पार्स ठीक लग रहा है

+3

... और आपने जावा मेमोरी आकार जैसे बढ़ाया '-Xmx' का उपयोग कर? – Petesh

+0

हाय, पेटेश! मैंने पहले ऐसा किया है - मैंने अपना प्रश्न अपडेट कर दिया है ... Thx! –

+0

समस्याग्रस्त कोड खोजने के लिए क्रमशः टिप्पणी करें। –

उत्तर

8

ऐसा लग रहा है उस भंडार में व्याकरण एक लिखा है जिस पर मैंने लिखा था। व्याकरण कुछ कार्यक्षमता पर निर्भर करता है जो अच्छी तरह से प्रदर्शन करने के लिए केवल मेरे "optimized" fork of ANTLR 4 में उपलब्ध है। कि रिहाई उपयोग करने के अलावा, आप प्रदर्शन को अधिकतम करने के लिए निम्न दो काम करने की आवश्यकता होगी:

  1. दो चरणों पार्स रणनीति का प्रयोग करें।

    CompilationUnitContext compilationUnit; 
    try { 
        // Stage 1: High-speed parsing for correct documents 
    
        parser.setErrorHandler(new BailErrorStrategy()); 
        parser.getInterpreter().setPredictionMode(PredictionMode.SLL); 
        parser.getInterpreter().tail_call_preserves_sll = false; 
        compilationUnit = parser.compilationUnit(); 
    } catch (ParseCancellationException e) { 
        // Stage 2: High-accuracy fallback parsing for complex and/or erroneous documents 
    
        // TODO: reset your input stream 
        parser.setErrorHandler(new DefaultErrorStrategy()); 
        parser.getInterpreter().setPredictionMode(PredictionMode.LL); 
        parser.getInterpreter().tail_call_preserves_sll = false; 
        parser.getInterpreter().enable_global_context_dfa = true; 
        compilationUnit = parser.compilationUnit(); 
    } 
    
  2. सक्षम वैश्विक संदर्भ DFA (मैं पिछले कोड ब्लॉक में शामिल किया है ताकि आप इसे मिस नहीं कर सकते)

    parser.getInterpreter().enable_global_context_dfa = true; 
    
  3. : अपने प्रारंभ नियम मानते हुए compilationUnit कहा जाता है, यह ऐसा दिखाई दे सकता
+0

हाय, सैम! आपके उत्तर के लिए धन्यवाद - यह पूरी तरह से नाखून को हिट करता है :) –

+0

हाय @ सैमहर्ववेल, मेरे पास एक फ़ाइल भी है जो ऊपर जीसी मेमोरी बकाया का कारण बनती है। क्या कोई मौका है कि इस फिक्स के लिए कार्यक्षमता इसे मुख्य एंटर वितरण में लाएगी? या आप अपने कांटा के लिए एक .jar वितरित करेंगे? (जैसा कि मैं जावा दुनिया का मूल नहीं हूं। मेरे पास आपके कांटे का निर्माण करने के लिए टूलसेट नहीं हैं।) – t0rst

+0

@ user138304 यह "अनुकूलित" कांटा एएनटीएलआर 4.6 में एकीकृत है? – t0rst

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