`
syyixin
  • 浏览: 36671 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java基础之JVM运行机制

    博客分类:
  • Java
 
阅读更多

 

 

Java基础之JVM运行机制

 

作者:忆辛

 

Java Virtual Machine简称JVM,它是一种规范,是一种计算的仿真。我们知道java语言是跨平台的,而JVMjava跨平台的关键之所在。JVM上执行java字节码,执行时这些字节码可以解释成具体平台的机器码,因此java拥有“一次编译,处处运行”这一跨平台能力。

 

     JVM运行机制和物理结构可以参考以下两张图所示:



 

    


从上面我们可以看出java运行主要分几个步骤:

 

一、java源码编译。

 

二、类加载。

 

三、类执行。

 

 

步骤一:编译

 

java代码编译成字节码是类加载前的一个必要步骤,那么Java源码编译过程究竟是怎样的呢?我们先看下面的一张图:

 

    

 

 

     输入是java源代码,输出是JVM上可运行的字节码,而上图中的符号表主要是存贮和标识符有关的Token信息。这个编译过程分三个阶段:分析与输入到符号表、注解处理、语义分析与生成字节码文件,其流程请参考下图:

 

    

 

 

     最后生成的字节码文件中包含结构信息、元数据、方法信息。

 

1、结构信息:class文件格式版本号和各部分的数量与大小信息。

 

2、元数据:指Java源码中声明与常量的信息,包含类/继承的超类/实现的接口等声明信息、域与方法声明信息、常量池。

 

3、方法信息:对应Java源码中语句和表达式对应的信息,包含字节码、异常处理器表、求值栈的类型记录、调试符号信息、求值栈与局部变量区大小。

 

 

 

步骤二:加载

 

     我们知道,java类必须加载到JVM中才能运行,这个工作由类加载器完成,这个实际上就是把.class文件从硬盘读到内存里。其实类加载器也是一个类,名字叫bootstrap classloaderjava运行需要的所有类(jre/lib/rt.jar)都是由它加载。该类由c++语言编写,可以独立运行,是JVM运行的起点。类的加载可通过两种方式实现,第一种是显式加载,另一种则是隐式加载。

 

  1. 显式加载。

 

显式加载类的实施方式比较多,比如加载类Demo,我们可以使用Class类的forName方法进行加载,即Class.forName(“Demo”);这个语句是简写形式,完整写法是Class.forName(“Demo”,true,this.getClass().getClassLoader());当然,java程序员对程序控制权的迷恋向来很深,你大可以自己定义一个加载类。方法如下:

 

public class CustomClassLoader extends URLClassLoader{

 

public CustomClassLoader(){

 

super(new URL[0]);

 

}

 

}

 

         CustomClassLoader classLoader=new CustomClassLoader();

 

         classLoader.loadClass(“Demo”);

 

     这里CustomClassLoader继承了JDK中核心包中的类加载器。

 

  1. 隐式加载。

    其实我们很少去显式加载。

    Demo demo=new Demo();

 

程序运行到这句代码发现内存里还没有Demo类,这时候JVM就会请求加载当前类的类加载器来加载该类。这里需要注意的是只有该句代码的确能有效执行时才会去加载对应类,否则是不会加载的,这样做的目的是尽可能少地加载类,减少内存资源的开销。

 

加载类是一种树状结构,加载时首先要从叶子节点往根部检查,检查类是否已经被加载,如果检查到某个classLoader已加载则视为已加载此类。为保证此类所有classLoader加载一次,加载类会从根往叶子节点逐级加载此类。具体检查和加载顺序如下图所示:



 

 

 

     步骤三:执行

 

字节码加载到JVM后执行,具体执行步骤我们可以参考下图:

 



 

我们知道,JVM是基于栈的体系结构来执行JVM字节码的。具体来说先创建线程,产生程序计数器(PC)和栈(Stack)。其中程序计数器存放下一条要执行的指令在方法内的偏移量,栈中则存放一个个栈帧,每个栈帧对应每个方法的每次调用;另外栈帧是由局部变量区和操作数栈两个部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈用于存放方法执行过程中所产生的中间结果。

 

 

 

作者:忆辛,写于羊城,于20150205 1057分发表在ITeye网站,任何单位和个人未经作者书面许可,禁止转载、复制本文全文或文章的任何部分。

 

 

 

  • 大小: 17.5 KB
  • 大小: 20.1 KB
  • 大小: 24.9 KB
  • 大小: 18.1 KB
  • 大小: 41.6 KB
  • 大小: 33.9 KB
4
3
分享到:
评论
7 楼 raph_java 2015-02-09  
楼主可以继续写成一个系列
6 楼 programmer- 2015-02-06  
5 楼 string2020 2015-02-06  
MAT怎么用
楼主能否出一个视频教程
4 楼 moonyang 2015-02-06  
有用,感谢
3 楼 jwell 2015-02-06  
2 楼 1927105 2015-02-06  
1 楼 beck5859509 2015-02-05  

相关推荐

    JVM运行机制深入分析

    JVM运行机制深入分析,适用于研究java开发的人员,想深入理解jvm

    JVM的运行机制

    总结来说,JVM的运行机制是Java平台无关性的关键,它通过字节码和解释器实现了代码的跨平台执行,同时通过垃圾回收和内存管理提供了高效且安全的运行环境。理解JVM的工作原理对于优化Java应用性能、排查问题和开发...

    java基础之JVM

    ### Java基础之JVM #### 一、JVM简介 **1.1 JVM是什么** Java Virtual Machine (JVM),即Java虚拟机,是Java技术的核心组成部分之一。它是一种抽象计算机,能够执行Java字节码(一种中间代码)的虚拟机环境。JVM...

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

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

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

    通过阅读这本书,开发者不仅能理解JVM的基本运作机制,还能掌握如何利用这些知识来优化Java应用,提升程序性能,解决实际开发中的问题。对于Java开发者来说,理解JVM的工作原理是提升技术水平和解决问题的关键步骤。

    jvmjava,java实现的JVM。.zip

    《Java实现的JVM——深入...总结,"jvmjava"项目是一个极好的学习资源,它使开发者有机会亲手构建一个JVM,从底层理解Java应用程序的运行机制。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技术水平。

    java11-jvm白皮书

    这份白皮书主要关注JVM的内部工作原理,包括垃圾收集、内存管理、类加载机制、性能优化等方面,是Java开发者深入理解Java运行环境的重要参考资料。 一、JVM概述 Java虚拟机(JVM)是Java平台的核心组成部分,它负责...

    JAVA虚拟机(JVM)规范(中文版).rar

    JAVA虚拟机(JVM)是Java语言的核心组成部分,它为Java程序提供了运行环境,使得Java代码能在任何支持JVM的平台上运行,实现了“一次编写,到处运行”的目标。JVM规范定义了Java程序如何在特定系统上被加载、解析、...

    java的运行机制

    ### Java的运行机制 在深入理解Java语言的过程中,了解其运行机制是至关重要的一步。本文将从Java的编译与执行、JVM(Java虚拟机)的作用、类加载器(ClassLoader)的工作原理以及JRE(Java运行时环境)与JDK(Java...

    java虚拟机JVM详解ppt

    Java虚拟机(JVM)作为Java编程语言的核心组件之一,其重要性不言而喻。本文将深入剖析JVM的基本概念、架构及其内存管理机制,重点解读堆和栈内存溢出的情况及案例分析。 #### 二、Java虚拟机(JVM)简介 Java虚拟机...

    Java JVM虚拟机运行机制

    Java JVM虚拟机运行机制是Java程序执行的核心,它允许Java代码在任何支持Java的平台上运行,无需重新编译。JVM作为一个规范,可以被实现为软件或者硬件的一部分,它的设计目的是提供一个平台无关的环境来运行Java...

    深入理解Java虚拟机JVM高级特性与最佳实践1

    JVM作为Java程序运行的基础,为开发者屏蔽了底层硬件和操作系统的复杂性,使得Java程序具有跨平台的特性。然而,随着Java应用在高并发、高性能场景的普及,对JVM的深入理解变得至关重要。 在本书中,作者不仅涵盖了...

    java程序的运行机制详细分析

    ### Java程序的运行机制详细分析 #### 一、Java为何具备平台独立性 Java作为一种广泛使用的编程语言,其最大的特点之一就是平台独立性。这意味着编写的Java程序可以在任何支持Java虚拟机(JVM)的操作系统上运行而...

    实战Java虚拟机——JVM故障诊断与性能优化

    在Java编程中,JVM扮演着至关重要的角色,它是Java程序运行的基础。了解JVM内部机制,包括类加载机制、内存模型、垃圾收集等,是提高程序性能和解决运行时问题的关键。书中的内容涵盖了以下几个核心知识点: 1. **...

    精通Java监控:JVM监控工具的使用与实践

    JVM监控工具是Java开发者的重要伙伴,它们提供了对Java应用程序内部运行机制的洞察。通过本文的详细介绍,读者应该能够了解JVM监控工具的使用方法,掌握基本的监控和分析技巧,并能够将这些工具应用到实际开发和生产...

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

    首先,我们要了解Java虚拟机(JVM)是Java程序运行的平台,它负责解释和执行Java字节码,为Java应用程序提供了一个跨平台的运行环境。JVM的核心功能包括类加载、字节码验证、内存管理、垃圾收集等。 在JVM性能调优...

    jvm规范和java规范

    这两部分规范分别定义了Java程序如何在JVM上运行以及Java编程语言的语法和语义。 《Java语言规范》(Java Language Specification,简称JLS)8版是描述Java编程语言的官方文档。它详细阐述了语言的所有细节,包括...

    java11-jvm白皮书_java_govwe_

    JVM(Java虚拟机)是Java平台的核心组件,负责运行Java程序。在Java 11中,对JVM进行了一些关键的优化和更新,这些变化对于理解和提升Java应用程序的效率至关重要。 首先,让我们深入了解Java 11中的JVM改进。JVM...

Global site tag (gtag.js) - Google Analytics