Java代码运行机制

  Java代码编译后生成一种与平台无关的字节码(也就是class文件)。当然,这种字节码不是可执行的,必须使用Java解释器来解释执行。负责解释执行字节码文件的是Java虚拟机,即JVM。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。

  当我们调用Java命令运行某个java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序有多么复杂,该程序启动了多少个线程,它们都处于该Java虚拟机进程里。同一个JVM的所有线程、所有变量都处于同一个进程里,它们都使用该JVM进程的内存区。

  当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、连接、初始化三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或类初始化。

1.加载

类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说程序中使用任何类时,系统都会为之建立一个java.lang.Class对象(类,实际上也是对象,它们都是java.lang.Class的实例)。

类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是我们前面所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过集成ClassLoader基类来创建自己的类加载器。

类加载器通常无须等到”首次使用“该类时才加载该类,Java虚拟机规范允许系统预先加载某些类。

2.连接

当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段将会负责把类的二进制数据合并到JRE中。

类连接又可分为如下三个阶段:

(1)验证

检验被加载的类是否有正确的内部结构,并和其他类协调一致

(2)准备

为类的静态属性分配内存,并设置默认初始值

(3)解析

将类的二进制数据中的符号引用替换成直接引用

3.初始化

在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对静态属性进行初始化。

在Java类中对静态属性指定初始值有两种方式:

(1)声明静态属性时指定初始值;

(2)使用静态初始化块为静态属性指定初始值。如果在这两种方式中都对同一静态属性指定初始值,JVM会按这些语句在程序中的排列顺序依次执行它们。

JVM初始化一个类包含如下几个步骤:

(1)假如这个类还没有被加载和连接,程序先加载并连接该类。

(2)假如该类的直接父类还没有被初始化,则先初始化其父类。

(3)假如类中有初始化语句,则系统依次执行这些初始化语句。

类初始化的时机

当Java程序首次通过下面6种方式来使用某个类或接口时,系统就会初始化该类或接口:

(1)创建类的实例

(2)调用某个类的静态方法

(3)访问某个类或接口的静态属性,或为该静态属性赋值

(4)使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

(5)初始化某个类的子类

(6)直接使用java.exe命令来运行某个主类,当运行某个主类时,程序会先初始化该主类

除此之外,下面有几种情形需要特别指出:

对于一个final型的静态属性,如果该属性可以在编译时就得到属性值,则可认为该属性可被当成编译时常量。当程序使用编译时常量时,系统会认为这是对该类的被动使用,所以不会导致该类的初始化。

反之,如果final类型的静态属性的值不能在编译时得到,必须等到运行时才可以确定该属性的值,如果通过该类来访问该静态属性,则可以认为是主动访问使用该类,将会导致该类被初始化。

时间: 2024-11-09 06:07:30

Java代码运行机制的相关文章

Java的运行机制概括

这次随笔主要记录一下我对Java的平台无关性一些新的理解,以前只知道是Java是一门很容易跨平台的语言,正如 "Compile once, run anywhere" 这句话,也知道Java会先加载class字节码文件的机制,但对此是一知半解,所以我觉得有必要深入的总结一下它的加载机制. 你所了解的Java机制 编写源码 编译为字节码 通过JVM将字节码解释为机器码 这的确是Java代码的基本加载过程,因此有时候我们称"Java是解释执行的",但最近看了一篇相关文章

Java 程序运行机制

目录 Java 程序运行机制 运行过程 注释 JDK, JRE, JVM 第一个 JAVA 程序 java命名规范 入门小游戏 Java 程序运行机制 运行过程 源文件 (a.java) Java 编译器 字节码文件(a.class) 进入 JRE ,分别执行 类装载器-->字节码校验器-->解释器 系统平台,执行. 注释 JRE 中包含 JVM (JAVA虚拟机); 其中的字节码校验器也是 JAVA 安全性的一种体现. 也正是因为有 JVM 的存在, 使得 JAVA 具有挂平台的特性; JV

什么是JDK,JRE以及Java的运行机制和环境变量path,classpath的区别

1,JDK SUN公司提供了一套Java开发环境,简称JDK,它是整个Java的核心,其中包括Java编译器,Java运行工具,Java文档生成工具,Java打包工具等. 2,JRE SUN公司除了提供JDK,还提供了一种JRE工具,它是Java的运行环境,只需要运行事先编写好的程序,因此JRE工具中只包含Java运行工具,不包含Java编译工具. 3,为了方便使用,SUN公司在其JDK工具中自带了一个JRE工具,也就是说开发环境中包含了运行环境,这样一来,开发人员只需要在计算机上安装JDK,不

Java的运行机制

Java语言是当前流行的一种程序设计语言,因其安全性.平台无关性.性能优异等特点,受到广大编程爱好者的喜爱. 想学习Java语言的同学对于Java的运行机制的运行机制是必须要了解的. Java程序运行时,必须经过编译和运行两个步骤.首先将后缀名为Java的源文件进行编译,最终生成后缀名为.class的字节码文件.然后Java虚拟机将字节码文件进行解释执行,并将结果显示出来. 为了方便理解Java程序运行的过程,我们把具体步骤写下来. ①编写一个 Hello world.Java的文件. ②使用“

Java程序运行机制及运行过程

Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运行平台的差别,真正实现了“一次编译,随处运行”. Java垃圾回收(Garbage Collection):不用使用的内存空间应该回收:在C/C++等语言中,由程序员负责回收无用的内存:Java语言消除了程序员回收无用内存的职 责,它提供一种系统级线程跟踪存贮空间的分配情况,并在JVM空闲的时候,检

【转载】Java JVM 运行机制及基本原理

原博地址:https://zhuanlan.zhihu.com/p/25713880 JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候JVM的作用就体现出来了,它负责把我们的程序翻译给系统"听",告诉它我们的程序需要做什么操作. 我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统

Java程序运行机制

高级语言的运行机制 计算机高级语言按程序的执行方式可以分为编译型和解释型两种. 编译型语言是指使用专门的编译器,针对特定平台,也就是操作系统将某种高级语言源代码一次性翻译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序 的格式,这个转换过程称为编译,编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行. 有些程序编译结束后,还可能需要对其他编译好的目标代码进行连接,即组装两个以上的目标代码模板生成最终的可执行性程序,通过这种方式实现低层次的代码复用. 因为编译型语言是

java 的运行机制之classload

java在运行的时候并不会一下子把所有程序用到的class全部加载进来,而是通过ClassLoad来实现动态加载机制. 是对程序运行效率的一种优化,我这里贴出一个helloworld输出程序的实测输出数据,共400多行,有点长... [Opened C:\Program Files\Java\jre1.8.0_40\lib\rt.jar] [Loaded java.lang.Object from C:\Program Files\Java\jre1.8.0_40\lib\rt.jar] [Lo

java语言运行机制及运行过程

java语言的特点 1.面向对象     1.1 两个基本概念:类.对象      1.2 三大特性:封装.继承.多态 2.健壮性     吸收了c/c++语言的优点,但是去掉了影响程序健壮性的部分(如指针.内存的申请与释放等),提供了一个相对安全的内存管理和访问机制 3.跨平台性     3.1 通过java语言编写的应用程序在不同的系统平台上都可以运行.           Write once,Run Anywhere      3.2 原理:只要在需要运行java应用程序的操作系统上,先