19

最近、デバッグ情報の一部/すべてなしでコンパイルする Java ライブラリ (JDK、joda time、iText) がいくつかあることに気付きました。ローカル変数情報が欠落しているか、ローカル変数情報と行番号の両方が欠落しています。

これには何か理由がありますか?コンパイルされたコードが大きくなることはわかっていますが、それが特に大きな考慮事項であるとは思いません。それとも、デフォルトのコンパイル オプションでビルドしているだけですか?

ありがとう。

4

2 に答える 2

35

デフォルトのコンパイル オプションにはデバッグ情報が含まれていないため、コンパイラにデバッグ情報を含めるように明示的に指示する必要があります。ほとんどの人がそれを省略する理由はいくつかあります。

  • 一部のライブラリは組み込みシステム (携帯電話など) で使用されます。最近まで、すべてのビットがカウントされていました。今日、ほとんどの携帯電話には、1985 年のすべてのコンピューターを合わせたよりも多くのメモリが搭載されています ;)
  • デバッグをアクティブにしてコンパイルすると、コードの実行速度が 5% 遅くなります。それほど多くはありませんが、場合によってはすべてのサイクルが重要になります。
  • 今日の上級開発者は、64KB の RAM が膨大な時代に生まれました。昨日、地下室のサーバーに別の 2 TB ドライブを追加しました。これは 25 年間で 7 桁です。人間は適応するのにより多くの時間を必要とします。

[編集] John が指摘したように、Java バイトコードは今日では (あまり) 最適化されていません。そのため、クラス ファイルの出力はどちらの場合も同じになります (デバッグ情報を含むクラス ファイルのみが大きくなります)。コードは実行時に JIT で最適化され、実行時に CPU、メモリ (量とレイアウト) などのコードを最適化できます。

前述の 5% のペナルティは、コードを実行し、コマンド ライン オプションを追加して、リモート デバッガーがプロセスにアタッチできるようにする場合です。リモート デバッグを有効にしない場合、ペナルティはありません (クラスの読み込みを除きますが、それは 1 回だけです)。

于 2009-12-09T09:00:37.313 に答える
0

おそらくインストールのサイズ。デバッグ情報は、Sunがおそらく気に入らなかったjarファイルにオーバーヘッドを追加します。

最近、Java Web Startの問題を調査する必要がありました(デバッグ情報はありません)。そのため、Javaコンソールに完全なトレースを追加してソースコードをダウンロードすることは役に立ちましたが、コードがかなり絡み合っているため、デバッグビルドが必要です。

JDKは、あらゆる場所で完全なデバッグ情報を使用してコンパイルする必要があります。

于 2009-12-09T17:12:36.787 に答える