2016-05-18 7 views
6

より良いプロファイリングデータをサポートするために、私のJVMTIエージェントがいくつかのJVMフラグを有効にしたいと思います。 問題のエージェントはHonest-Profilerで、起動時にのみロードできます。JVMTIエージェントは起動時にJVMフラグをどのように設定できますか?

私はフラグを有効にしたいと思います:

-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepointsが問題を1としてフラグがオンでない場合hereは、我々はバイアスされたプロファイルを取得し、文書化。ユーザーに警告するだけでなく、フラグを有効にすることを超えてもよいでしょう。

+2

法的な解決策が見つからない場合は、@ apanginからの厳しいアプローチがあります。https://github.com/odnoklassniki/one-elf/blob/master/test/one/jvm/HotspotFlags.java libjvm.soをロードし、.so address + .symtab定数オフセットからフラグアドレスを計算します(ただし、VMコードの具体的なフラグの使用方法によって異なります) – qwwdfsad

答えて

8

DebugNonSafepointsについては、このフラグを設定する必要はありません。 debugInfoRec.cppを見てください:

static inline bool compute_recording_non_safepoints() { 
    if (JvmtiExport::should_post_compiled_method_load() 
     && FLAG_IS_DEFAULT(DebugNonSafepoints)) { 
    // The default value of this flag is taken to be true, 
    // if JVMTI is looking at nmethod codes. 
    // We anticipate that JVMTI may wish to participate in profiling. 
    return true; 
    } 

    // If the flag is set manually, use it, whether true or false. 
    // Otherwise, if JVMTI is not in the picture, use the default setting. 
    // (This is true in debug, just for the exercise, false in product mode.) 
    return DebugNonSafepoints; 
} 

フラグが設定されていない場合はJVMTI CompiledMethodLoad通知が有効になっているとき、デバッグ情報がまだ記録されています。 can_generate_compiled_method_load_eventsの機能をリクエストして、JVMTI_EVENT_COMPILED_METHOD_LOADの通知をオンにするだけです。

これは私のasync-profilerプロジェクトでの処理方法とまったく同じです。


実行時に管理不能なJVMフラグを変更する安全な方法はありません。しかし、Linux上でこれを行うには醜いハックがあります。

  1. libjvm.soのベースアドレスを見つけるには/proc/self/mapsを読んでください。
  2. ELF format readerを使用して、ダイナミックライブラリ内の希望するシンボルのオフセットを検出します。
  3. このシンボルのアドレスに直接書き込んでください。

ここでは、このトリックではa sample codeです。

+0

私はHelfy(そしてHotspot SA)を使って管理していました。私が準備したらサンプルコードでそれを表示します –

+1

ここにありますhttps://github.com/serkan-ozal/jvm-playground/blob/master/src/main/java/tr/com/serkanozal/jvm/プレイグラウンド/ ChangeImmutableVmFlagDemo.java –

+0

@SerkanÖzalCool! Helfyがそれに使用できるとは思わなかった。この例をGithubのHelfyレポに追加してもよろしいですか? – apangin

1

[OK]を、これが特定の方向にナッジの正確な答えが、よりない....

services/writeableFlags.hppでVMフラグを設定するための静的な方法があります。成功は、これらのフラグが実際に変更可能かどうかに依存しますが、それを突き止めるのが良い場所になります。私はJVMTIエージェントからこれらのメソッドを呼び出すことは試みていませんが、理論的にはうまくいくはずです。

関連する問題