2009-12-09 13 views
19

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

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

ありがとうございました。

+0

多くの場合、最適化されていない/ "デバッグ可能な"バージョンのlibをダウンロードできなければなりません。また、弾丸を噛んでsrcをプルダウンすることもできます。 – Ian

答えて

34

デフォルトのコンパイルオプションにはデバッグ情報が含まれていないため、特にコンパイラにその情報を含めるように指示する必要があります。

  • 一部のライブラリは、携帯電話などの組み込みシステムで使用されています。最近まで、すべてのビットがカウントされました。現在、ほとんどの携帯電話は1985年にすべてのコンピュータより多くのメモリを搭載しています)
  • デバッグを有効にしてコンパイルすると、コードは5%遅くなります。それほど多くはありませんが、場合によってはサイクルごとにカウントされます。
  • 今日のシニアデベロッパーは、64KBのRAMが莫大な時に生まれました。昨日、私はセラーのサーバーに別の2TBドライブを追加しました。それは25年間で7桁の規模です。人間は調整に時間が必要です。

[編集]ジョン氏が指摘したように、Javaのバイトコードは現在(これ以上)最適化されていません。したがって、クラスファイルの出力は両方の場合で同じになります(デバッグ情報を持つクラスファイルのみが大きくなります)。コードは実行時にJITで最適化され、実行時にCPU、メモリ(量とレイアウト)などのコードを最適化できます。

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

+0

さらに、デバッグでコンパイルすると(静的/最終/非公開)メソッド/プロパティのパフォーマンス上の利点を失うことになります。 – Ian

+2

@iAn:Javaでは、最適化を使用してコンパイルするととにかく一般的に無意味です - IIRC彼らはオプションを削除したか、それをノーオペレーションにしました。最適化は代わりにJITによって実行されるため、パフォーマンスが低下することはありません。 –

+7

はい、今日、Javaコードは実行時に最適化されています。 5%のペナルティは、実際にリモートデバッガを接続するオプションを指定してコードを実行しているときのペナルティです。 –

0

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

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

JDKはどこでもFULLデバッグ情報でコンパイルする必要があります。

+0

FYIデバッグ情報を含むJDK6u18のDEBUG jarがあります。代替案よりも約20MBも大きい。こちらをご覧ください:http://download.java.net/jdk6/ –

関連する問題