OpenJDK Internals 1.0 documentation

JVMソースコードリーディングの会 第5回

«  Profiling   ::   Contents   ::   On-Stack Replacement  »

JVMソースコードリーディングの会 第5回

C2 compiler ytoshima memo

Node

MachNode

Type

ciOb

def-num use-num

root === 1 3 4 {{ 0 }}

param 10 this pointer

しょっぱなから、メモリの命令に分解している this命令があるので。

隠れparam control, io memory this,,,

CPUにJava専用命令を実装して、PauselessGC Azureの主張 <– C2コンパイラをメインで開発していた人が、2005年くらいにAzureに移籍

Compiler data structures

CFGは、適度に壊して直して繰り返し

CFGは、上記保持しない

Nodeクラス

初期のメソッド

多くのサブクラスが目的に応じて違ったことをあげる

Ideal(bool can_reshape) <– 正規化

Value() <– 値の型を具体的に

Identity() <–

sample

in1 <– user operand

in2 <– user operand

Type
object bottom // scalaっぽい

Phase Class

SafePointNode

ProjNode <– 値を絞り込むノード

paramnode

mergemem

JVMState <– safepointと1たい1

PhaseCFG CFGは作るもの

Matcher <– hi –> lowへの変換

Areana <– メモリのここから取ってね。

RootNode _root Node _top <– 意味のないノード

PhaseValues 値をテーブルで管理する

GraphKitが便利かもしれない。

メモリ管理はJVM独自管理 areana メモリの管理 リソースエリア

hashCode()

newの処理 fast pathの場合は、5命令程度 slow pathの場合は、最悪GC発生

Optimize

IGVN

can_reshapeがtrueの場合、グラフの構造まで変えちゃう

EscapeAnalysis

is_counted_loop –> loop用の構造の作成

countedloopendっていうNodeに変換

CodeGen

一つのメソッド単位 inlineもたくさんされてるかも

縦 areana

Nodeは最大で65000

Node数に比例してメモリ使用量は増える見込み

google groupに情報乗っけると充実していくかもしれないね。

«  Profiling   ::   Contents   ::   On-Stack Replacement  »