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は基本的にディレクトリ構造は同じです。
├─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のスタックフレームの一つの可能性を覚えておきたいです。