`
134564
  • 浏览: 20790 次
  • 性别: 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源码包---java 源码 大量 实例

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

    Java 面经手册·小傅哥.pdf

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

    Java OCR 图像智能字符识别技术,可识别中文

    Java OCR(Optical Character Recognition,光学字符识别)技术是一种计算机视觉领域的应用,它能将图像中的文字转换成可编辑的文本格式。这项技术在各种场景下都有广泛应用,比如文档扫描、车牌识别、发票处理等。...

    Java API文档 中文网页版

    Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、方法和常量的详细说明。这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,...

    java_011 java 人脸识别完整源代码

    java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011...

    java源码包2

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

    java源码包3

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

    java电商源代码 java电商源代码

    java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java...

    java api最新7.0

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

    java笔记 java笔记

    ### Java基础知识概述 #### 1. 前言 Java是一种广泛使用的面向对象的编程语言,因其跨平台性、安全性和强大的功能而受到欢迎。Java的设计理念是“一次编写,到处运行”,这意味着编写的Java程序可以在任何安装了...

    java景点导航系统java景点导航系统

    java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点...

    java开源包4

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

    java简易小游戏.zip

    java简易小游戏java简易小游戏java简易小游戏java简易小游戏 java简易小游戏java简易小游戏java简易小游戏java简易小游戏 java简易小游戏java简易小游戏java简易小游戏java简易小游戏 java简易小游戏java简易小游戏...

    java开源包9

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

    javacv配置+javacv人脸识别代码

    JavaCV(Java Computer Vision)是一个基于Java的计算机视觉库,它为Java和Android开发者提供了方便的接口来使用多个流行的计算机视觉框架,如OpenCV、FFmpeg等。在本项目中,我们将探讨如何配置JavaCV以及如何使用...

    java开源包5

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

    Java2Pas Java代码转pas代码

    Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...

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

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

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    ### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....

Global site tag (gtag.js) - Google Analytics