問題タブ [jvm-hotspot]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 操作を実行するために生成されたJavaコードが、「インタープリターループ」よりも実行速度が遅いのはなぜですか。
BitSetでビット単位の演算を実行するJavaコードがいくつかあります。操作のリストがあり、ループすることで「解釈」できますが、これらの操作をできるだけ早く実行できることが重要なので、動的にコードを生成して適用しようとしています。操作を実行するJavaソースを生成し、Javassistを使用してそれらの操作を実装するクラスをコンパイルします。
残念ながら、動的に生成されたコードは、解釈されたコードよりも実行が遅くなります。これは、HotSpotが解釈されたコードを最適化しているが、コンパイルされたコードを最適化していないためと思われます。数千回実行した後、解釈されたコードは最初の2倍の速度で実行されますが、コンパイルされたコードは高速化されません。この仮説と一致して、私の解釈されたコードは最初はコンパイルされたコードよりも遅いですが、最終的には速くなります。
なぜこれが起こっているのかわかりません。私の推測では、おそらくJavassistは、HotSpotが触れないクラスのクラスローダーを使用していると思います。しかし、私はJavaでのクラスのロードに精通していないので、これが合理的な推測であるかどうか、またはそれをテストする方法がわかりません。Javassistを使用してクラスを作成およびロードする方法は次のとおりです。
誰かがここで何が起こっているのかについて考えを持っていますか?私はあなたが与えることができるどんな助けにも本当に感謝します。
WindowsXP32ビットでSun1.6サーバーJVMを使用しています。
java - 役に立たないgotoを削除するJavaバイトコードオプティマイザーはありますか?
問題:8000バイトを超えるJavaバイトコードにコンパイルするメソッドがあります。HotSpotには、8000バイトを超えるメソッドに対してJITが起動しないようにする魔法の制限があります。(はい、巨大なメソッドを持つことは合理的です。これはトークナイザーループです。)メソッドはライブラリ内にあり、ライブラリのユーザーが魔法の制限を無効にするようにHotSpotを構成する必要はありません。
観察:バイトコードを逆コンパイルすると、EclipseJavaコンパイラが多くの無意味なgotoを生成することがわかります。(javacはさらに悪いです。)つまり、ジャンプからのみ到達可能なgotoがあります。明らかに、後藤にジャンプするジャンプは、代わりに後藤がジャンプする場所に直接ジャンプする必要があり、後藤は削除する必要があります。
質問:無意味なジャンプチェーンをフラット化して不要なgotoを削除するJava 5クラスファイル用のバイトコードオプティマイザーはありますか?
編集:私は次のようなパターンを意味します:
明らかに、2番目のgotoに到達するには、8701にジャンプする必要があります。これは、0に直接ジャンプする場合もあります。
2回目の調査では、この疑わしいパターンがより一般的です。
明らかに、コンパイラーが「等しくない」比較を「等しい」比較に逆にし、8704にジャンプして、gotoを削除するようにしたい場合。
java - Java アプレットの障害
サーバーの 1 つで Java Web アプレットを実行しています。なんらかの理由で、特定のユーザーがアクセスできません (「エラー。クリックして詳細を表示」というアプレットの代わりにエラー テキストが表示されます。これはタグの間に配置したテキストではありません。つまり、彼の JRE がインストールされ、少なくとも正しくインストールする必要がありますが、何らかの理由でアプレットで動作しません。
これは、JRE の彼特有の「フレーバー」、いわゆる「HotSpot」バージョンと関係があると思います。(これを参照してください: http://www.experts-exchange.com/Programming/Languages/Java/Q_24405442.html EE アカウントをお持ちの場合は、私のものをすぐに思い出せません)。私は Java 自体やその種類にあまり詳しくありません。私はページ内のアプレットの実装者にすぎません (私が書いたわけではありません)。
このアプレットは、私だけでなく、これまでのすべてのユーザーにとって問題なく動作します。また、「 http://mywebsite.com/java/JavaVersionDisplayApplet/class.class 」などのエラーで以下にリストされているファイルを参照するべきではありません。ファイルは " http://mywebsite.com/java/JavaVersionDisplay.class " にあります。アプレット プログラマによると、彼のエラーは、コードのどこにも指定されていないファイルを指しています。
ユーザーのエラーは次のとおりです。
java - Java Class.getSimpleName()と.getName()は、CacaoとSunJavaで動作が異なります。
なぜこれが起こるのか誰かが知っていますか?
これは、Java DBusバインディング(2.6)から変更された行です。
ここで、Cacao(0.99.4)とSun1.5の出力の違いを確認してください。
対...
例外は重要ではありません-それはこの振る舞いによって引き起こされています...何かアイデアはありますか?それとも、これはCacaoの奇妙なバグですか。
.getName()がVMに依存するものかどうか誰かが知っていますか?
情報:
両方のJVMでのGNUClasspath0.98DBusバインディング2.6
java - SSEの使用と境界チェックの排除(またはその他の高度な最適化)を可能にするようにJavaをコーディングするにはどうすればよいですか?
状況:
私はLZF圧縮アルゴリズムのpure-java実装を最適化しています。これには、ハッシュと比較のための多くのbyte[]アクセスと基本的なint数学が含まれます。圧縮の目標はI/O要件を減らすことであるため、パフォーマンスは非常に重要です。コードはまだクリーンアップされておらず、大幅に再構築されている可能性があるため、コードを投稿していません。
質問:
- より高速なSSE操作を使用してフォームにJITコンパイルできるようにコードを作成するにはどうすればよいですか?
- コンパイラが配列境界チェックを簡単に排除できるように、どのように構造化できますか?
- 特定の数学演算の相対速度に関する幅広い参考資料はありますか(通常の加算/減算に等しくなるために必要な増分/減分の数、シフトの速度、または配列アクセスの速度)?
- 分岐の最適化にどのように取り組むことができますか?短い本体を持つ多数の条件ステートメント、またはいくつかの長いステートメント、またはネストされた条件を持つ短いステートメントがある方が良いですか?
- 現在の1.6JVMでは、System.arraycopyがコピーループを打ち負かす前に、いくつの要素をコピーする必要がありますか?
私がすでにしたこと:
時期尚早の最適化で攻撃される前に:基本的なアルゴリズムはすでに優れていますが、Javaの実装は同等のCの2/3未満の速度です。コピーループをSystem.arraycopyに置き換え、ループの最適化に取り組み、 -必要な操作。
私は、パフォーマンスのためにビットをいじったり、バイトをintにパックしたり、シフトやマスキングを多用しています。
法的な理由から、同様のライブラリの実装を確認することはできません。また、既存のライブラリのライセンス条項は制限が厳しすぎて使用できません。
良い(受け入れられた)答えの要件:
- 受け入れられない答え:「これはより速い」とは、その量と理由の説明がない場合、またはJITコンパイラでテストされていない場合です。
- 境界線の回答:Hotspot1.4より前では何もテストされていません
- 基本的な答え:一般的なルールと、コンパイラレベルで高速である理由と、おおよそどれだけ高速であるかについての説明を提供します
- 良い答え:デモンストレーション用のコードのサンプルをいくつか含めてください
- 優れた回答: JRE1.5と1.6の両方でベンチマークを実行する
- 完璧な答え: HotSpotコンパイラに取り組んだ人によるもので、使用する最適化の条件と、通常の速度を完全に説明または参照できます。HotSpotによって生成されたJavaコードとサンプルアセンブリコードが含まれる場合があります。
また、ホットスポットの最適化と分岐のパフォーマンスの要点を詳しく説明しているリンクがあれば、それを歓迎します。私はバイトコードについて十分に知っているので、ソースコードレベルではなくバイトコードでパフォーマンスを分析するサイトが役立つでしょう。
(編集)部分的な回答:境界-除去のチェック:
これは、次のHotSpot内部Wikiへの提供されたリンクから取得されます:https ://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
HotSpotは、次の条件ですべてのforループの境界チェックを排除します。
- 配列はループ不変です(ループ内で再割り当てされません)
- インデックス変数は一定のストライドを持ちます(可能な場合は1つのスポットでのみ一定量だけ増加/減少します)
- 配列は、変数の線形関数によってインデックスが付けられます。
例: int val = array[index*2 + 5]
また: int val = array[index+9]
いいえ: int val = array[Math.min(var,index)+7]
コードの初期バージョン:
これはサンプルバージョンです。これはH2データベースプロジェクトの未リリースバージョンのコードであるため、盗まないでください。最終バージョンはオープンソースになります。これは、ここのコードの最適化です:H2CompressLZFコード
論理的には、これは開発バージョンと同じですが、for(...)ループを使用して入力をステップスルーし、if/elseループを使用してリテラルモードと後方参照モードの間の異なるロジックを実行します。アレイへのアクセスを減らし、モード間のチェックを行います。
最終編集:
締め切りが迫っているので、これまでのところ、ベストアンサーをマークしました。私はコードを投稿することを決定する前に非常に長い時間がかかったので、私は可能な限り賛成票を投じてコメントに返信し続けます。 コードが乱雑な場合はお詫びします。これは開発中のコードであり、コミットのために洗練されたものではありません。
java - Java 難読化コードのデバッグ
プロジェクトを難読化しますが、リモート デバッグとホットスワップの機能を失いたくありません。
出来ますか?これを処理できるツールはどれですか? クラス/メソッド/変数の名前を変更するだけの単純な難読化に満足しています。
[編集済み] Intellij IDEA を使用していますが、このタスク用のプラグインが見つかりませんでした。
java - Java 条件演算子の速度と Hotspot VM のバージョン
次の Java ソースを検討してください。
ご覧のとおり、これは 3 つのバージョンのif(false)条件に対するテストです。
- さまざまな条件ステートメントで最初に結果が異なる理由に興味があります。((明らかに、コンパイラが .java をバイトコードに解釈する方法であることはわかっています。)) これ以上のことはありますか?
- 第二に。さまざまな Hotspot VM の違いを見てください。下を参照してください。これは、バージョンを超えた VM の更新/改善によるものですか? それともそれ以上のものがありますか?
- これは、このようなものをテストするための最良の方法ですか?
---結果 Mac OS X ---
JavaVM ホットスポット 1.6.0
Not Equals 演算子の Avr: 1937
Equals "false" 演算子の Avr: 1937
Not Operator の Avr: 1941
JavaVM ホットスポット 1.5.0
Not Equals 演算子の Avr: 5023
Equals "false" 演算子の Avr: 5035
Not Operator の Avr: 5067
JavaVM ホットスポット 1.4.2
Not Equals 演算子の Avr: 3993
Equals "false" 演算子の Avr: 4015
Not Operator の Avr: 4009
JavaVM ホットスポット 1.4.0
Not Equals 演算子の Avr: 3961
Equals "false" 演算子の Avr: 3960
Not Operator の Avr: 3961
ありがとう。
java - HotSpot JVMの-serverオプションの効果は何ですか?
-server
SunHotSpotJVMを起動するときにオプションを渡すことの正確な効果に関する明確なドキュメントが見つかりません。
誰かがそれが何をしているのかを要約できますか?
java - JavaVMからのスタックレッドゾーンへの無効なアクセス
私はJavaでこのエラーを引き起こす原因を解明しようとしています:
誰かがこのエラーメッセージに遭遇したことがありますか?それは文字通りJVMを殺し、すべてがそこで止まります。
私は現在このバージョンのJavaを使用しています:(OSX 10.6の場合)
私が探しているのは、これを再びヒットしないようにする方法についてのある種の説明とヒントです。
前もって感謝します!