2015-10-02 6 views
5

私は公に与えられたJava 8文法とANTLR V4 使用しようとしている - 私はクラスファイルを生成し、Java 8 JREを解析しようとしましたが、何とかjava.text.SimpleDateFormat.javaでそれがでクラッシュhttps://github.com/antlr/grammars-v4/blob/master/java8/Java8.g4ANTLR V4 + Java8文法 - >のOutOfMemoryException

を:

java.lang.OutOfMemoryError: GC overhead limit exceeded 

それもクラッシュ、私はそれだけで1つのファイルを解析しようとしているとき。

これは何とか解決できますか?明らかにANTLR V4は、2000 LOCを超えるファイルを処理できません。それは正しい仮定ですか? Javaの: - それは、その後

java.lang.OutOfMemoryErrorを変更するに

  • が4ギガバイトまでの複数のステップでJVMに割り当てられたメモリ256メガバイトからの変更:私はこれまで何をやったか

    ヒープスペース

  • 入力ファイルに構文上の問題がないようにする
    最初はI は、ファイルの前半を削除 - >解析は大丈夫ようだ、
    そのアクションを元に戻したとは、ファイルの後半を削除 - >解析はそれがどのように見える

+3

...あなたはJavaメモリサイズを増やしました。 '-Xmx'を使って? – Petesh

+0

こんにちは、ペチェ!私は前にそれをやった - 私は私の質問を更新しました... Thx! –

+0

コメントは、問題のあるコードを見つけるために部分的に分解します。 –

答えて

8

大丈夫そうですそのリポジトリの文法は私が書いたものに基づいています。文法は、私の"optimized" fork of ANTLR 4でのみ有効な特定の機能に依存しています。そのリリースを使用するだけでなく、パフォーマンスを最大化するために、次の2つのことを行う必要があります:

  1. は、二段階の解析戦略を使用してください。あなたの開始規則をcompilationUnitと呼ばれると仮定すると、それは次のようになります。

    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. グローバルコンテキストを有効に
+0

こんにちは、サム!あなたの答えをありがとう - それは完全に釘を打つ:) –

+0

こんにちは@SamHarwell、私も上のGCメモリの救済を引き起こすファイルがあります。この修正プログラムの機能が主なantlrディストリビューションになる可能性はありますか?またはあなたのフォーク用に.jarを配布したいのですか? (私はJavaの世界ではないので、あなたのフォークを構築するツールセットはありません) – t0rst

+0

@ user138304はANTLR 4.6に統合されたこの「最適化された」フォークですか? – t0rst