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

浅析java虚拟机工作流程

阅读更多

    首先给一个简单的java示例,源代码如下:

 

public class Main {

    private static int size=1;

    public static void main(String args[]) {

        User u = new User();

        u.setName("李文水");

        u.setPwd("159");

        String name = u.getName();

        String pwd = u.getPwd();

        u = null;

    }

}

 

 

public class User {

    private String name;

    private String pwd;

 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getPwd() {

        return pwd;

    }

    public void setPwd(String pwd) {

        this.pwd = pwd;

    }

}

 

 

 

现在假设这两个java源文件已经被编译成了CLASS文件了,我们来看看java虚拟机怎么执行的。

 

 java虚拟机工作流程:

1.装载

描叙:Java虚拟机装载指定的CLASS文件,

结果:形成这个CLASS类的实例对象

过程:java虚拟机使用类装载器定位到相应的CLASS文件,然后读取这个CLASS文件(一个线性二进制数据流),将它传入java虚拟机中。紧接着虚拟机提取其中的类型信息。比如:该类的类名,方法名,变量名,修饰符,方法的返回类型等等。还有一个重要的东西就是常量池。(常量池保存了该类型的所有常量,包括直接常量和对其他类型,字段,方法的符号引用)将这些信息保存在一个叫做方法区的地方。最终形成CLASS类的实例,这个实例存放在内存的堆区。它成为了java程序与内部数据结构之间的接口,程序要访问该类型的信息,程序就调用该类型对应的CLASS实例对象的方法。简而言之:这个过程就是把一个类型的二进制数据解析为方法区中的内部数据结构,并在堆上建立一个CLASS对象的过程。

 

示例:装载Main

Java虚拟机读取Main类的CLASS文件,生产对应的java.lang.Class类的实例,读取其中的类型信息,比如修饰符privatepublicstatic,另外变量 sizenamepwdUser(User即为一个引用)共同构成了这个类的常量池。将这些信息保存在方法区, 

2.连接

描述:验证,准备,解析(可选)

结果:这个类型是正确的。(这里不知道该怎么描述)

过程:

1)      验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。

2)      准备:java虚拟机为类变量分配内存,设置默认值

3)      解析:在类型的常量池中寻找类,接口,字段和方法的符合引用把这些符号引用替换成直接引用的过程。

 

示例: 连接Main

Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。

 

3.初始化

描述:初始化一些静态变量

结果:这个类型可以使用了

过程:可能会调用<clinit>()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的<clinit>() 方法已经被调用。

 

示例:初始化Main

Java虚拟机将Main类的静态变量赋值为1.

 

 

4.使用(执行该类代码了)

1.User u = new User();(存放在内存的堆区)

创建了一个User类实例,实际上是通过这个类的CLASS实例实例化的。方法如下:

 

User u=(User)Class.forName("User").newInstance();

为了方便,用C代替Class.forName("User")

2.u.setName("李文水");  u.setPwd("159");

调用该类的方法,为该类的变量赋值,Java虚拟机内部调用是这样的,通过方法区找到该方法,利用CLASS实例的如下方法调用:

 

c.getMethod("setName").invoke(u,"李文水");

3.String name = u.getName() String pwd = u.getPwd();

与第二步类似,不同的是将取得的值分别赋给了变量namepwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化

4.u = null;

这个步骤写出来的目的是了解一下Java虚拟机垃圾回收机制。(没有什么实际意义)

Java虚拟机内部会根据一种规则(这个对象是否可以触及)来判断这两个类是否可以回收了?具体形式如下:

 

    当执行 u = null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了。

 

 

    以上是我自己通过看《深入java虚拟机》这本书对java虚拟机的了解,由于自己的表达能力不是很强,大家若有什么疑问。希望能与我一起讨论下!

 

 

  • 大小: 9.4 KB
分享到:
评论

相关推荐

    浅析Java卡应用执行机制及虚拟机能效优化.pdf

    浅析Java卡应用执行机制及虚拟机能效优化 本文将对Java卡应用执行机制和虚拟机的能效优化进行深入分析。首先,我们将介绍Java卡应用执行机制的基本过程,然后讨论影响Java卡运算能效的因素,并探讨Java卡性能优化的...

    浅析dalvik虚拟机JIT技术的实现.doc

    Dalvik虚拟机是专为Android设计的虚拟机,不同于传统的Java虚拟机(JVM),它采用寄存器架构而非栈架构,旨在减少内存占用,适应移动设备的硬件限制。在Android 2.2版本中,Dalvik虚拟机引入了JIT技术,这一技术通过...

    浅析JAVA异常处理机制.pdf

    ### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...

    浅析Java智能卡的应用与开发.zip

    本篇将详细探讨Java智能卡的应用场景、工作原理、开发流程以及相关技术。 一、Java智能卡的应用场景 1. 金融支付:Java智能卡常用于银行卡,通过内置的加密算法保证交易安全,防止欺诈。 2. 电信SIM卡:移动通信中...

    浅析Java语言中对象的创建过程.pdf

    JVM(Java虚拟机)为每一个运行中的Java应用程序提供了一个唯一的运行环境。JVM的内存主要被划分为三个区域:堆区、栈区和方法区。堆区(Heap)是存放通过new关键字创建的对象实体的地方,这些对象实体在堆中拥有...

    Java中main()方法浅析.docx

    当Java虚拟机(JVM)启动并加载了一个包含`main()`方法的类时,它会自动调用这个方法来开始程序的执行流程。接下来,我们将详细探讨`main()`方法的各种特性和注意事项。 #### 二、main()方法的基本定义 `main()`方法...

    Hadoop环境搭建与WordCount实例浅析.pdf

    搭建Hadoop环境需要对Linux、网络配置和Java有一定的了解,同时,理解Hadoop的分布式原理和工作流程也是至关重要的。在实践中,你可能会遇到各种问题,如网络连接、权限设置等,解决这些问题将有助于你更好地理解和...

    Java程序与C语言的区别浅析

    C 语言可以直接操作内存,而 Java 通过虚拟机间接访问,这提高了安全性,但也限制了某些底层操作。C 语言可以创建动态链接库,Java 通过 Jar 文件提供可移植的代码库。C 语言有指针,允许直接地址操作,而 Java 没有...

    JNI资源汇总

    JNI是一个规范,它定义了Java虚拟机(JVM)如何与本地代码(通常为C/C++)交互。通过JNI,Java程序员可以调用本地方法,反之,本地代码也可以调用Java方法。 2. **JNI的用途**: - **性能提升**:对于计算密集型...

    Java_C_FPC

    它的设计目标是“一次编写,到处运行”,这得益于Java虚拟机(JVM),它允许Java程序在任何支持Java的平台上运行。Java具有面向对象的特性,支持类、接口和继承,同时还包括异常处理、垃圾回收等功能。Java在企业级...

    浅析安卓计算器的开发.pdf

    中间件层由函数库和安卓运行时构成,提供了一组核心库和虚拟机。应用程序框架层提供了安卓平台的管理机制和组件重用机制,包括管理、窗体管理、包管理、电话管理、资源管理、位置管理、通知消息管理、系统和内容提供...

    android笔记.rar

    4.6 浅析dalvik虚拟机JIT技术的实现... ...133 4.7 应用程序的签名(Signature) ... ...135 4.8 应用的权限... ..138 4.9 屏幕密度Density ... ..140 3 4.10 Prelink实现的源码分析 ... ...142 4.11 适配...

Global site tag (gtag.js) - Google Analytics