jvm实现机制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.6 JVM的内部体系结构说明
类数据 类数据 对象 对象
类数据
类数据
对象
对象
类数据
对象
方法区
堆区
由所有线程共享的运行时数据区:方法区和堆区
2.7 JVM的方法区
在Java虚拟机中,被加载类型的信息都保存在方法区中。这些信息在内存中的 组织形式由虚拟机的实现者定义。 程序中的所有线程共享一个方法区,所以访问方法区信息的方法必须是线程安 全的。 在程序运行时,方法区的大小是可变的,程序在运行时可以扩展。有些Java虚 拟机的实现也可以通过参数也订制方法区的初始大小,最小值和最大值。 方法区也可以被垃圾收集。因为程序中的类由类加载器动态加载,所有类可能 变成没有被引用的状态。当类变成这种状态时,就可能被垃圾收集掉。没有加载的 类包括两种状态,一种是真正的没有加载,另一个种是“unreferenced”的状态。 方法区包含以下信息: 1. 类型信息(Type Information) 每一个被加载的类型,在Java虚拟机中都会在方法区中保存如下信息: 1)类型的全名 2)类型的父类型的全名 3)该类型是一个类还是接口 4)类型的修饰符(public,private,protected,static,final,volatile, transient等)
2.2 JVM的运行环境
A.class B.class
A.java
B.java
Java编译器
Java虚拟机
A.class
B.class
Object.class
String.class
Java 编 程 环 境
2.3 JVM的抽象实现机制
程序的class文件 类装载器 字节码 javaAPI的class文件
java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的 外壳,它会装载jvm.dll,这个动态连接库才是java虚拟机的实际操作处理所在。 %JAVA_HOME%/jre/bin目录下有两个目录:server与client,两个目录下分别 各有一个jvm.dll, 这就是真正的jvm.dll所在。 使用server模式可以提高性能,启动比client模式慢。当该参数不指定时,虚拟机 启动检测主机是否为服务器,如果是则以server模式启动,否则以client模式启动, J2SE5.0检测的根据是至少2个CPU和最低2GB内存。 jvm.dll无法单独工作,当jvm.dll启动后,会使用Win32 API之中的LoadLibrary() 与GetProcAddress()载入辅助用的动态链接库,而这些辅助用的动态链接库(.dll)都 必须位于jvm.dll所在目录的父目录之中。
JVM 实 现 机 制
宋秉华
主要内容
1. JVM相关概念 2. JVM实现机制
2.1 JVM运行环境 2.2 JVM抽象实现机制 2.3 JVM内部体系结构 2.4 JVM内部线程机制 2.5 JVM的数据类型 2.6 JVM的ClassLoader 2.7 JVM的Class文件 2.8 JVM的垃圾回收 2.9 sun的JVM内存管理
1. JVM相关概念
1.4 什么是JRE
JRE 是Java运行环境 (Java Runtime Enviroment) 的缩写。基本上和Java虚 拟机是同一个概念,但是也有显著区别,区别如下:
1.5 JRE与JVM的关系和区别:
The JRE package is intended for distribution with applications. It does not contain the tools.jar file that has the compiler and other command line tools. The reason Sun makes the distinction is to give developers a more compact set of files to distribute with a product. Also, JVM is the more generic name which can apply to any program which obeys the Java Virtual Machine Specification - whether it's made by Sun, IBM, Microsoft, or whoever. JRE on the other hand is the name for Sun's implementation of a JVM.
执行引擎
本地方法调用
主机操作系统
2.4 JVM的内部体系结构
程序的class文件 类装载器 子系统
方法区
堆区
Java栈 运行时数据区
Baidu Nhomakorabea
PC 寄存器
本地 方法栈
执行引擎
本地方法接口
本地 方法库
2.5 JVM的内部体系结构说明
运行时数据区的基本构成: JVM把运行程序所需要的字节码、方法参数、返回值、局部变量等信息组织到 一个内存区域,称为“运行时数据区”,细分为:方法区、堆区、Java栈、PC寄 存器、本地方法栈等。 每个java虚拟机实例都有一个方法区及一个堆区,由该实例中所有线程共享。 虚拟机装载class文件时,把解析的类型信息放入方法区;程序运行时,把创建 的对象放入堆区。 每个新线程被创建时,都会得到一个PC寄存器和一个Java栈。PC寄存器指示 下一条将被执行的Java指令,Java栈存储该线程中Java方法调用的状态,包括局部 变量、参数、返回值、运算的中间结果等。 本地方法栈用于存储本地方法调用的状态。
2.7 JVM的方法区
5)所有父接口全名的列表 类型全名保存的数据结构由虚拟机实现者定义。除此之外,Java虚拟机还要 为每个类型保存如下信息: 1)类型的常量池(The constant pool for the type) 2)类型字段的信息(Field information) 3)类型方法的信息(Method information) 4)所有的静态类变量(非常量)信息(All class (static) variables declared in the type, except constants) 5)一个指向类加载器的引用(A reference to class ClassLoader) 6)一个指向Class类的引用(A reference to class Class)
1. JVM相关概念
1.6 什么是JDK: JDK 是Java开发工具包 (Java Development Kit ) 的缩写。它是一种用于构 建在Java 平台上发布的应用程序、applet和组件的开发环境。 JDK是一切java应用程序的基础,所有的java应用程序是构建在这个之上的。它 是一组API,也可以说是一些java Class。 JDK JRE JVM之间的关系:
1. JVM相关概念
1.7 JVM的生命周期 当启动一个Java程序时,一个虚拟机实例也就产生了。 当程序关闭退出,该虚 拟机实例也就随之消亡。如果在同一台计算机上同时运行三个Java程序,则会有三 个JVM实例。每个Java程序都运行于它自己的JVM实例中。 JVM实例通过调用某个初始类的public static void main(String[] args)方法 来运行一个Java程序。 Java程序初始类中的main()方法,将作为该程序初始线程的起点,任何其他线 程都是由这个初始线程启动的。 Java虚拟机内部有两种线程:守护线程和非守护线程,守护线程通常是由虚拟 机自己使用的,比如垃圾回收线程。Java 程序中开始main()方法的初始线程,是非 守护线程,但是也可以标记为守护线程. 只要还有任何非守护线程在运行,这个Java程序就会继续运行,虚拟机依然存 活。所有非守护线程都终止时,虚拟机实例将自动退出。 若安全管理器允许,程序自身也可调用Runtime类或System类的exit()方法退出, 从而终结虚拟机实例。
二、JVM实现机制
2.1 JVM体系结构概述
在Java虚拟机的规范中定义了一系列的子系统、内存区域、数据类型和使用指 南。这些组件构成了Java虚拟机的内部结构,他们不仅仅为Java虚拟机的实现提供 了清晰的内部结构,更是严格规定了Java虚拟机实现的外部行为。 每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责 加载程序中的类型(类和接口),并赋予唯一的名字。 每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中 包含的指令。 程序的执行需要一定的内存空间,如字节码、被加载类的其他额外信息、程序 中的对象、方法的参数、返回值、本地变量、处理的中间变量等等。Java虚拟机将 这些信息统统保存在数据区(data areas)中。虽然每个Java虚拟机的实现中都包含 数据区,但是Java虚拟机规范对数据区的规定却非常的抽象。 数据区中的一部分是整个程序共有,其他部分被单独的线程控制。每一个Java 虚拟机都包含方法区(method area)和堆(heap),他们都被整个程序共享。 Java虚拟机加载并解析一个类以后,将从类文件中解析出来的信息保存与方法区中。 程序执行时创建的 对象都保存在堆中。
3. JVM相关专题
3.1 java性能准则 3.2 java同步问题 3.3 java对象创建 3.4 String对象 3.5 java沙箱
一、JVM相关概念
1. JVM相关概念
1.1 什么是JVM
JVM 是Java虚拟机(Java Virtual Machine)的缩写,是一个虚构出来的计算 机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有 自己完善的虚拟硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。 谈到Java虚拟机时,可能是指: 1. 抽象的Java虚拟机规范 2. 一个具体的Java虚拟机实现 3. 一个运行的Java虚拟机实例 本ppt主要讲解Java虚拟机的具体实现机制
1.2 JVM的基本原理
JVM屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在 Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器 指令执行。
1. JVM相关概念
1.3 JVM的配置问题:
具体内容如下: 1)类型的常量池(The constant pool for the type) 常量池中保存中所有类型是用的有序的常量集合,包含直接常量(literals) 如字符串、整数、浮点数的常量和对类型、字段、方法的符号引用。常量池 中每一 个保存的常量都有一个索引,就像数组中的字段一样。因为常量池中保存中所有类 型使用到的类型、字段、方法的字符引用,所以它也是动态连接的主要对 象。
2.7 JVM的方法区
2)类型字段的信息(Field information) 字段名、字段类型、字段的修饰符(public,private,protected,static, final,volatile,transient等)、字段在类中定义的顺序。 3)类型方法的信息(Method information) 方法名、方法的返回值类型(或者是void)、方法参数的个数、类型和他们的 顺序、字段的修饰符(public,private,protected,static,final,volatile, transient等)、方法在类中定义的顺序 如果不是抽象和本地本法还需要保存方法的字节码、方法的操作数堆栈的大小 和本地变量区的大小、异常列表。 4)类(静态)变量(Class Variables) 类变量被所有类的实例共享,即使不通过类的实例也可以访问。这些变量绑定 在类上(而不是类的实例上),所以他们是类的逻辑数据的一部分。在Java虚拟机 使用这个类之前就需要为类变量(non-final)分配内存。 常量(final)的处理方式于这种类变量(non-final)不一样。每一个类型在用 到一个常量的时候,都会复制一份到自己的常量池中。常量也像类变 量一样保存在 方法区中,只不过他保存在常量池中。(可能是,类变量被所有实例共享,而常量 池是每个实例独有的)。Non-final类变量保存为定义它的 类型数据(data for the type that declares them)的一部分,而final常量保存为使用它的类型数据(data for any type that uses them)的一部分。