`

Java的运行原理及JVM虚拟机是怎么工作的

阅读更多
Java的运行原理
在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。
Java虚拟机(JVM)
Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。
java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程。
装载:查找和导入类和接口的.class文件。
连接:检查装入.class文件的正确性,然后,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类的实例,读取其中的类型信息,比如修饰符private,public,static,另外变量 size,name,pwd,User(User即为一个引用)共同构成了这个类的常量池。将这些信息保存在方法区。
2.连接
描述:验证,准备,解析(可选)。
结果:这个类型是正确的。(这里不知道该怎么描述)。
过程:
1)验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。
2)准备:java虚拟机为类变量分配内存,设置默认值
3)解析:在类型的常量池中寻找类,接口,字段和方法的符号引用把这些符号引用替换成直接引用的过程。
示例: 连接Main类
Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。
3.初始化
描述:初始化一些静态变量。
结果:这个类型可以使用了。
过程:可能会调用()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的() 方法已经被调用。
示例:初始化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",new Class[]{String.class}).invoke(u, new Object[]{"李文水"});
3.String name = u.getName();
  String pwd = u.getPwd();
与第二步类似,不同的是将取得的值分别赋给了变量name和pwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化。
4.u = null;

这个步骤写出来的目的是了解一下Java虚拟机垃圾回收机制。(没有什么实际意义)
Java虚拟机内部会根据一种规则(这个对象是否可以触及)来判断这两个类是否可以回收了?具体形式如下:



当执行 u = null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了。
  • 大小: 9.4 KB
分享到:
评论

相关推荐

    Java运行原理与Java虚拟机.pdf

    ### Java运行原理与Java虚拟机 #### 一、Java运行原理概述 Java作为一种跨平台的编程语言,其独特之处在于它的编译和解释过程。Java程序的执行涉及到两个主要步骤:首先是编译阶段,其次是解释执行阶段。 1. **...

    Java语言规范和JVM虚拟机规范.zip

    本压缩包包含的文件详细阐述了Java编程语言的各个方面以及Java虚拟机(JVM)的工作原理。 **Java语言规范** Java语言规范定义了Java程序的语法、语义和程序行为。它涵盖了以下几个关键部分: 1. **基本概念**:...

    java-jvm虚拟机原理.ppt

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。本篇文章将深入探讨JVM的生命周期、体系结构、类加载机制、内存区域以及垃圾收集。 首先,JVM的生命周期与Java程序紧密关联。...

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    深入理解jvm虚拟机

    JVM(Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境。它在执行字节码时,解释成对应平台的机器码。...开发者需要通过阅读和实践相结合,不断积累经验,才能深入掌握JVM虚拟机的核心原理。

    实战java虚拟机

    总的来说,《实战Java虚拟机》这本书将带你深入JVM的内部世界,从理论到实践,全面掌握Java运行机制,提升编程和问题解决能力。通过学习,你将能够更好地优化程序,提高系统效率,解决实际开发中的各种挑战。

    javajvm虚拟机原理PPT课件.pptx

    Java虚拟机(Java Virtual Machine,JVM)是Java平台的核心组件之一,对Java程序的执行和管理起着至关重要的作用。下面是Java虚拟机的主要知识点: Java虚拟机生命周期 Java虚拟机的生命周期可分为三个主要阶段:...

    JVM虚拟机深度讲解

    《JVM虚拟机深度讲解》这本书是JAVA开发者深入理解JVM的重要参考资料,它全面而详尽地探讨了Java虚拟机的工作原理与优化技巧。通过阅读本书,开发者可以大幅提升对JVM的理解,从而在编程实践中更好地驾驭这个强大的...

    Java jvm虚拟机.zip

    总之,Java JVM虚拟机是Java语言运行的基础,它的设计和实现直接影响着Java程序的性能和可移植性。通过深入了解JVM的工作原理,开发者可以更好地优化代码,提高程序运行效率,同时也能充分利用Java的平台无关性优势...

    JVM.rar_java 工作流_java 虚拟机_jvm_jvm hook_虚拟机 Java

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在深入理解JVM的工作流程之前,我们首先需要知道Java程序是如何被编译和运行的。Java源代码(.java文件)通过Java编译器...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    《深入理解Java虚拟机》是一本深度探讨Java虚拟机(JVM)的著作,涵盖了JVM性能调优、内存模型以及虚拟机原理等多个关键领域。本文将基于这些主题,详细阐述其中的重要知识点。 首先,我们要了解Java虚拟机(JVM)...

    JVM虚拟机面试

    本文主要针对JVM虚拟机面试中的常见问题进行解析,涵盖了JVM的基础知识、JVM的结构组成、类加载器的工作原理等方面的知识点。 Java如何实现跨平台 Java能够实现跨平台是因为Java虚拟机(JVM)负责将字节码文件翻译...

    深入Java虚拟机 JVM pdf

    《深入Java虚拟机》是Java开发者必读的经典之作,它详细阐述了Java虚拟机(JVM)的工作原理和内部机制,对于理解Java程序的运行方式、优化代码性能以及排查问题具有极其重要的价值。这本书的第二版更是加入了更多...

    JAVA虚拟机解读入门

    《JAVA虚拟机解读入门》是一本面向初学者的指南,旨在带领读者深入理解Java虚拟机(JVM)的工作原理和内部机制。JVM是Java语言的核心组成部分,它为Java程序提供了一个跨平台的运行环境,使得“一次编写,到处运行”...

    Java虚拟机规范(中文版).pdf

    ### Java虚拟机规范(JVM)概览 #### 核心概念与重要性 《Java虚拟机规范(JavaSE7版)》是理解Java虚拟机(JVM)运作机制的基石,由Tim Lindholm、Frank Yellin、Gilad Bracha和Alex Buckley等人撰写,后由周志明、...

    java虚拟机各种版本

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了...总之,Java虚拟机是Java生态系统中的核心组件,它的多样性满足了不同场景的需求,而深入理解和掌握JVM的工作原理,是每个Java开发者必备的技能。

    Java虚拟机规范中文版.pdf

    为了更好地理解Java虚拟机的内部工作原理,开发者通常需要对JVM规范有深入的认识。例如,对JVM的垃圾回收算法的了解,有助于开发者编写出更适合自动内存管理的代码。了解JVM的线程模型,有助于编写高性能的多线程...

Global site tag (gtag.js) - Google Analytics