一歩一歩最適化JVM 7:その他
4531 ワード
エッジ問題
一部のシーンでは、前のステップで最適化アドバイザを実行しても効果は得られません.この節では、これらの状況を説明します.
いくつかのアプリケーションでは、非常に大きな長時間生存オブジェクトが少量割り当てられています.このようなシーンでは、old世代よりもyoung世代の空間が必要です.
一部のアプリケーションでは、オブジェクトの移行が少ない場合があります.このようなシーンでは、oldの使用量の増加率が小さいため、old世代の空間が生存オブジェクトのサイズよりはるかに大きい必要がある場合があります.
一部のアプリケーションでは、CMSゴミ回収器を使用する小さな遅延要件があります.また、MinorGCの時間が短くなるような小さなyoung世代空間と、大きなold世代空間を使用します.この構成では、オブジェクトはyoung世代からold世代に素早く移動し、効率的に老朽化したオブジェクトの代わりになります.また、CMSゴミは移動後のオブジェクトを回収し、破片の可能性は大きなold世代空間によって解決されます.
次のセクションでは、アプリケーションのパフォーマンスを向上させるための他のHotSpot VMオプションについて説明します.
その他のパフォーマンスコマンドラインオプション
Javaアプリケーションの遅延およびスループットパフォーマンスを向上させるには、いくつかのオプションの前述のコマンド・オプションを使用します.これらのオプションは、JITコンパイラ・コード最適化および他のHotSpot VM最適化機能です.これらのプロパティと、対応するコマンドオプションについて説明します.
最新および最大最適化
新しいパフォーマンス最適化がHotSpot VMに統合されると、-XX:+AggressiveOptsオプションで有効になります.
オプションによって新しい最適化を導入することで、最新および最大の最適化と長時間の使用によって安定した最適化が分離されることを証明することができる.アプリケーションは通常、最新の最適化が未知の問題を引き起こす可能性があるため、より良い安定性を得ることが望ましい.ただし、アプリケーションがパフォーマンスの最適化を向上させる必要がある場合は、コマンドオプションを使用して最適化を有効にできます.
新しい最適化が安定していることが証明されると、デフォルトで使用されます.デフォルトになるには、いくつかのバージョンをアップグレードする必要があるかもしれません.
-X:+AggressiveOptsコマンドオプションを使用する場合は、パフォーマンスの向上を考慮する必要があります.また、パフォーマンスの向上に伴う不安定なリスクも考慮する必要があります.
ぶんせきを逃れる
逃避分析はJavaオブジェクトの範囲を分析する技術であり、特殊な場合、1つのスレッドに割り当てられたオブジェクトが別のスレッドで使用される可能性があり、このオブジェクトを「逃避」と呼ぶ.オブジェクトが逃げていない場合、追加の最適化技術を適用することができるので、この最適化技術を逃げ分析と呼ぶ.
HotSpot VMでの回避分析の最適化には、コマンドラインオプションを使用します.
これはJava 6 update 14に導入され、-XX:+AggressiveOptsを介して自動的に有効になります.Java 6 update 23ではデフォルトでオンになっています.
回避分析により、HotSpot VM JITコンパイラは、以下の最適化技術を適用することができる.
1、オブジェクト爆発:オブジェクト爆発はオブジェクトの属性がJavaスタック以外に格納され、潜在的に消える可能性がある.たとえば、オブジェクトプロパティは、スタックではなくメモリのレジスタに直接配置したり、オブジェクトが割り当てられたスタックに配置したりすることができます.
等級別置換:等級別置換はメモリの使用を減らすための最適化技術であり、次のJavaクラスを考慮して、長方形の長さと幅を保存するように表現されます.
public class Rectangle {
int length;
int width;
}
HotSpot VMは、メモリ割り当てを最適化し、逃避しないRectangleクラスを使用する例は、Rectangleオブジェクトを割り当てるのではなく、長さと幅の両方をCPUのレジスタに直接格納することによって、その結果、長さと幅のプロパティを使用する必要があった場合に、CPUのレジスタにコピーする必要はありません.これはメモリの読み取りを減らすことができます.
2、スレッドスタック割り当て:名前の通り、スレッドスタック割り当てはJavaスタックの中の最適化技術ではなく、オブジェクトをスレッドスタックに割り当てる技術である.1つのオブジェクトは、他のスレッドがこのオブジェクトを見る必要がないため、スレッドスタックフレームワークに配置されます.スレッドスタック割り当ては,オブジェクトのJavaスタックへの割り当てを低減し,GCの周波数を低減することができる.
3、同期の消滅:スレッドに割り当てられたオブジェクトが逃げられず、このスレッドがこのオブジェクトをロックした場合、このロックはJITコンパイラによって消滅する可能性があります.他のスレッドがこのオブジェクトを使用することはありません.
4、ゴミ回収読み書き障害をなくす:スレッドに割り当てられたオブジェクトが逃げず、現在のスレッドにのみ使用されるため、他のオブジェクトに格納されるアドレスに障害は必要ありません.読み取り障害または書き込み障害は、オブジェクトが他のスレッドに使用される場合にのみ必要です.
偏見のある錠
偏見のあるロックは、ロックが前回使用したスレッドをより好むようにすることです.競合しないロックのシーンでは、1つのスレッドだけがオブジェクトをロックし、ロックなしに近いオーバーヘッドを実現できます.
偏見のあるロックは、Java 5 update 6で導入されています.HotSpot VMのコマンドオプション-XX:+UseBiasedLockingで有効にします.
Java 5 HotSpot JDKでは、この機能を有効にするための明確なコマンドが必要です.-XX:+AggressiveOptsオプションを使用すると、偏見のあるロックがJava 5で自動的に有効になります.Java 6ではデフォルトで有効になっています.
この特性は多くの応用に非常に有用であることを様々な経験から教えてくれた.次に、このプロパティを使用すると必ずしもうまく表現できないアプリケーションがあります.例えば、ロックは通常、前回使用した同じスレッドでは使用されません.Javaアプリケーションでは、stop-the-worldセキュリティポイントの操作に偏見を解消する必要があるため、-XX:-UseBiaseLockingを使用することでメリットを得ることができます.アプリケーションがどのような状況なのか分からない場合は、この2つのオプションを別々に設定することでテストできます.
大きなページ
コンピュータシステムでは、メモリは固定サイズのブロックに分けられ、このブロックはページと呼ばれています(page).メモリへのアクセスはプログラムによって仮想メモリアドレスを物理メモリアドレスに変換することによって実現される.仮想から物理アドレスは1つのブロックテーブルにマッピングされる.メモリへのアクセスのたびにページテーブルを使用する消費を減らすために、通常は高速の仮想から物理アドレスへの変換のキャッシュが使用される.このキャッシュを変換バックアップバッファと呼ぶ(translation lookaside buffer)、TLBと略称する.
仮想から物理アドレスへのマッピング要求をTLBで満たすと、ページテーブルを巡回するよりもマッピング関係が速くなり、1つのTLBには通常、指定された数のエントリが含まれます.1つのTLBエントリは、ページサイズに基づいて物理アドレスへの仮想マッピングであるため、より大きなページサイズは、1つのエントリまたは1つのTLBがより大きなメモリアドレス範囲を持つことを可能にする.TLBにはより広範なアドレスがあり、より少ないアドレス変換要求がTLBでヒットしなければ、ページテーブルを巡る操作を減らすことができる.大きなページを使う目的はTLBのヒットを減らすことです.
Oracle solariz、Linux、Windowsでは、HotSpot VMの大きなページの使用がサポートされています.通常、プロセッサはいくつかのページサイズをサポートできますが、プロセッサによって異なります.また、OS構成には大きなページが必要です.
Linuxの下で大きなページを使う方法についてお話しします(Large Page)
Linuxの下の大きなページ
本書を作成する際には、Linuxの下に大きなページを使用し、-XX:+UseLargePagesコマンドオプションを使用するほか、OS構成を変更する必要があります.Linuxの修正操作は、リリースバージョンやカーネルと関係があります.Linuxの下の大きなページを合理的に有効にするには、Linux管理者の意見を聞いたり、Linux発行ドキュメントを読んだりすることができます.Linuxオペレーティングシステムの構成が変更されたら、-XX:+UseLargePageコマンドラインオプションを使用する必要があります.例:
大きなページが適切に設定されていない場合、HotSpot VMは-XX:+UseLargePagesを受け入れることができますが、大きなページを取得できないと報告され、オペレーティングシステムのデフォルトのページサイズが返されます.
PS:仕事が终わって、実は翻訳はとてもつまらなくてとても疲れます
私のウェブサイト:ロバを追います
一部のシーンでは、前のステップで最適化アドバイザを実行しても効果は得られません.この節では、これらの状況を説明します.
いくつかのアプリケーションでは、非常に大きな長時間生存オブジェクトが少量割り当てられています.このようなシーンでは、old世代よりもyoung世代の空間が必要です.
一部のアプリケーションでは、オブジェクトの移行が少ない場合があります.このようなシーンでは、oldの使用量の増加率が小さいため、old世代の空間が生存オブジェクトのサイズよりはるかに大きい必要がある場合があります.
一部のアプリケーションでは、CMSゴミ回収器を使用する小さな遅延要件があります.また、MinorGCの時間が短くなるような小さなyoung世代空間と、大きなold世代空間を使用します.この構成では、オブジェクトはyoung世代からold世代に素早く移動し、効率的に老朽化したオブジェクトの代わりになります.また、CMSゴミは移動後のオブジェクトを回収し、破片の可能性は大きなold世代空間によって解決されます.
次のセクションでは、アプリケーションのパフォーマンスを向上させるための他のHotSpot VMオプションについて説明します.
その他のパフォーマンスコマンドラインオプション
Javaアプリケーションの遅延およびスループットパフォーマンスを向上させるには、いくつかのオプションの前述のコマンド・オプションを使用します.これらのオプションは、JITコンパイラ・コード最適化および他のHotSpot VM最適化機能です.これらのプロパティと、対応するコマンドオプションについて説明します.
最新および最大最適化
新しいパフォーマンス最適化がHotSpot VMに統合されると、-XX:+AggressiveOptsオプションで有効になります.
オプションによって新しい最適化を導入することで、最新および最大の最適化と長時間の使用によって安定した最適化が分離されることを証明することができる.アプリケーションは通常、最新の最適化が未知の問題を引き起こす可能性があるため、より良い安定性を得ることが望ましい.ただし、アプリケーションがパフォーマンスの最適化を向上させる必要がある場合は、コマンドオプションを使用して最適化を有効にできます.
新しい最適化が安定していることが証明されると、デフォルトで使用されます.デフォルトになるには、いくつかのバージョンをアップグレードする必要があるかもしれません.
-X:+AggressiveOptsコマンドオプションを使用する場合は、パフォーマンスの向上を考慮する必要があります.また、パフォーマンスの向上に伴う不安定なリスクも考慮する必要があります.
ぶんせきを逃れる
逃避分析はJavaオブジェクトの範囲を分析する技術であり、特殊な場合、1つのスレッドに割り当てられたオブジェクトが別のスレッドで使用される可能性があり、このオブジェクトを「逃避」と呼ぶ.オブジェクトが逃げていない場合、追加の最適化技術を適用することができるので、この最適化技術を逃げ分析と呼ぶ.
HotSpot VMでの回避分析の最適化には、コマンドラインオプションを使用します.
-XX:+DoEscapeAnalysis
これはJava 6 update 14に導入され、-XX:+AggressiveOptsを介して自動的に有効になります.Java 6 update 23ではデフォルトでオンになっています.
回避分析により、HotSpot VM JITコンパイラは、以下の最適化技術を適用することができる.
1、オブジェクト爆発:オブジェクト爆発はオブジェクトの属性がJavaスタック以外に格納され、潜在的に消える可能性がある.たとえば、オブジェクトプロパティは、スタックではなくメモリのレジスタに直接配置したり、オブジェクトが割り当てられたスタックに配置したりすることができます.
等級別置換:等級別置換はメモリの使用を減らすための最適化技術であり、次のJavaクラスを考慮して、長方形の長さと幅を保存するように表現されます.
public class Rectangle {
int length;
int width;
}
HotSpot VMは、メモリ割り当てを最適化し、逃避しないRectangleクラスを使用する例は、Rectangleオブジェクトを割り当てるのではなく、長さと幅の両方をCPUのレジスタに直接格納することによって、その結果、長さと幅のプロパティを使用する必要があった場合に、CPUのレジスタにコピーする必要はありません.これはメモリの読み取りを減らすことができます.
2、スレッドスタック割り当て:名前の通り、スレッドスタック割り当てはJavaスタックの中の最適化技術ではなく、オブジェクトをスレッドスタックに割り当てる技術である.1つのオブジェクトは、他のスレッドがこのオブジェクトを見る必要がないため、スレッドスタックフレームワークに配置されます.スレッドスタック割り当ては,オブジェクトのJavaスタックへの割り当てを低減し,GCの周波数を低減することができる.
3、同期の消滅:スレッドに割り当てられたオブジェクトが逃げられず、このスレッドがこのオブジェクトをロックした場合、このロックはJITコンパイラによって消滅する可能性があります.他のスレッドがこのオブジェクトを使用することはありません.
4、ゴミ回収読み書き障害をなくす:スレッドに割り当てられたオブジェクトが逃げず、現在のスレッドにのみ使用されるため、他のオブジェクトに格納されるアドレスに障害は必要ありません.読み取り障害または書き込み障害は、オブジェクトが他のスレッドに使用される場合にのみ必要です.
偏見のある錠
偏見のあるロックは、ロックが前回使用したスレッドをより好むようにすることです.競合しないロックのシーンでは、1つのスレッドだけがオブジェクトをロックし、ロックなしに近いオーバーヘッドを実現できます.
偏見のあるロックは、Java 5 update 6で導入されています.HotSpot VMのコマンドオプション-XX:+UseBiasedLockingで有効にします.
Java 5 HotSpot JDKでは、この機能を有効にするための明確なコマンドが必要です.-XX:+AggressiveOptsオプションを使用すると、偏見のあるロックがJava 5で自動的に有効になります.Java 6ではデフォルトで有効になっています.
この特性は多くの応用に非常に有用であることを様々な経験から教えてくれた.次に、このプロパティを使用すると必ずしもうまく表現できないアプリケーションがあります.例えば、ロックは通常、前回使用した同じスレッドでは使用されません.Javaアプリケーションでは、stop-the-worldセキュリティポイントの操作に偏見を解消する必要があるため、-XX:-UseBiaseLockingを使用することでメリットを得ることができます.アプリケーションがどのような状況なのか分からない場合は、この2つのオプションを別々に設定することでテストできます.
大きなページ
コンピュータシステムでは、メモリは固定サイズのブロックに分けられ、このブロックはページと呼ばれています(page).メモリへのアクセスはプログラムによって仮想メモリアドレスを物理メモリアドレスに変換することによって実現される.仮想から物理アドレスは1つのブロックテーブルにマッピングされる.メモリへのアクセスのたびにページテーブルを使用する消費を減らすために、通常は高速の仮想から物理アドレスへの変換のキャッシュが使用される.このキャッシュを変換バックアップバッファと呼ぶ(translation lookaside buffer)、TLBと略称する.
仮想から物理アドレスへのマッピング要求をTLBで満たすと、ページテーブルを巡回するよりもマッピング関係が速くなり、1つのTLBには通常、指定された数のエントリが含まれます.1つのTLBエントリは、ページサイズに基づいて物理アドレスへの仮想マッピングであるため、より大きなページサイズは、1つのエントリまたは1つのTLBがより大きなメモリアドレス範囲を持つことを可能にする.TLBにはより広範なアドレスがあり、より少ないアドレス変換要求がTLBでヒットしなければ、ページテーブルを巡る操作を減らすことができる.大きなページを使う目的はTLBのヒットを減らすことです.
Oracle solariz、Linux、Windowsでは、HotSpot VMの大きなページの使用がサポートされています.通常、プロセッサはいくつかのページサイズをサポートできますが、プロセッサによって異なります.また、OS構成には大きなページが必要です.
Linuxの下で大きなページを使う方法についてお話しします(Large Page)
Linuxの下の大きなページ
本書を作成する際には、Linuxの下に大きなページを使用し、-XX:+UseLargePagesコマンドオプションを使用するほか、OS構成を変更する必要があります.Linuxの修正操作は、リリースバージョンやカーネルと関係があります.Linuxの下の大きなページを合理的に有効にするには、Linux管理者の意見を聞いたり、Linux発行ドキュメントを読んだりすることができます.Linuxオペレーティングシステムの構成が変更されたら、-XX:+UseLargePageコマンドラインオプションを使用する必要があります.例:
$ java -server -Xmx1024m -Xms1024m -Xmn256m -XX:+UseLargePages ...
大きなページが適切に設定されていない場合、HotSpot VMは-XX:+UseLargePagesを受け入れることができますが、大きなページを取得できないと報告され、オペレーティングシステムのデフォルトのページサイズが返されます.
PS:仕事が终わって、実は翻訳はとてもつまらなくてとても疲れます
私のウェブサイト:ロバを追います