8

ProGuardホームページは機能としてリストされています:

  • Java 6の既存のクラスファイルを再ターゲットおよび事前検証して、Java6のより高速なクラスロードを最大限に活用します。

これが指すJava6の違いは何ですか?

それは重要ですか?

デフォルトのクラスローダーの同期された側面を介したマルチスレッド化によって引き起こされる速度低下に影響を与えますか?

4

3 に答える 3

2

このJava6ホワイトペーパーによると、改善点は次のとおりです。

Java仮想マシンのブートおよび拡張クラスローダーが拡張され、Javaアプリケーションのコールドスタート時間が改善されました。Java SE 6より前は、システムjarファイルを開くと、Java仮想マシンが1メガバイトのZIPインデックスファイルを読み取り、ファイルがディスクキャッシュにない場合に、多くのディスクシークアクティビティに変換されていました。「クラスデータ共有」を有効にすると、Java仮想マシンに「メタインデックス」ファイル(jre / libにあります)が提供されます。このファイルには、どのパッケージ(またはパッケージプレフィックス)がどのjarファイルに含まれているかに関する高レベルの情報が含まれています。 。

これにより、JVMは、Javaアプリケーションクラスがロードされたときに、ブートクラスと拡張クラスのパスにあるすべてのjarファイルを開かないようにすることができます。

システムjarのクラスはすでにロードされているため、この特定の改善は実行中のプログラムに影響を与えることはありません。これは、アプリケーションの最初の起動時間にのみ影響します。

于 2012-05-23T17:37:59.803 に答える
2

ProGuard FAQのヒントとして:

Java 6コンパイラは、事前検証情報をクラスファイルに追加します

タイプチェックによるJava仮想マシン仕様の 検証セクションを見る:

Java仮想マシンの実装がバージョン50.0クラスファイルで型推論による検証を実行しようとする場合、型チェックによる検証が失敗するすべての場合に実行する必要があります。

つまり、Java仮想マシンの実装では、ある場合には型推論に頼ることができ、別の場合には型推論に頼ることができません。タイプチェックで検証されないクラスファイルを拒否するか、タイプチェックが失敗するたびに型推論ベリファイアに一貫してフェイルオーバーする必要があります。

タイプチェッカーには、Code属性を持つ各メソッドのスタックマップフレームのリストが必要です。タイプチェッカーは、そのような各メソッドのスタックマップフレームを読み取り、これらのマップを使用して、Code属性の命令のタイプセーフティの証明を生成します。

Java 6以降、クラスファイル50.0以降では、JVMはクラスファイルの検証中に型チェックまたは型推論を使用する場合があります。パフォーマンスの利点を理解しようとする前に、型チェックと型推論とは何ですか?この論文、オブジェクト指向プログラミング言語の型チェックと型推論は次のように述べています。

型システムはプログラミング言語の重要な部分です。実行時型チェックに完全に依存する言語は、高度な柔軟性を提供しますが、通常、そのためにはパフォーマンスを犠牲にする必要があります。

そして型推論に関するウィキペディアから:

型推論は、コンパイル時に式の型を部分的または完全に自動的に推測する機能です。[...]

式の型を推測するために必要な情報を取得するために、コンパイラはこの情報を、その部分式に与えられた型注釈の集約とその後の縮小として収集するか、さまざまなアトミック値の型を暗黙的に理解することによって収集します[..。 ]。

OpenJDKHotSportランタイムの概要はそれをうまく説明しています:

現在、バイトコードを分析して、各命令に存在するオペランドのタイプと数を決定する方法は2つあります。従来の方法は「型推論」と呼ばれ、各バイトコードの抽象解釈を実行し、分岐ターゲットまたは例外ハンドルで型状態をマージすることによって動作します。分析は、タイプの定常状態が見つかるまでバイトコードを繰り返します。定常状態が見つからない場合、または結果の型がバイトコード制約に違反している場合は、VerifyErrorがスローされます。[...]

JDK6の新機能は、「タイプ検証」と呼ばれる2番目の検証方法です。このメソッドでは、Javaコンパイラは、コード属性StackMapTableを介して、各ブランチまたは例外ターゲットの定常状態の型情報を提供します。StackMapTableは、いくつかのスタックマップフレームで構成されています。各フレームは、式スタックおよびメソッドのオフセットにあるローカル変数の項目のタイプを示します。次に、JVMは、バイトコードを検証するためにタイプの正確さを検証するために、バイトコードを1回通過するだけで済みます。[...]

型チェックとは、JVMがクラスファイルを1回通過して、型システムを検証できることを意味します。型推論には複数のパスが必要です。これはパフォーマンスの大幅な節約ですか?これはおそらく、アプリケーションにあるクラスの総数と、50.0(Java 6)未満および50.0以上のクラスファイルの数に関連しています。アプリケーションがパフォーマンスクリティカルなアプリケーションでない場合、私はそれについて心配しません。もしそうなら、アプリケーションをJava5およびJava6クラスファイルにコンパイルするときのパフォーマンスの違いを比較するいくつかのベンチマークを実行できます。

于 2012-05-24T13:22:45.000 に答える
1

(私自身の質問に答える)

ProGuardサイトのこの「事前検証とは何ですか? 」セクションでほとんどの答えを見つけました。

クラスファイルをロードするとき、クラスローダーはバイトコードの高度な検証を実行します。この分析により、コードが誤ってまたは意図的に仮想マシンのサンドボックスから抜け出さないようにすることができます。[...]Java6では分割検証が導入されました。StackMapTable[...] Java 6コンパイラは、クラスローダーの実際の検証手順を簡素化するために、事前検証情報([...]属性)をクラスファイルに追加します。これにより、クラスファイルをより高速にメモリ効率の高い方法でロードできます。

これは並行性には関連していないようです。

したがって、残りの1つの質問は、「それは重要ですか?」です。これは、主に「いいえ」と答えられます。

1.6VMで実行されている「-target1.5」で生成されたJavaクラスファイルのパフォーマンスへの影響は?

于 2012-05-23T19:46:47.117 に答える