2

約 55 の Java インターフェイスと 5 つの抽象クラスがあります。各宣言は、同じジェネリック パラメーターのセットを使用します。約 60 の宣言がリストされているため、各実装は他の実装の特定の型を認識し、メソッド パラメーターでこの型を置き換えて、必要に応じて返します。このジェネリックの (おそらく過剰な) 使用が、コンパイラのハングを引き起こしているようです。コンパイラは OutOfMemoryError をスローしますが、終了しているようには見えません。

私の状況を考えると、これらの宣言の 1 つでも含むコード リストは少し難しいですが、リストの一部は可能かもしれません。インターフェイス宣言では通常、約 5 つのメソッドのコレクションを指定しますが、宣言でジェネリックを使用すると、ソース モジュールのサイズが約 1,000 行に増加します。

私のケースは、コンパイラが実際に無限ループに入るケースでしょうか、それとも単にメモリを増やすべきですか? OutOfMemoryError 例外がスローされるまでに約 20 分かかるため、コンパイラに与えるメモリを倍増させると、コンパイラが例外をスローするのにその倍の時間がかかるだけではないかと懸念しています。

エディタ環境として NetBeans を使用していますが、NetBeans を起動したらすぐにクリーン/ビルド スクリプトを実行することに頼っています。これを行うのは、起動後にコードの構文をチェックし始めると、NetBeans がすぐに応答しなくなるためです。私はUbuntu 10.4を使用しています(私はWindowsからこれを書いていると思います)。私は、Ubuntu 環境でコマンド ラインを開き、NetBeans をバックグラウンド プロセスとして実行し、出力をチェックして、gedit を使用してソース コードの誤りを修正し、NetBeans を強制終了してから再起動することにしました。構文エラーが発生していないことがわかるまでは、これで十分のように見えました。コマンド ラインから clean/build スクリプトを実行する方法がわかりません。

この質問があいまいに見える場合は申し訳ありませんが、他の人が私を助けることができれば、もう少し具体的にすることができます.

考慮されたアドバイスをありがとう。

4

1 に答える 1

3

ジェネリックの使用が非常に複雑なように思えます。これにより、Java コンパイラーがジェネリック型の展開を表現しようとして大量のメモリを使用することになります。失敗するまでに非常に長い時間がかかるのは、おそらく「ガベージ コレクションの死のスパイラル」によるものです。GC は、最終的にあきらめなければならないまで、毎回より多くの時間を費やし、メモリの再利用がますます少なくなります。

コードを表示できない場合は、より大きなヒープでコンパイラを実行し、問題が解決するかどうかを確認することをお勧めします。

コマンド ラインから clean/build スクリプトを実行する方法がわかりません。

まあ、それを理解する必要があると思います。問題を解決するのに役立つかもしれませんが、とにかくこれらのことを知っておくことが重要です。たとえば、CI システムを使用してコードをビルドし、テストを実行できるようにします。(そして、IDE とは独立してサイズを制御できるヒープを持つ別の JVM でビルドを実行するには、おそらくコマンド ラインからスクリプトを実行する必要があります。)


また、ジェネリックの複雑な使用には、Java コンパイラが対処できない異常な (そしておそらく無意味な) ものが含まれている可能性もあります。

私の一般的な宣言に関する問題の原因として考えられるのは、それらが自己参照的であることです。ある宣言は、最初の宣言を参照する別の宣言を参照します。

ええ…そういう話です。注意しないと、(Java の観点から) 無意味で、無限の型展開を伴う結果になる可能性があります。

于 2013-01-02T01:01:46.450 に答える