`
JAVA-JVM
  • 浏览: 13396 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

jvm运行原理

    博客分类:
  • java
阅读更多

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实例了。

分享到:
评论
1 楼 len-len 2012-02-21  
写的很清晰明了。

相关推荐

    JVM运行原理以及性能监控

    Java虚拟机运行原理,以及运行状态监控

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

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

    JVM工作原理学习笔记

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作原理,包括内存管理、类加载机制、垃圾回收以及性能优化等方面。 首先,我们来理解JVM的内存结构...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    【JVM运行机制详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行字节码,为Java程序提供跨平台的运行环境。在深入理解JVM内核的运行机制时,我们需要关注以下几个关键点: 1. **类加载机制**:JVM...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

    浅谈jvm原理

    "浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了一个完整的计算机系统。JVM 可以分为三类:VMWare、Visual Box 和 JVM。其中,...

    JVM 工作原理

    JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题

    JVM工作原理

    开发者可以借助这些工具深入了解JVM运行情况并进行调优。 总结来说,JVM是一个复杂的系统,它的核心任务是高效地运行Java程序。理解JVM的工作原理有助于我们编写更高效的代码,更好地利用资源,以及解决运行时可能...

    深入JVM内核—原理、诊断与优化

    特别是堆内存、栈内存、方法区(元空间)以及垃圾收集机制,它们是理解JVM运行时行为的关键。 2. **字节码与类加载**:JVM通过类加载器动态加载Java类,将.class文件转换为运行时的数据结构。字节码的解析和执行由...

    深入jvm 内核-原理,诊断于优化视频教程

    - **监控工具使用**:利用VisualVM、JConsole等工具监控JVM运行时状态。 **3.2 线程调优** - **线程池配置**:合理配置线程池的大小可以避免过多线程的创建和销毁带来的性能开销。 - **死锁检测**:通过JVM内置的...

    java-jvm虚拟机原理.ppt

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。本篇文章将深入探讨JVM的生命周期、体系...理解JVM的工作原理对于优化Java应用性能、调试问题和设计高效的内存管理策略至关重要。

    java中jvm内存分配相关资料总结整理

    7. **JVM运行原理** - **类加载机制**:JVM通过类加载器加载类,包括加载、验证、准备、解析和初始化五个阶段。 - **字节码执行**:通过解释器或即时编译器(如HotSpot的C1、C2编译器)将字节码转化为机器码执行。...

    JVM原理讲解和调优,详细讲解JVM底层

    类加载机制是JVM运行Java程序的一个重要组成部分。类加载器将.class文件中的二进制数据读入到内存中,并为之生成对应的java.lang.Class对象。类加载器从根加载器开始,按层次结构逐级加载类。JVM提供了三种类加载器...

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

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

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    在Java开发领域,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。深入理解JVM的内核原理、诊断技巧以及优化方法对于提升应用性能至关重要。本教程——“深入JVM内核—原理、...

    JVM原理.pdf

    JVM运行机制复杂且至关重要,涉及到内存分配、垃圾回收、类加载机制等多个方面。冯立全在分享中重点介绍了JVM运行机制,尤其强调了运行时数据区域的布局、Class文件的结构、字节码技术、类加载机制以及垃圾回收算法...

    JVM底层原理课件PPT

    ### JVM底层原理——类加载子系统详解 #### 一、引言 Java虚拟机(JVM)作为Java程序运行的基础环境,其内部结构复杂且功能强大。本文将基于“JVM底层原理课件PPT”中关于类加载子系统的介绍进行深入解析。类加载子...

    快速入门JVM

    #### 四、JVM运行原理 1. **类加载机制**:类在JVM中首先需要被加载到内存中才能使用。类加载过程包括加载、验证、准备、解析和初始化五个阶段。 2. **垃圾回收算法**:JVM采用多种垃圾回收算法,如标记-清除(Mark...

    深入JVM内核 - 原理、诊断与优化

    JVM运行机制简介 堆、栈、方法区等 JVM启动流程 内存模型和volatile实例 解释和编译运行的概念 介绍JVM的内部结构、启动流程以及内存模型。并介绍JVM字节码的执行方式。 第三课 常用JVM参数 堆的分配参数 栈分配及...

    jvm的基本原理及结构

    ### JVM基本原理及结构详解 #### 一、Java虚拟机(JVM)的逻辑与物理结构 JVM,即Java Virtual Machine,是运行Java字节码的虚拟机环境,它的设计目的是为了提供一个独立于硬件的运行环境,使得Java程序可以在任何...

Global site tag (gtag.js) - Google Analytics