JVM: 内部情報をお伝えします

JVM: 内部情報をお伝えします

[[361071]]

ほとんどのユーザーは、Java リフレクションの使用に精通しています。特にオープンソースフレームワークでは広く使用されています。リフレクションを通じて、Java クラスの情報を取得できます。ヒープやスレッドの使用状況、作成されたオブジェクトのメモリ アドレスやロードされたクラスの内容など、JVM の内部情報についてはどうでしょうか。

実際、JVM には、上記のような、人生における内部メッセージに似た内部情報が多数存在します。一部の大規模なアプリケーションでは、API 認証を通じてのみ一部のユーザー データを取得できることが想像できます。一般ユーザーが通常の使用方法でこれらのコンテンツを入手することは不可能です。 JVM 上で実行される通常の Java アプリケーションと同様に、JVM に関する情報を取得することは困難です。結局のところ、JVM はより低いレベルにあり、C++ で開発されています。

JVM はこの内部情報を教えてくれるのでしょうか?

JVM は、内部情報を公開するためのいくつかの外部インターフェースを提供します。 SA はこれらのインターフェースを通じてのみ、JVM 内部クラスの構造とアドレスにアクセスし、最下層から JVM 内部操作の詳細を観察できます。

SA グラフィカル インターフェイスで HSDB の内部を見ると、長いメニュー リストが表示されます。そのほとんどには、通常の Java アプリケーションでは取得できない「内部情報」が含まれています。

これらはすべてどのように実装されるのでしょうか?これについて言えば、gHotSpotVMStructs について言及する必要があります。

JVM によって提供されるインターフェースの中核は、gHotSpotVMStructs 構造です。元のヒープ アドレス、スレッド アドレス、スタック アドレスなど、JVM 内の多くの情報を公開します。

gHotSpotVMStructs 構造体は、多くのクラスとこれらのクラスのフィールド情報を指します。各クラスには一連のフィールドがあり、各フィールドには独自の名前、タイプ、静的かどうかなどが設定されます。静的フィールドの場合は、この構造を使用してその値にアクセスすることもできます。静的オブジェクト フィールドの場合、この構造体はターゲット オブジェクトのアドレスも提供します。このルート アドレスを通じて、コンパイラ、スレッド、ヒープなど、JVM 内のいくつかのコンポーネントのリバース チェックを開始できます。

したがって、JVM の内部情報を取得して理解するための鍵は、gHotSpotVMStructs 構造内のデータを解析することです。 JVM は、内部型システムのアドレスとルート オブジェクトのアドレスを公開するだけでなく、このデータを解釈するために使用される追加のシンボルと値も公開します。これには、クラスの説明情報と、このクラス内の各フィールドのオフセットが含まれます。さらに、JVM 開発者は、JVM 内の C++ クラスのフィールドを手動でマップしてグローバル gHotSpotVMStructs 構造にロードする一連の作業を実行しました。

SA はこの情報を解析する最良の例です。グラフィカル インターフェースを通じて、この情報を解析して何を学んだかを直感的に感じることができます。 gHotSpotVMStructs によって公開される情報を変換することで、Java ラッパー クラスを生成できます。これらのラッパー クラスによって提供されるインターフェイスにより、通常の Java アプリケーションで使用される API と同様に、JVM の内部システムに簡単かつ便利にアクセスでき、内部データへのアクセスと解析の問題が解決されます。

この情報に基づいて、他のデバッグ ツールや診断ツールも実装されます。

SA を使用する方法は、実際には「ptrace」システム コールを介して行われ、これにより、ターゲット JVM プロセスが一時停止され、gHotSpotVMStructs のメモリ情報の読み取りが開始されます。

上記の内容を読めば、SA がどのように機能するかが大体理解できます。このような要件がある場合、SA などのツールを使用して他のユーザーが JVM 情報を取得することを禁止しますか?

ほら、私が打ったところを指しているよ。答えは、gHotSpotVMStructs をリセットすることです。このツールではこの情報を解析できません。

Stackoverflow には、エージェントをコンパイルし、JVM の起動時にアタッチして、gHotSpotVMStructs を 0 に設定するという解決策があります。

  1. 外部 void *gHotSpotVMStructs;
  2.  
  3. int Agent_OnLoad(void *vm, char *options, void *reserved) {
  4. gHotSpotVMStructs = 0;
  5. 0を返します
  6. }

起動すると、JVM に接続されます。

  1. java -agentpath:/path/を /libnostructs.so...

SA ツールを再度実行すると、問題があることを示す例外がスローされます。

  1. スレッド「main」例外が発生しましたjava.lang.reflect.InvocationTargetException
  2. sun.reflect.NativeMethodAccessorImpl.invoke0 (ネイティブ メソッド)
  3. sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  4. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  5. java.lang.reflect.Method.invoke(Method.java:498)
  6. sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
  7. sun.tools.jstack.JStack.main(JStack.java:106)
  8. 原因: java.lang.RuntimeException: gHotSpotVMStructs がリモート プロセス適切に初期化されませんでした。できない 続く 
  9. sun.jvm.hotspot.HotSpotTypeDataBase.readVMStructs(HotSpotTypeDataBase.java:418)
  10. sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:91)
  11. sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:395)
  12. sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
  13. sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
  14. sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
  15. sun.jvm.hotspot.tools.Tool実行(Tool.java:118)
  16. sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
  17. ... 6件以上

この記事はWeChatの公開アカウント「Tomcat Things」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合は、Tomcat Things の公開アカウントにご連絡ください。

<<:  ローカルマシンからKubernetesの学習を始める

>>:  テクノロジーには暖かさがある:天一雲がラサの暖房に「スマートブレイン」を導入

推薦する

私たちメディアは私たちメディアではなく、ボランティアメディアであるべきだ

最近、「セルフメディア」という言葉が話題になっていますが、さまざまな意見があり、それぞれに独自の考え...

最近の百度画像表示問題に関する私の個人的な意見

12月24日、Baidu Webmaster Platformは最新情報を発表しました。Baiduの...

ウェブサイトの電子メールプロモーション活動からの電子メールマーケティングの長所と短所

「人手不足」により、人材サイトの人気が高まっています。百度では人材や求職情報をクリックしたり、大型プ...

外部リンクの構築を急いではいけません。構築して公開するときは注意してください。

外部リンク構築の重要性については、改めて説明する必要はないと思います。外部リンク構築がウェブサイトの...

学習姿勢を変えましょう。

Baidu 投稿バー「ウェブマスター クラブ」がオフラインになっていることを知り、最近、Baidu ...

テンセント天目:3+2+Nは連携エコシステムを活性化し、企業がネットワークを安全に保護できるように支援します

2019年6月13日、第7回中国サイバーセキュリティ会議(NSC2019)が北京で開催されました。テ...

ランキングに影響を与える5つの最大のアルゴリズム

Baiduのアルゴリズムは実はあまり奥が深くなく、各アルゴリズムを担当するエンジニアも異なるため、そ...

クラウド コンピューティング市場では、誰が誰のシェアを奪っているのでしょうか?

過去2年間で、通信事業者のクラウドビジネスは急激に成長しました。各社の最近の財務報告によると、202...

Baidu スパイダーが生きて遊ぶための最高品質の Web サイトを作成する方法

SEO とは何か、また SEO をどのように行うかを説明するのに、率直な言葉を使うつもりはありません...

不安定なウェブサイトランキングの問題を解決するための代替方法を見つける方法

ほとんどのウェブマスターは、自分のウェブサイトの紆余曲折を経験したことがあるはずです。今日はウェブサ...

あなたはいつも「洗脳」広告を軽蔑していますか?

葉茂中先生は「一流のマーケティングは対立を生み出す」とおっしゃっていましたが、一流の記事でも同じこと...

企業はクラウドコンピューティングの支出に100億ドル以上を無駄にする:その理由

エンタープライズクラウド管理会社RightScale Inc.の新しい予測によると、企業は2018年...

WeLoveServers - 3.17 ドル / 8 コア / 2g メモリ / 2.4g vSwap / 60g ハードディスク / 2T トラフィック

WeLoveServers は初めて低価格 VPS ランキングのトップ 10 にランクインし、9 位...

デラックスホスト-256M xen/15m 無制限/シアトル

Deluxe-Host は 2007 年に設立され、仮想ホスティング、openvz、XEN をベース...

ブロックされたウェブサイトを回復する方法

今日、ようやく自分のウェブサイトの 1 つについての記事を書きたい気分になりました。私は初心者、新人...