JVMの中身を可視化してみた
    by @eller86




                  1
whoami
●   Java, JavaScriptなどを扱う研究開発者
●   ウェブアプリケーションを再起動するたびに使える
    ヒープが減る現象を追ったのがJVMとの出会い
    ●
        シングルトンだけど、シングルトンじゃなかった!

●   持ちネタ
    ●   jps, jstack, jmap, javap, JProfiler, VisualVM
    ●   ASM, PMD, GAE/J, @twistoire, @partakein
    ●   java.lang.instrumentとMBeanで低速SQL解析

                                                        2
概要

JVMってよくわからないから
図にしてわかりやすくしよう!



                 3
What's JVM?




              4
A Java Virtual Machine (JVM) is a
virtual machine capable of executing
           Java bytecode.
             – Wikipedia




                                       5
JVMがあるから

Write Once, Run Anywhere




                           6
JVMがあるから

Java as a Platform




                     7
なんか重要そうなことは分かったし
Javaプログラムがどうやって動くか
    理解するのに重要っぽい




                     8
仕様書を読んでみよう!

The Java Virtual Machine Specification
           Second Edition

       オンライン(HTML、英語)
          書籍(日本語)
           書籍(英語)


                                         9
とりあえず

    バイトコード
ランタイムコンスタントプール
   オペランドスタック
    ローカル変数
    → #jvmjvm



                 10
バイトコード

pop


getstatic indexbyte1 indexbyte2


ldc index


invokevirtual indexbyte1 indexbyte2


                          →Javaバイトコード入門 11
ランタイムコンスタントプール




                 12
ランタイムコンスタントプール
$ javap -verbose Integer
  Compiled from "Integer.java"
  // 中略
    Constant pool:
  const #1 = int -2147483648;
  const #2 = int -2147483647;
  const #3 = int 52429;
  const #4 = int 65536;
  const #5 = String    #30;
    //   greater than Character.MAX_RADIX   13
フレーム
●   オペランドスタック
    ●
        演算に使用するデータを溜めておくスタック
●   ローカル変数
    ●   ローカル変数を記録する配列のようなもの
    ●   thisやメソッド引数もここで扱う
●   その他




                     →Stack on JavaVM   14
わかった、ような……
●   個々の役割はわかるが、どう協調動作するのかイ
    メージしにくい
    ●   classファイルに定数とバイトコードが書いてあるらしい
    ●
        バイトコードをどうやって実行するのか?
    ●
        ローカル変数やオペランドスタックはどう使われるの
        か?

●   実際のコードがどう動くのか試してみたい



                                       15
作ってみた




        16
ご清聴ありがとうございました



forkできます!→   http://jsdo.it/eller86/jvms2

Twitter      @eller86
ブログ          http://dev.worksap.co.jp/



                                            17

JVMの中身を可視化してみた