実行時のメモリ構造\(2\) Javaスタック内のフレーム間動作

Similar documents
例外,並行・同期処理,ゴミ集め

PowerPoint プレゼンテーション

Java2セキュリティ

スライド 1

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint ppt

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

PowerPoint プレゼンテーション

プログラミング入門1

ガイダンス

ガイダンス

問題1 以下に示すプログラムは、次の処理をするプログラムである

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

HotSpot のロック A Peek Under the Hood

Microsoft PowerPoint - chap10_OOP.ppt

JAVA入門

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

Program Design (プログラム設計)

リファレンス,配列 例外処理

JavaプログラミングⅠ

JavaプログラミングⅠ

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

Microsoft PowerPoint - lec06 [互換モード]

JavaプログラミングⅠ

基本情報STEP UP演習Java対策

PowerPoint プレゼンテーション

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

JavaプログラミングⅠ

プログラミング基礎I(再)

PowerPoint プレゼンテーション

Microsoft PowerPoint - swing3.ppt

JAVA とテンプレート

2

< F2D B838A835882CC8CF68EAE2E6A7464>

Microsoft PowerPoint - prog03.ppt

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Microsoft PowerPoint - prog04.ppt

第2回講義

例外(exception)とは何か

Microsoft PowerPoint - OOP.pptx

< F2D834F838C A815B A CC>

PowerPoint プレゼンテーション

Make the Future Java FY13 PPT Template

Microsoft Word - Java3.DOC

GEC-Java

ガイダンス

メソッドのまとめ

GEC-Java

Microsoft Word - CompA-Ex doc

プログラミング入門1

ガイダンス

How to Use the PowerPoint Template

文字列操作と正規表現

Microsoft PowerPoint - OOP.pptx

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

Microsoft PowerPoint - swing2.ppt

JavaプログラミングⅠ

PowerPoint プレゼンテーション

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

ガイダンス

r02.dvi

spa99.dvi

ohp02.dvi

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

人工知能入門

プログラミング入門1

GUIプログラムⅣ

Prog1_15th

Prog1_6th

Prog2_9th

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint ppt

JavaプログラミングⅠ

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

Javaプログラムの実行手順

Microsoft PowerPoint - prog09.ppt

< F2D82B682E182F182AF82F12E6A7464>

< F2D825282CC947B909482CC A815B83682E6A>

< F2D8EA CE909482CC92EA82852E6A7464>

Microsoft Word - keisankigairon.ch doc

デジタル表現論・第6回

Prog2_9th

Java言語 第1回

ÿþ˜u#u·0¹0Æ0à0

< F2D F B834E2E6A7464>

デジタル表現論・第4回

Thread

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

2

参考 - メインスレッドは JVM によって自動的に起動されるため 起動するコードを書く必要 はありません 今まで例題 演習で作成してきたプログラムは全てメインメソッドにて 動作している シングルスレッドです マルチスレッドマルチスレッドとは名前のとおり複数のスレッドと言う意味です マルチスレッドは

Java知識テスト問題

PowerPoint プレゼンテーション

今回の内容 グラフとオブジェクト指向プログラミング Java を使う理由 Java の基本 Javaのライブラリ 開発 実行 クラスの再利用 クラス継承 抽象クラス 開発の要点

Transcription:

実行時のメモリ構造 (2) Java スタック内動作他 2002 年 5 月 27 日 海谷治彦 1

JVM 内の基本構造 ( 大雑把 ) クラスファイルの内容チェック クラスデータを保存 クラスファイル クラスローダークラスローダークラスローダークラスローダー クラスファイル メソッドエリア ヒープエリアヒープエリアヒープエリア Javaスタック 実行エンジン ヒープ 各実行スレッドのローカルデータ ( 実行経過 ) を保存 教科書 p.15 * 原著および教科書 p.15 をベースに書いた. リンク有 インスタンスデータを保存 2

カウンタフレームプログラムJava スタック内の構造 フレーム フレーム スタック増減 フレーム という要素のスタック. フレームは,1 回のメソッド呼び出しに対応. フレーム内の計算のためにも, スタック ( ) が利用されている. 詳細は 実行時の構造 の回にて. 例えば教科書 p.20 の図 3

本日のお題 Java スタック内のフレームの増減を理解 メソッド ( 関数 ) 呼び出しの繰り返しによる計算機構の復習 (or 理解 ). インスタンス変数の扱い 情報隠蔽の実際 静的メソッド, 変数について コンストラクタについて 4

例題 : 簡単な計算クラス calc/calc.java public class Calc{ int val(int v){return v; int add(int a, int b){return a+b; int sub(int a, int b){ return a-b; int mul(int a, int b){return a*b; public static void main(string[] args){ Calc c=new Calc(); int a=c.mul(c.val(2), c.add(c.val(3), c.val(4))); // 2*(3+4) System.out.println(a); 5

calc/calc.java 関数呼び出しの構造 a=c.mul(c.val(2), c.add(c.val(3), c.val(4))); mul val val 2 3 add val 4 特に val はアホ見たいなメソッドだけど, インスタンス属性を使わないとこうなってしまう... 6

逆ポーランドによる展開 calc/calc.java a=c.mul(c.val(2), c.add(c.val(3), c.val(4))); メソッド呼び出し自体, 逆ポーランドの展開される. main メソッド内のアセンブラ参照 2 val 3 val 4 val add mull.method... main... iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 7

invokevirtual インスタンスメソッドの呼び出し 例 これによって, 新しいフレームが生成される. 返り値が V(void) でない限り, 返り値はすぐ下のフレームのに載せられる.( これがメソッドの返り値 ) 8

例題のトーレス 1/11 main.method... main... local=[args, c, ] stack=[c, c, 2] スタック上から c と 2 をとって,val を呼び出す. インスタンスメソッドなのでターゲットインスタンスリファレンス (c) が必要. 2 は val 自体の引数. iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 9

例題のトーレス 2/11 main val(2) 2 が帰る local=[this, 2] stack=[] iload_1 local=[this, 2] stack=[2] ireturn.method... main... iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2.method val(i)i.limit stack 1.limit locals 2 iload_1 ireturn 10

例題のトーレス 3/11 main.method... main... local=[args, c, ] stack=[c, c, 2] local=[args, c, ] stack=[c, 2] iconst_3 local=[args, c, ] stack=[c,2,c,c,3] iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 11

例題のトーレス 4/11 main val(3) 3 が帰る... local=[args, c, ] stack=[c,2,c,c,3] local=[args, c, ] stack=[c,2,c,3].method... main....method val(i)i.limit stack 1.limit locals 2 iload_1 ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 12

例題のトーレス 5/11 main... local=[args, c, ] stack=[c,2,c,3] iconst_4 local=[args, c, ] stack=[c,2,c,3,c,4].method... main... iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 13

例題のトーレス 6/11... main val(4) 4 が帰る local=[args, c, ] stack=[c,2,c,3,c,4] local=[args, c, ] stack=[c,2,c,3,4].method... main....method val(i)i.limit stack 1.limit locals 2 iload_1 ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 14

例題のトーレス 7/11 main add(3,4)... local=[args, c, ] stack=[c,2,c,3,4] invokevirtual Clac/add(II)I.method... main....method add(ii)i.limit stack 2.limit locals 3 iload_1 iload_2 iadd ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 15

例題のトーレス 8/11 main 7 が返る add(3,4) local=[this,3,4] stack=[] iload_1 iload_2 local=[this,3,4] stack=[3,4] iadd local=[this,3,4] stack=[7] ireturn.method... main....method add(ii)i.limit stack 2.limit locals 3 iload_1 iload_2 iadd ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 16

例題のトーレス 9/11 main mul(2,7)... local=[args, c, ] stack=[c,2,c,3,4] invokevirtual Clac/add(II)I local=[args, c, ] stack=[c,2,7] invokevirtual Calc/mul(II)I.method... main....method mul(ii)i.limit stack 2.limit locals 3 iload_1 iload_2 imul ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 17

例題のトーレス 10/11 main 14 が返る mul(2,7) local=[this,2,7] stack=[] iload_1 iload_2 local=[this,2,7] stack=[2,7] imul local=[this,2,7]stack=[14] ireturn.method... main....method mul(ii)i.limit stack 2.limit locals 3 iload_1 iload_2 imul ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 18

例題のトーレス 11/11 main mul(2,7)... local=[args, c, ] stack=[c,2,7] invokevirtual Calc/mul(II)I local=[args, c, ] stack=[14] istore_2 local=[args, c, 14].method... main....method mul(ii)i.limit stack 2.limit locals 3 iload_1 iload_2 imul ireturn iconst_2 iconst_3 iconst_4 invokevirtual Calc/add(II)I invokevirtual Calc/mul(II)I istore_2 19

つ, 疲れる. トレースの感想 単純作業を正確にこなすコンピュータの奇跡に驚嘆.( 人間に無理 ) インスタンスのリファレンスがほとんど無駄に見えたけど, これに関しては,method の入れ子呼び出しを行っていないため. Java スタック内のフレームが 2 個以上になってない. main メソッド上からの呼び出しなので, 例題が悪かった... 20

再帰 詳細は rpower/ の下を参照. 解説は Web ページを参照. int rpower(int a, int b){ if(b>0) return a * rpower(a, b-1); else return 1;.method rpower(ii)i.limit stack 5.limit locals 3 iload_2 ifle Label1 iload_1 aload_0 iload_1 iload_2 iconst_1 isub invokevirtual Calc/rpower(II)I imul ireturn Label1: iconst_1 ireturn 21

インスタンス変数 class IncDec{ private int s; IncDec(int a){ s=a; increment and decrement methods. void inc(int a){ s+=a; voiddec(inta){ s-=a; int value(){return s; public static void main(string[] args){ IncDec id=new IncDec(10); id.inc(3); id.dec(8); System.out.println(id.value()); 初期値を 10 にして, 3 増やして,inc(3) 8 減らす dec(8) という... な計算. 22

静的メソッド, 変数 詳細は web ページ static/ を参照. invokestatic getstatic / putstatic 0 にインスタンスが入らない. 静的変数は名前がそのまま残る.(v など ) static int v; static void add(int a){v += a;.class public Static.super java/lang/object.field private static v I.method static add(i)v.limit stack 2.limit locals 1 getstatic Static/v I iload_0 iadd putstatic Static/v I return 23

静的変数の初期化 class InitStatic{ static int uptoval=100; int val; boolean add(int a){ if(val+a>uptoval) return false; else val += a; return true;.class InitStatic.super java/lang/object.field static uptoval I.field val I ; 中略.method static <clinit>()v.limit stack 1.limit locals 0 bipush 100 putstatic InitStatic/uptoval I return 24

変数操作のまとめ インスタンス変数 getfield p.302 putfield p.444 静的変数 getstatic p.306 putstatic p.447 25

コンストラクタ デフォルトのコンストラクタ 明示的に再定義した場合 明示的にスーパークラスを指定 実装するインタフェースを指定 26

デフォルトコンストラクタ 例えば,calc/ の例など. デフォでは Object のサブクラスなので, そのコンストラクタを呼んでいる..class public Calc.super java/lang/object.method public <init>()v.limit stack 1.limit locals 1 aload_0 invokespecial java/lang/object/<init>()v return 27

明示的に再定義 例えば, inc-dec/ の例など. デフォルトのコンストラクタは無くなる. それでも,super の初期化はする. super の初期化が先に行われている. ( 重要 ) class IncDec{ private int s; IncDec(int a){ s=a;.class IncDec.super java/lang/object.field private s I.method <init>(i)v.limit stack 2.limit locals 2 aload_0 invokespecial java/lang/object/<init>()v aload_0 iload_1 putfield IncDec/s I return 28

明示的なスーパークラス 明示的再定義とそう変わらない. class MyThread extends Thread{ private int s; MyThread(int s){ this.s=s;.class MyThread.super java/lang/thread.field private s I.method <init>(i)v.limit stack 2.limit locals 2 aload_0 invokespecial java/lang/thread/<init>()v aload_0 iload_1 putfield MyThread/s I return 29

明示的スーパークラスその 2 public class Supers extends Super1{ private int ss; Supers(){ super(3,2); ss=4; class Super1 extends Super2{ private int s1; Super1(int s1, int s2){ super(s2); this.s1=s1; class Super2 { private int s2; Super2(int s2){ this.s2=s2;.class public Supers.super Super1.field private ss I.method <init>()v.limit stack 3.limit locals 1 aload_0 iconst_3 iconst_2 invokespecial Super1/<init>(II)V aload_0 iconst_4 putfield Supers/ss I return 30

続き.class Super1.super Super2.field private s1 I.method <init>(ii)v.limit stack 2.limit locals 3 aload_0 iload_2 invokespecial Super2/<init>(I)V aload_0 iload_1 putfield Super1/s1 I return.class Super2.super java/lang/object.field private s2 I.method <init>(i)v.limit stack 2.limit locals 2 aload_0 invokespecial java/lang/object/<init>()v aload_0 iload_1 putfield Super2/s2 I return 31

インタフェースの実装 import java.util.*; public class MyVector extends Vector implements Runnable{ public void run(){ 実装してるインタフェース情報が追加されている. import は展開されている..class public MyVector.super java/util/vector.implements java/lang/runnable.method public <init>()v.limit stack 1.limit locals 1 aload_0 invokespecial java/util/vector/<init>()v return.method public run()v.limit stack 0.limit locals 1 return 32

インスタンスの作成 new クラス名 必要なヒープ確保がされるだけ. 初期設定は明示的に他で. class MyThread extends Thread{ private int s; MyThread(int s){ this.s=s; public static void main(string[] args){ MyThread m=new MyThread(3);.limit stack 3.limit locals 2 new MyThread dup iconst_3 invokespecial MyThread/<init>(I)V astore_1 return 通常は, 後の操作のため, 参照の複製を作る. (dup) その複製をへ書き込む.(astore_?) 33

メソッド呼び出しのまとめ invokespecial 下記のメソッド呼び出し p.364 インスタンス初期化 private なインスタンスメソッド super のインスタンスメソッド invokevirtual 上記以外のインスタンスメソッド p.372 invokestatic 静的メソッド p.369 invokeinterface インタフェースのメソッド p.361 34