Download - Inside The Java Virtual Machine

Transcript
Page 1: Inside The Java Virtual Machine

#yakiniku4j in Osaka

Inside The Java Virtual Machine

11年11月14日月曜日

Page 2: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

自己紹介

名前 : 田中 豪(たなか ごう)twitter:@tan_go238所属 :PLUGRAM, Inc.

言語 :Java, Flex, PHP興味 :JVM, HTML5, Obj-C, Scala出身 :京都

11年11月14日月曜日

Page 3: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ロース (roast) あるいはロース肉(ロースにく)とは、牛肉、豚肉、羊などの食肉の背肉の部分をいう。

語源 roast(ロースト; 焼く)から転訛した語であり、「ローストに適した肉の部位」を指す言葉。英語ではloin(ローイン)がこれに相当するといわれるが、必ずしも英語でのローインと日本語のロースは一致しない。

http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%82%B9http://r.tabelog.com/osaka/A2703/A270301/27014688/dtlphotolst/

ロース

11年11月14日月曜日

Page 4: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Outline・Classファイルの構造

・JVMについて

・メモリ領域

・Garbage Collection

・JVM Options

11年11月14日月曜日

Page 5: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイルの構造

11年11月14日月曜日

Page 6: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイルが実行されるまで

Java ClassJVM

Class

ソースコード 中間ファイル(バイナリ) 実行

① ② ③

11年11月14日月曜日

Page 7: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ソースコード

package hoge;

public class Main {

public static void main(String[] args) { System.out.println("Hello World."); }

}

11年11月14日月曜日

Page 8: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイル11001010111111101011101010111110000000000000000000000000001100100000000000100010000001110000000000000010000000010000000000001001011010000110111101100111011001010010111101001101011000010110100101101110000001110000000000000100000000010000000000010000011010100110000101110110011000010010111101101100011000010110111001100111001011110100111101100010011010100110010101100011011101000000000100000000000001100011110001101001011011100110100101110100001111100000000100000000000000110010100000101001010101100000000100000000000001000100001101101111011001000110010100001010000000000000001100000000000010010000110000000000000001010000000000000110000000010000000000001111010011000110100101101110011001010100111001110101011011010110001001100101011100100101010001100001011000100110110001100101000000010000000000010010010011000110111101100011011000010110110001010110011000010111001001101001011000010110001001101100011001010101010001100001011000100110110001100101000000010000000000000100011101000110100001101001011100110000000100000000000010110100110001101000011011110110011101100101001011110100110101100001011010010110111000111011000000010000000000000100011011010110000101101001011011100000000100000000000101100010100001011011010011000110101001100001011101100110000100101111011011000110000101101110011001110010111101010011011101000111001001101001011011100110011100111011001010010101011000001001000000000001000100000000000100110000011100000000000100100000000100000000000100000110101001100001011101100110000100101111011011000110000101101110011001110010111101010011011110010111001101110100011001010110110100001100000000000001010000000000000101010000000100000000000000110110111101110101011101000000000100000000000101010100110001101010011000010111011001100001001011110110100101101111001011110101000001110010011010010110111001110100010100110111010001110010011001010110000101101101001110110000100000000000000101110000000100000000000011000100100001100101011011000110110001101111001000000101011101101111011100100110110001100100001011100000101000000000000110010000000000011011000001110000000000011010000000010000000000010011011010100110000101110110011000010010111101101001011011110010111101010000011100100110100101101110011101000101001101110100011100100110010101100001011011010000110000000000000111000000000000011101000000010000000000000111011100000111001001101001011011100111010001101100011011100000000100000000000101010010100001001100011010100110000101110110011000010010111101101100011000010110111001100111001011110101001101110100011100100110100101101110011001110011101100101001010101100000000100000000000001000110000101110010011001110111001100000001000000000001001101011011010011000110101001100001011101100110000100101111011011000110000101101110011001110010111101010011011101000111001001101001011011100110011100111011000000010000000000001010010100110110111101110101011100100110001101100101010001100110100101101100011001010000000100000000000010010100110101100001011010010110111000101110011010100110000101110110011000010000000000100001000000000000000100000000000000110000000000000000000000000000000000000000000000100000000000000001000000000000010100000000000001100000000000000001000000000000011100000000000000000000000000101111000000000000000100000000000000010000000000000000000000000000010100101010101101110000000000001000101100010000000000000000000000000000001000000000000010100000000000000000000000000000011000000000000000010000000000000000000000000000001100000000000010110000000000000000000000000000110000000000000000010000000000000000000000000000010100000000000011000000000000001101000000000000000000000000000010010000000000001110000000000000111100000000000000010000000000000111000000000000000000000000001101110000000000000010000000000000000100000000000000000000000000001001101100100000000000010000000100100001011010110110000000000001100010110001000000000000000000000000000000100000000000001010000000000000000000000000000010100000000000000010000000000000000000000000000001100000000000001000000000000000011100000000000010110000000000000000000000000000110000000000000000010000000000000000000000000000100100000000000111100000000000011111000000000000000000000000000000010000000000100000000000000000000000000000000000100000000000100001

11年11月14日月曜日

Page 9: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ClassファイルCAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

11年11月14日月曜日

Page 10: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイル構造体ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1] u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count];}

11年11月14日月曜日

Page 11: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイル構造体・マジックナンバー(0xCAFEBABE)・バージョン(メジャーバージョン、マイナーバージョン)・コンスタントプール情報・クラスのアクセス情報・クラス属性情報( 属性:SourceFile、Depricated、InnerClass、Synthetic)・implementsしているインターフェース情報・フィールド情報(属性:Constant、Depricated、Synthetic)・メソッド情報( 属性:Code、Exceptions、Depricated、Synthetic)・クラス情報(クラスindex、親クラスindex)

11年11月14日月曜日

Page 12: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイル構造体・マジックナンバー・バージョン・コンスタントプール情報・クラスのアクセス情報・クラス情報・インターフェース情報・フィールド情報・メソッド情報・クラス属性情報

ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1] u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count];}

11年11月14日月曜日

Page 13: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Classファイルを読んでみる

11年11月14日月曜日

Page 14: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

CAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

11001010 CA11111110 FE10111010 BA10111110 BE

マジックナンバー(4バイト)

= CAFEBABE

11年11月14日月曜日

Page 15: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

CAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

00000000 000000000 0

コンパイラのマイナーバージョン(2バイト)

= 0

11年11月14日月曜日

Page 16: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

CAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

00000000 000110010 32

コンパイラのメジャーバージョン(2バイト)

= 50

11年11月14日月曜日

Page 17: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

CAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

00000000 000100010 22

コンスタントプールエントリ配列の要素数(2バイト)

= 32

11年11月14日月曜日

Page 18: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

CAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

00000111 7

コンスタントプール情報(1)

= Constant_Class

1. タグバイト(1バイト)2. エントリーデータ(バイト配列)

00000000 000000010 2 = name_index(#2)

const #1 = class #2;

11年11月14日月曜日

Page 19: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

CAFEBABE00032022702109686F67652F4D61696E70410106A6176612F6C616E672F4F626A6563741063C696E69743E103282956104436F6465A0309C050610F4C696E654E756D6265725461626C6510124C6F63616C5661726961626C655461626C651047468697310B4C686F67652F4D61696E3B1046D61696E1016285B4C6A6176612F6C616E672F537472696E673B29569011013701210106A6176612F6C616E672F53797374656DC0140151036F757410154C6A6176612F696F2F5072696E7453747265616D3B801710C48656C6C6F20576F726C642EA01901B701A10136A6176612F696F2F5072696E7453747265616DC01C01D1077072696E746C6E1015284C6A6176612F6C616E672F537472696E673B29561046172677310135B4C6A6176612F6C616E672F537472696E673B10A536F7572636546696C651094D61696E2E6A617661021010300000201050601070002F010100052AB708B100020A00060100030B000C0100050C0D00090E0F01070003702010009B20101216B6018B100020A000A02000608070B000C01000901E01F00010200002021

00000001 1 = Constant_UTF8_info00000000 000001001 9 = length(9)

コンスタントプール情報(2) 1. タグバイト(1バイト)2. エントリーデータ(バイト配列)

= hoge/Main

const #2 = Asciz hoge/Main;

01101000 6801101111 6F01100111 6701100101 6500101111 2F01001101 4D01100001 6101101001 6901101110 6E

11年11月14日月曜日

Page 20: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

javap -c -verbose hoge.Mainpublic class hoge.Main extends java.lang.Object SourceFile: "Main.java" minor version: 0 major version: 50 Constant pool:const #1 = class#2; // hoge/Mainconst #2 = Ascizhoge/Main;const #3 = class#4; // java/lang/Objectconst #4 = Ascizjava/lang/Object;const #5 = Asciz<init>;const #6 = Asciz()V;const #7 = AscizCode;const #8 = Method#3.#9; // java/lang/Object."<init>":()Vconst #9 = NameAndType #5:#6;// "<init>":()Vconst #10 = AscizLineNumberTable;const #11 = AscizLocalVariableTable;const #12 = Ascizthis;const #13 = AscizLhoge/Main;;const #14 = Ascizmain;const #15 = Asciz([Ljava/lang/String;)V;const #16 = Field#17.#19;// java/lang/System.out:Ljava/io/PrintStream;const #17 = class#18;// java/lang/Systemconst #18 = Ascizjava/lang/System;const #19 = NameAndType #20:#21;// out:Ljava/io/PrintStream;const #20 = Ascizout;const #21 = AscizLjava/io/PrintStream;;const #22 = String #23;// Hello World.const #23 = AscizHello World.;・・・const #33 = AscizMain.java;・・・

11年11月14日月曜日

Page 21: Inside The Java Virtual Machine

素直に javap しましょう!

11年11月14日月曜日

Page 22: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ソーセージ(英語:sausage)とは、鳥獣類の挽肉などを塩や香辛料で調味した食品。湯煮や燻煙などの燻製処理を行い保存食とされる。

語源 後期ラテン語のサルスス(salsus、「塩漬にした」)に由来するサルシキウス(salsicius)の単数女性形サルシキア(salsicia)から転じた古北部フランス語ソーシッシュ(saussiche)が語源。

ソーセージ

http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%82%BB%E3%83%BC%E3%82%B8http://r.tabelog.com/osaka/A2703/A270301/27014688/dtlphotolst/

11年11月14日月曜日

Page 23: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

JVMについて

11年11月14日月曜日

Page 24: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

JVMとは・単純なスタックマシン・レジスタ数が少ないCPUにも対応が容易 ⇒ 移植性が確保できる

11年11月14日月曜日

Page 25: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

実行時データ領域(§3.5)

pcレジスタ

JVMスタック

ヒープ

メソッドエリア

実行時コンスタントプール

ネイティブメソッドスタック

フレーム ローカル変数 オペランドスタック

11年11月14日月曜日

Page 26: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

pcレジスタ(§3.5.1)

pcレジスタ

・プログラムカウンタレジスタ・現在プログラム中のどこを実行しているかを保持する・各スレッド毎に保持される

11年11月14日月曜日

Page 27: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Java仮想マシンスタック(§3.5.2)

・ローカル変数の保持、メソッドの起動などを担う・各スレッド毎に保持される・メソッドが起動する度に新しいフレームが格納される

JVMスタック

11年11月14日月曜日

Page 28: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ヒープ(§3.5.3)

・すべてのインスタンスや配列の割り当てが行われる実行時データ領域・すべてのJava仮想マシンスレッドから共有される・GCによって不要になったオブジェクトが回収される

ヒープ

11年11月14日月曜日

Page 29: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

メソッドエリア(§3.5.4)

メソッドエリア

・実行時コンスタントプール、フィールドやメソッドのデータ、 クラスやインスタンスおよびインターフェースの初期時、 メソッドのコードなどが格納される・すべてのJava仮想マシンスレッドから共有される・HotSpot VMでは Permanent領域 ともいう・この領域は主にFull GC時に回収される

11年11月14日月曜日

Page 30: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

実行時コンスタントプール(§3.5.5)

・Classファイル中にあるconstant_pool テーブルの実行時表現・クラス、インターフェースの生成時に構築される・各実行時コンスタントプールは、メソッドエリアから割り当てられる

実行時コンスタントプール

11年11月14日月曜日

Page 31: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ネイティブメソッドスタック(§3.5.6)

・nativeメソッドをサポートをするためのスタック・一般的には各スレッド生成時にスレッド単位に割り当てられる

ネイティブメソッドスタック

11年11月14日月曜日

Page 32: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

フレーム(§3.6)

・メソッドが起動する度に新たなフレームが生成される・各フレームには自身のローカル変数、オペランドスタック、 実行時コンスタントプールへの参照が保持される・メソッド終了時(正常/異常とも)に破棄される・Java仮想マシンスタックから割り当てられる

フレーム

11年11月14日月曜日

Page 33: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ローカル変数(§3.6.1)

・各フレームにはローカル変数と呼ばれる変数の配列が保持される・ローカル変数はインデックスによってアドレス付けされる

ローカル変数

11年11月14日月曜日

Page 34: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

・各フレーム毎に保持されるLIFOスタック・Java仮想マシンはスタックマシンであり、 レジスタが無いためオペランドスタックを 作業領域として使用する

オペランドスタック

11年11月14日月曜日

Page 35: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

int add12and13(){ return addTwo(12, 13);}

int add12and13(); 0: aload_0 // ローカル変数0 (this) をプッシュする 1: bipush 12 // intの定数 12 をプッシュする 3: bipush 13 // intの定数 13 をプッシュする 5: invokevirtual #16; // メソッド addTwo:(II)I 8: ireturn // オペランドスタック先頭の int をリターン // 起動側フレームのスタックへとプッシュされる

this

12

13

0

25this

1, 3 8

11年11月14日月曜日

Page 36: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example() { MyObj o = new MyObj(); int i = o.exe(); return silly(o, i);}

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

11年11月14日月曜日

Page 37: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

*MyObj

オペランドスタック ローカル変数

this

※他に実行時コンスタントプールがあります

11年11月14日月曜日

Page 38: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

*MyObj

オペランドスタック ローカル変数

*MyObj

this

11年11月14日月曜日

Page 39: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

*MyObj

オペランドスタック ローカル変数

this

11年11月14日月曜日

Page 40: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

*MyObj

オペランドスタック ローカル変数

this

11年11月14日月曜日

Page 41: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

*MyObj

this

11年11月14日月曜日

Page 42: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

int

*MyObj

this

11年11月14日月曜日

Page 43: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

this

int

11年11月14日月曜日

Page 44: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

this

int

this

11年11月14日月曜日

Page 45: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

this

int

this

*MyObj

11年11月14日月曜日

Page 46: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

this

int

this

*MyObj

int

11年11月14日月曜日

Page 47: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

this

int

*MyObj’

11年11月14日月曜日

Page 48: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

オペランドスタック(§3.6.2)

MyObj example(); 0: new #16; //class MyObj 3: dup 4: invokespecial #18; //Method MyObj."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #19; //Method MyObj.exe:()I 12: istore_2 13: aload_0 14: aload_1 15: iload_2 16: invokevirtual #23; //Method silly:(LMyObj;I)LMyObj; 19: areturn

オペランドスタック ローカル変数

*MyObj

this

int

*MyObj’

起動側フレームのスタックへとプッシュされる

11年11月14日月曜日

Page 49: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

ユッケ(肉膾、육회)は、生肉を用いた韓国の肉料理。

概要 原語読みでは「肉」はユク(육、Yuk)、「膾」はフェ(회、Hoe)の発音で、連音化して「ユッケ」と聞こえる。「膾」は獣や魚の生肉を細かく刻んだもの(「なます」や刺身の一種)の意味である。

ユッケ

http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%83%E3%82%B1http://r.tabelog.com/osaka/A2703/A270301/27014688/dtlphotolst/

ユッケの安全性ユッケは生肉を食するものであるため、動物の腸などから付着した腸管出血性大腸菌やサルモネラなどに感染する可能性がある。このため旧厚生省は「生食用食肉の衛生基準」(1998年(平成10年)9月11日生活衛生局長通達)により生食用食肉の規格や衛生管理について定め、これに沿った食肉に限り「生食用」と表示することとしている。しかし、これに基づく生食用食肉の出荷実績があるのは馬肉とレバーのみで、牛肉の出荷実績のある施設はなかった(2008年(平成20年)、2009年(平成21年))。この基準が遵守されず、多くの加熱用食肉が飲食店の自主判断で生のまま提供されているという。

11年11月14日月曜日

Page 50: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

メモリ領域ヒープ JVMスタック

フレーム

ローカル変数

オペランドスタック

スレッドB

スレッドC

メソッドエリア ネイティブメソッドスタック

スレッドA

スレッドBのフレーム

スレッドCのフレーム

クラスデータ

コンスタントプール

フィールド情報

メソッド情報

メソッドテーブル

・・・

クラスデータ

-Xms ~ -Xmx -Xss -XX:PermSize ~-XX:MaxPermSize

インスタンス

11年11月14日月曜日

Page 51: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Eden Survivor1 Survivor2

Young Generation Old Generation

Tenured

-Xmn = Young領域のサイズ

-Xmx = ヒープ全体の最大サイズ

-Xms = ヒープ全体の起動時のサイズ

【世代別GC】

11年11月14日月曜日

Page 52: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

11年11月14日月曜日

Page 53: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

・Scavenge GC(Copy GC)はYoung領域に対して行われる

11年11月14日月曜日

Page 54: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

11年11月14日月曜日

Page 55: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

11年11月14日月曜日

Page 56: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

11年11月14日月曜日

Page 57: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

11年11月14日月曜日

Page 58: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

【世代別GC】

11年11月14日月曜日

Page 59: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Garbage Collection

Survivor1 Survivor2

Young Generation Old GenerationEden Tenured

Survivorにあるインスタンスから閾値を超えたものがTenuredに移動する

・Full GC(Mark&Sweep GC)はOld領域の残りがある一定値に達したら行われる

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html詳しくは

【世代別GC】

11年11月14日月曜日

Page 60: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

Java HotSpot VM Options

http://www.oracle.com/technetwork/java/javase/tech/exactoptions-jsp-141536.html

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

VMのオプションを変更することでヒープ領域、パーマネント領域のメモリサイズの設定や実行されるGCの変更、使用されるVMの変更ができる

また Java SE 5.0 からGCのエルゴノミクスが導入されたエルゴノミクスにより各種パラメータの自動調整が行われる

• 初期ヒープ・サイズ,最大ヒープ・サイズ• GCのポリシー(アルゴリズムの選択,GCに使用するスレッド数など)• Young領域とOld領域のサイズ

http://itpro.nikkeibp.co.jp/article/COLUMN/20060619/241190/参考:

11年11月14日月曜日

Page 61: Inside The Java Virtual Machine

#yakiniku4j in Osaka

COPYRIGHT 2011 PLUGRAM, INC.

まとめ・仕組みは結構シンプル

・Java仮想マシン仕様を読むのは面白い・実装に依存するところは調べるの大変

・気付かないうちにバイトコードを読んだりアセンブラを調べ始めてるので注意

・javaagentとかJavaファイルの動的コンパイルとかもやりたかった...

http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%82%B9

11年11月14日月曜日

Page 62: Inside The Java Virtual Machine

ありがとうございました!

11年11月14日月曜日