`
134564
  • 浏览: 19918 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java

阅读更多

目标:

1、 程序在内存中的经历。

2、 静态类,内部类,静态内部类。在虚拟机里是什么形状的。

3、 变量,常量,静态常量,final静态常量,在虚拟机里是什么样子

4、 锁机制是怎么实现的

 

虚拟机分为三大系统: 类装载器、 运行时数据区、 执行引擎。

 

我的问题主要集中在虚拟机运行时数据区这块

 

 

 

 

第一个问题: 程序的经历

 

分析这段程序:

 

public class Test {

        public double[] spaceStone = new double[10000];
        public static void main(String[] args) throws InterruptedException
        {
                String s = "1";
                List<Test> list = new ArrayList<Test>();
                int t1 = 0;
                for(;;) {
                        Test t = new Test();
                        list.add(t);
                        System.out.println(" " + t1++);
                        Thread.sleep(100);
                }
        }

}

 

当程序运行时这段代码的类文件将被类加载器加载到 运行时数据区中方法区

下面汇总一下都是些什么东西存进去了。

 

javap Test 生成字节码

 

 Compiled from "Test.java"

public class com.myjava.test.Test extends java.lang.Object        1、该类型的全限定名;    2、 直接超类的全限定名; 3、是一个类;4、是public的;
  SourceFile: "Test.java"
  minor version: 0
  major version: 50
  Constant pool: // 4、常量池;
const #1 = Method       #20.#36;        //  java/lang/Object."<init>":()V
const #2 = Field        #6.#37; //  com/myjava/test/Test.spaceStone:[D 
const #3 = String       #38;    //  1
const #4 = class        #39;    //  java/util/ArrayList
const #5 = Method       #4.#36; //  java/util/ArrayList."<init>":()V
const #6 = class        #40;    //  com/myjava/test/Test
const #7 = Method       #6.#36; //  com/myjava/test/Test."<init>":()V
const #8 = InterfaceMethod      #41.#42;        //  java/util/List.add:(Ljava/lang/Object;)Z
const #9 = Field        #43.#44;        //  java/lang/System.out:Ljava/io/PrintStream;
const #10 = class       #45;    //  java/lang/StringBuilder
const #11 = Method      #10.#36;        //  java/lang/StringBuilder."<init>":()V
const #12 = String      #46;    //
const #13 = Method      #10.#47;        //  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #14 = Method      #10.#48;        //  java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
const #15 = Method      #10.#49;        //  java/lang/StringBuilder.toString:()Ljava/lang/String;
const #16 = Method      #50.#51;        //  java/io/PrintStream.println:(Ljava/lang/String;)V
const #17 = long        100l;
const #19 = Method      #52.#53;        //  java/lang/Thread.sleep:(J)V
const #20 = class       #54;    //  java/lang/Object
const #21 = Asciz       spaceStone;
const #22 = Asciz       [D;
const #23 = Asciz       <init>;
const #24 = Asciz       ()V;
const #25 = Asciz       Code;
const #26 = Asciz       LineNumberTable;
const #27 = Asciz       main;
const #28 = Asciz       ([Ljava/lang/String;)V;
const #29 = Asciz       StackMapTable;
const #30 = class       #55;    //  java/lang/String
const #31 = class       #56;    //  java/util/List
const #32 = Asciz       Exceptions;
const #33 = class       #57;    //  java/lang/InterruptedException
const #34 = Asciz       SourceFile;
const #35 = Asciz       Test.java;
const #36 = NameAndType #23:#24;//  "<init>":()V
const #37 = NameAndType #21:#22;//  spaceStone:[D
const #38 = Asciz       1;
const #39 = Asciz       java/util/ArrayList;
const #40 = Asciz       com/myjava/test/Test;
const #41 = class       #56;    //  java/util/List
const #42 = NameAndType #58:#59;//  add:(Ljava/lang/Object;)Z
const #43 = class       #60;    //  java/lang/System
const #44 = NameAndType #61:#62;//  out:Ljava/io/PrintStream;
const #45 = Asciz       java/lang/StringBuilder;
const #46 = Asciz        ;
const #47 = NameAndType #63:#64;//  append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #48 = NameAndType #63:#65;//  append:(I)Ljava/lang/StringBuilder;
const #49 = NameAndType #66:#67;//  toString:()Ljava/lang/String;
const #50 = class       #68;    //  java/io/PrintStream
const #51 = NameAndType #69:#70;//  println:(Ljava/lang/String;)V
const #52 = class       #71;    //  java/lang/Thread
const #53 = NameAndType #72:#73;//  sleep:(J)V
const #54 = Asciz       java/lang/Object;
const #55 = Asciz       java/lang/String;
const #56 = Asciz       java/util/List;
const #57 = Asciz       java/lang/InterruptedException;
const #58 = Asciz       add;
const #59 = Asciz       (Ljava/lang/Object;)Z;
const #60 = Asciz       java/lang/System;
const #61 = Asciz       out;
const #62 = Asciz       Ljava/io/PrintStream;;
const #63 = Asciz       append;
const #64 = Asciz       (Ljava/lang/String;)Ljava/lang/StringBuilder;;
const #65 = Asciz       (I)Ljava/lang/StringBuilder;;
const #66 = Asciz       toString;
const #67 = Asciz       ()Ljava/lang/String;;
const #68 = Asciz       java/io/PrintStream;
const #69 = Asciz       println;
const #70 = Asciz       (Ljava/lang/String;)V;
const #71 = Asciz       java/lang/Thread;
const #72 = Asciz       sleep;
const #73 = Asciz       (J)V;

{  //方法区
public double[] spaceStone; 5、字段信息;

public com.myjava.test.Test(); 6、方法信息;
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   sipush  10000
   8:   newarray double
   10:  putfield        #2; //Field spaceStone:[D
   13:  return
  LineNumberTable:
   line 18: 0
   line 20: 4


public static void main(java.lang.String[])   throws java.lang.InterruptedException;  6、方法信息;
  Code:
   Stack=3, Locals=5, Args_size=1
   0:   ldc     #3; //String 1
   2:   astore_1
   3:   new     #4; //class java/util/ArrayList
   6:   dup
   7:   invokespecial   #5; //Method java/util/ArrayList."<init>":()V
   10:  astore_2
   11:  iconst_0
   12:  istore_3
   13:  new     #6; //class com/myjava/test/Test
   16:  dup
   17:  invokespecial   #7; //Method "<init>":()V
   20:  astore  4
   22:  aload_2
   23:  aload   4
   25:  invokeinterface #8,  2; //InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
   30:  pop
   31:  getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;
   34:  new     #10; //class java/lang/StringBuilder
   37:  dup
   38:  invokespecial   #11; //Method java/lang/StringBuilder."<init>":()V
   41:  ldc     #12; //String
   43:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   46:  iload_3
   47:  iinc    3, 1
   50:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   53:  invokevirtual   #15; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   56:  invokevirtual   #16; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   59:  ldc2_w  #17; //long 100l
   62:  invokestatic    #19; //Method java/lang/Thread.sleep:(J)V
   65:  goto    13
  LineNumberTable:
   line 23: 0
   line 24: 3
   line 25: 11
   line 27: 13
   line 28: 22
   line 29: 31
   line 30: 59
   line 31: 65

  StackMapTable: number_of_entries = 1
   frame_type = 254 /* append */
     offset_delta = 13
     locals = [ class java/lang/String, class java/util/List, int ]

  Exceptions:   7、 异常表
   throws java.lang.InterruptedException
}

 

其余还可能会有:

 

  

●任何直接超接口的全限定名的有序列表。
●类静态变量。
●指向ClassLoader类的引用。任何类都需要被类装载器装入内存。如果是被用户自定义类装载器装载的,那么JVM必须在类型信息中存储对该装载器对象的引用。

●指向Class类的 引用。对于每一个被装载的类型,虚拟机都会相应的为它创建一个java.lang.Class类的实例,而且虚拟机还必须以某种方式把这个实例和存储在方 法区中的类型信息关联起来。 

●方法表。 为了能快速定位到类型中的某个方法。JVM对每个装载的类型都会建立一个方法表,用于存储该类型对象可以调用的方法的直接引用,这些方法就包括从超类中继 承来的。

 

 



 

 

 

好了,终于把所有class二进制文件都读进来了, 下一步执行。

 

从哪开始呢?

main? static块? 

 

当然,执行是从main方法开始的,但是加载的时候static块就完事了。

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JAVA_API1.6文档(中文)

    java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java api最新7.0

    JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java开发技术大全(500个源代码).

    HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java 中文入门学习手册合集[chm版]

    第一章 Java语言的产生及其特点 第二章 Java程序开发与运行环境 第三章 Java程序设计基础 第四章 Java应用程序的基本框架 第五章 Java的类 第六章 Java图形用户接口 第七章 多线程 第八章 Java的"异常" 第九...

Global site tag (gtag.js) - Google Analytics