HotPotソースの構造とスタック、スタックなどのメモリエリアのデータ構造はどのように定義されていますか?
3659 ワード
出所:http://hllvm.group.iteye.com/group/topic/26998
HotSpot VMのコードだけを降りると簡単です。Oracle JDK 6/Oracle JDK 7/OpenJDK 6/OpenJDK 7のHot Spot VMは基本的にディレクトリ構造は同じです。
=======================================GCスタック:実はこれがいい。VM初期化の際にはmmap()/Virtual Allocを通してアドレス空間をGCスタックとして申請した後、いくつかのポインタでこの空間の最初と最後のアドレスと中間の領域区分を覚えます。最上階の構造はCollecedHeapの実現類にあります。これらの中でさらに区域を分けて、それぞれの区域に自分の最初の最後の住所とポインタの位置を覚えています。例えばGenCollecedHeapは初期化されてから中に入ります。gens配列には、DefNewGeneration、TenuredGeneration、またはPanewGeneration、ConcerentMarkSweepGenerationなどのいくつかのGenerationが保存されています。スペース、from_space、to_spaceなどの中には具体的な空間のポインタが取り付けられています。===================================================================スタック:正常に運行していますが、HotSpot VMはもともと明示的なデータ構造を持っていません。一番多いのはThread類の例で、スタックの底の住所とスタックの最大サイズが記憶されています。スタックトップポインタは、直接ハードウェアレジスタ(例えば、x 86〜64上のrsp)を使用するので、明示的なデータ構造も必要としない。「割り当てスタックフレーム」とは、スタックトップポインタレジスタから一つのサイズを減算(または追加)することであり、「リリーススタックフレーム」とは、そのレジスタを一つのサイズに加算(または減算)することである。しかし、スタックフレームは構造が必要ですよね?あるのはありますが、隠しタイプで直接対応するC++類はありません。プラットフォームに関するフレームワークarch>.hppには構造の一部が記載されています。OpenJDK公式wikiにはHot Spot VMのインタプリタスタックフレームの構造を簡単に説明した資料がありますが、Hot Spot VMのスタックフレームの一つの可能性を覚えておきたいです。
HotSpot VMのコードだけを降りると簡単です。Oracle JDK 6/Oracle JDK 7/OpenJDK 6/OpenJDK 7のHot Spot VMは基本的にディレクトリ構造は同じです。
├─agent Serviceability Agent
├─make build HotSpot
├─src HotSpot VM
│ ├─cpu CPU ( 、 、ad 、 runtime )
│ ├─os
│ ├─os_cpu +CPU
│ └─share
│ ├─tools
│ │ ├─hsdis
│ │ ├─IdealGraphVisualizer server
│ │ ├─launcher “java”
│ │ ├─LogCompilation -XX:+LogCompilation (hotspot.log)
│ │ └─ProjectCreator Visual Studio project
│ └─vm HotSpot VM
│ ├─adlc ( cpu os_cpu *.ad )
│ ├─asm
│ ├─c1 client ( “C1”)
│ ├─ci / VM
│ ├─classfile ( )
│ ├─code
│ ├─compiler VM
│ ├─gc_implementation GC
│ │ ├─concurrentMarkSweep Concurrent Mark Sweep GC
│ │ ├─g1 Garbage-First GC ( GC )
│ │ ├─parallelScavenge ParallelScavenge GC (server VM , GC )
│ │ ├─parNew ParNew GC
│ │ └─shared GC
│ ├─gc_interface GC
│ ├─interpreter , “ ”( ) “C++ ”( )
│ ├─libadt
│ ├─memory ( GC )
│ ├─oops HotSpot VM
│ ├─opto server ( “C2” “Opto”)
│ ├─prims HotSpot VM , native JVMTI
│ ├─runtime ( 、 、 、 )
│ ├─services JMX
│ ├─shark LLVM JIT ( )
│ └─utilities
└─test
あなたが見たディレクトリの構造はこのようなものです。=======================================GCスタック:実はこれがいい。VM初期化の際にはmmap()/Virtual Allocを通してアドレス空間をGCスタックとして申請した後、いくつかのポインタでこの空間の最初と最後のアドレスと中間の領域区分を覚えます。最上階の構造はCollecedHeapの実現類にあります。これらの中でさらに区域を分けて、それぞれの区域に自分の最初の最後の住所とポインタの位置を覚えています。例えばGenCollecedHeapは初期化されてから中に入ります。gens配列には、DefNewGeneration、TenuredGeneration、またはPanewGeneration、ConcerentMarkSweepGenerationなどのいくつかのGenerationが保存されています。スペース、from_space、to_spaceなどの中には具体的な空間のポインタが取り付けられています。===================================================================スタック:正常に運行していますが、HotSpot VMはもともと明示的なデータ構造を持っていません。一番多いのはThread類の例で、スタックの底の住所とスタックの最大サイズが記憶されています。スタックトップポインタは、直接ハードウェアレジスタ(例えば、x 86〜64上のrsp)を使用するので、明示的なデータ構造も必要としない。「割り当てスタックフレーム」とは、スタックトップポインタレジスタから一つのサイズを減算(または追加)することであり、「リリーススタックフレーム」とは、そのレジスタを一つのサイズに加算(または減算)することである。しかし、スタックフレームは構造が必要ですよね?あるのはありますが、隠しタイプで直接対応するC++類はありません。プラットフォームに関するフレームワークarch>.hppには構造の一部が記載されています。OpenJDK公式wikiにはHot Spot VMのインタプリタスタックフレームの構造を簡単に説明した資料がありますが、Hot Spot VMのスタックフレームの一つの可能性を覚えておきたいです。