問題タブ [escape-analysis]
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 でのエスケープ解析
私の知る限り、JVM はロックの粗大化やロック省略などのパフォーマンスの最適化にエスケープ分析を使用します。エスケープ分析を使用して特定のオブジェクトをスタックに割り当てることができると JVM が判断できる可能性があるかどうかに興味があります。
いくつかのリソースは、私が正しいと思わせるものです。実際にそれを行うJVMはありますか?
java - JVM でエスケープ解析を有効にした経験
jdk6-u18 VM (solaris 上) で-XX:+DoEscapeAnalysis
オプションを有効にしてみましたが、かなり残念な結果でした。私はかなり多くのアクター (20,000 人) を持つ scala アプリケーションを実行しています。ガベージ作成のレシピです!
通常、アプリは 256Mb のヒープで実行できますが、大量のガベージが生成されます。定常状態では:
- GC に 10% の時間を費やす
- 30 秒未満で 150Mb を超えるガベージが生成され、その後 GC が実行されます
エスケープ分析が役立つかもしれないと思ったので、オプションを有効にしてアプリを再実行しました。アプリが収集したガベージをますます消去できなくなり、最終的に GC の実行にすべての時間を費やすようになり、アプリが完全な割り当てで「フラットライン」になることがわかりました。
OutOfMemoryError
この時点で、アプリは期待していた をスローしなかったと言わざるを得ません。おそらくJConsole
(分析を実行するために使用していた)このオプションをオンにすると、GC統計が正しく表示されないのでしょうか(確信が持てません)?
その後、オプションを削除して再起動すると、アプリは再び「通常」になりました! 何が起こっているのか誰にも分かりますか?
java - エスケープ分析を備えた静的Javaバイトコードオプティマイザー(プロガードなど)?
エスケープ分析に基づく最適化は、Proguard で計画されている機能です。それまでの間、エスケープ解析を必要とする最適化を既に行っている、proguard のような既存のツールはありますか?
c# - .NETCLRVMでのエスケープ分析
CLRコンパイラ/JITによって実行されるエスケープ分析はありますか?たとえば、Javaでは、ループをエスケープしないループに割り当てられたオブジェクトのループ変数が、ヒープではなくスタックに割り当てられるように見えます( Javaでのエスケープ分析を参照)。
foo
明確にするために、以下の例では、コンパイラはループをエスケープしないため、のヒープ割り当てを最適化しますか。
java - Java 7 でのエスケープ解析 / スタック割り当ての適格性
どのオブジェクトがスタック割り当てに適しているかをよりよく理解するために、Java 7 でエスケープ分析を使用していくつかのテストを行っています。
スタック割り当てをテストするために書いたコードは次のとおりです。
そして、これがLinux上のJava 7で出力されるものです
オブジェクトがスタックに割り当てられたかどうかを知るために GC ログを使用しています ( Java での Escape 分析からのアイデア)。
出力に基づいて、スタック割り当てはtest1、test3、test4、およびtest6で機能し、test2およびtest5では機能しません。機能するのに for ループのイテレータでこれが機能しない理由がわかりません
- for ループの外側の反復子 (test4 を参照)、
- for ループ内で別のオブジェクトを使用する (test6 を参照)。
ArrayList イテレータのコードを読みましたが、現在のメソッドも現在のスレッドもエスケープしないため、テスト 2 と 5 でスタック割り当ての対象にならない理由がわかりません。
何か案が?
android - android dalvik vmはエスケープ分析の最適化を使用していますか?
dalvikでのエスケープ分析について何かアイデアはありますか?または、いつ、いつ追加する予定ですか?
エスケープ分析は、メソッドが呼び出されるたびにオブジェクトが発生しないようにするためのGC言語の非常に重要な機能であると考えています。現在、クラス内のオブジェクトを事前に割り当て、メソッドの先頭でリセットするため、割り当てを避けています(私は書いています) android用の3Dゲーム...java)ですが、このメソッドは醜く、事前に割り当てられたオブジェクトでメモリを占有し続けます。
java - Java7エスケープ分析が機能していません
以下のコードでは、GCアクティビティがたくさん見られます。私の理解によると、これはEAに適したシナリオです。EAが効果的でない理由。DummyObjectには何も割り当てられていません。使用されるJVMオプション:-server、-verbosegc。
c - C 変数の CLANG/LLVM エスケープ解析
clangを使ってエスケープ解析をしたいと思っています。私のコードが行うことは、C コードを解析し、すべての変数ステートメントを抽出することなどです。ローカル変数がエスケープされているかどうかを確認する簡単な方法はありますか? それとも、すべて手作業で行う必要がありますか?
java - 次の配列がJavaのスタックではなくヒープに配置されるのはなぜですか
私は最近、オブジェクトをスタックまたはヒープに置くことができ、どこに置かれるかはエスケープ解析によって決定されることを学びました。( 64 要素の複数の配列を宣言すると、65 要素の配列を宣言するよりも 1000 倍速くなります)
次の例では、オブジェクト「test」がヒープに配置されているため、ランタイムが大幅に長くなっていると思います。
while ループが削除された場合、または「test[0] = 10;」ステートメントでは、オブジェクト test がスタックに配置されます (これは、ガベージ コレクターがこの場合呼び出されないという事実から導き出されましたが、両方が存在する場合です。また、実行時間は 6803 ミリ秒ではなく 350 ミリ秒です)。
私の質問は、while ループの後にオブジェクトのコンテンツを変更/アクセスすると、オブジェクト テストがヒープに配置される理由です。