java-jvm虚拟机原理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java虚拟机生命周期
每运行一个java程序,便得到JAVA虚拟机 的实例 每个Java程序都运行于它自己的Java虚拟 机实例中 当程序关闭退出,这个虚拟机实例也就随 之消亡 程序本身也能够通过调用Runtime类或者 System类的exit()方法退出。
Java虚拟机体系结构
在Java假虚拟机规范中,一个虚拟机实例 的行为时分别按照子系统、内存区、数据 类型以及指令这几个术语来描述的。这些 组成部分一起展示了抽象的虚拟机的内部 抽象体系结构。
栈帧 栈帧由三部分组成:局部变量区、操作数 栈和帧数据区
Java 的class文件
Class文件的内容
在class文件中,可变长度项的大小和长度 位于其实际数据之前,这个特性使得class 文件数据流可以被顺序解析,首先读出项 的大小,然后读出项数据 1.magic(魔数) 4个字节 2.minor_version和major_version 4个字节 3.constant_pool_count 和 constant_pool 4.access_flags 2个字节 5.this_class 2个字节
Java中的类加载双亲委派机制
JVM在加载类时默认采用的是【双亲委派 机制】。通俗的讲,就是某个特定的类加 载器在接到加载类的请求时,首先将加载 任务委托给父类加载器,依次递归,如果 父类加载器可以完成类加载任务,就成功 返回;只有父类加载器无法完成此加载任 务时,才自己去加载。
java中的类执行机制
所讲内容尽供参考, 如有错误码,敬请更正
JVM内存回收
根集(root set): 所谓根集就是正在执行的Java程序可以访问的引 用变量的集合(包括局部变量、参数、类变量), 程序可以使用引用变量访问对象的属性和调用对 象的方法。垃圾收集首选需要确定从根开始哪些 是可达的和哪些是不可达的,从根集可达的对象 都是活动对象,它们不能作为垃圾被回收,这也 包括从根集间接可达的对象。而根集通过任意路 径不可达的对象符合垃圾收集的条件,应该被回 收
java虚拟机原理介绍
目录
Java虚拟机 1.java虚拟机的生命周期 2.java虚拟机的体系结构 Java class文件 1.magic(魔数) 2.minor_version和major_version 3.constant_pool_count和constant_pool
类型的生命周期 1.类型的装载、连接和初始化 2.对象的生命周期 3.卸载类型 连接模型 动态连接和解析 垃圾收集
3)方法表
运行时数据区—java中的堆
堆 1)同一个java应用所有的线程共享堆空间(由于每一个java程序独占一个java虚拟 机实例,因面每个java程序都有它自己的堆空间) 堆空间可以分为三部分:一个Eden区,Survivor区和 truned区 2)由new操作符创建的对象均位于堆中
运行时数据区--Java中的栈
每启动一个新的线程,java虚拟机都会为它分配一个java 栈,java栈上的都是此线程私有的 每当启用一个线程时,JVM就为他分配一个Java栈,栈是 以帧为单位保存当前线程的运行状态。【当前方法,当前 帧,当前类,当前常量池】 每当线程调用一个Java方法时,JVM就会在该线程对应的 栈中压入一个帧,这个帧自然就成了当前帧。当执行这个 方法时,它使用这个帧来存储参数、局部变量、中间运算 结果等等。 Java栈上的所有数据都是私有的。任何线程都不能访问另 一个线程的栈数据。 Java栈和帧在内存中也不必是连续的,帧可以分布在连续 的栈里,也可以分布在堆里
Java字节码的执行是由JVM执行引 擎来完成,流程图如下所示:
class文件由以下部分组成: 1.结构信息 包括class文件格式版本号及各部分的数量与大小的信息 2.元数据 对应于Java源码中声明与常量的信息。包含类/继承的 超类/实现的接口的声明信息、域与方法声明信息和常量 池 3.方法信息。 对应Java源码中语句和表达式对应的信息。包含字节码、 异常处理器表、求值栈与局部变量区大小、求值栈的类型 记录、调试符号信息
java类的生命周期
装载:就是把二ຫໍສະໝຸດ Baidu制形式的java类型读入java虚拟机中
验证: 准备:为类变量分配内存,设置默认值。但是在到达初始化 之前,类变量都没有初始化为真正的初始值 解析:解析过程就是在类型的常量池中寻找类、接口、字段 和方法的符号引用,把这些符号引用替换成直接引用 的过程在符号引用被程序首次使用之前,连接这个步骤 都是可选的 初始化: 为类变量赋予正确的初始值
JVM是基于栈的体系结构来执行class字节 码的。线程创建后,都会产生程序计数器 (PC)和栈(Stack),程序计数器存放下 一条要执行的指令在方法内的偏移量,栈 中存放一个个栈帧,每个栈帧对应着每个 方法的每次调用,而栈帧又是有局部变量 区和操作数栈两部分组成,局部变量区用 于存放方法中的局部变量和参数,操作数 栈中用于存放方法执行过程中产生的中间 结果。
运行时数据区--方法区
1)所有的线程都共享方法区,方法区必须被设计为线程安全的,方法区 大小不固定 2)方法区 存储以下类型信息:
类的全限定名 超类的全限定名 是接口还是类 类的访问修饰修饰符 该类的【常量池】 字段信息 方法信息 类(静态)变量 :类变量是由所有类实例共享的,即使没有类实例,也 可以访问 一个到类ClassLoader引用 一个到类的引用
Java中的类加载机制
Java中的类加载机制
JVM的类加载是通过ClassLoader及其子类 来完成的,类的层次关系和加载顺序可以 由下图来描述:
Bootstrap ClassLoader /启动类加载器 $JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现, 不是ClassLoader子类 Extension ClassLoader/扩展类加载器 负责加载java平台中扩展功能的一些jar包,包括 $JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下 的jar包 App ClassLoader/ 系统类加载器 负责加载classpath中指定的jar包及目录中class Custom ClassLoader/用户自定义类加载器(java.lang. ClassLoader的子类) 属于应用程序根据自身需要自定义的ClassLoader,如 tomcat、jboss都会根据j2ee规范自行实现ClassLoader
Sun的JVMGenerationalCollecting算法
Sun的JVMGenerationalCollecting(垃圾回收) 原理是这样的:把对象分为年青代(Young)、 年老代(Tenured)、持久代(Perm),对不同 生命周期的对象使用不同的算法。(基于对 对象生命周期分析)
1.Young(年轻代) 年轻代分三个区。一个Eden区,两个Survivor区。大部分 对象在Eden区中生成。当Eden区满时,还存活的对象将 被复制到Survivor区(两个中的一个),当这个Survivor 区满时,此区的存活对象将被复制到另外一个Survivor区, 当这个Survivor去也满了的时候,从第一个Survivor区复 制过来的并且此时还存活的对象,将被复制年老区 (Tenured。需要注意,Survivor的两个区是对称的,没先 后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年 老区的只有从第一个Survivor去过来的对象。而且, Survivor区总有一个是空的。 2.Tenured(年老代) 年老代存放从年轻代存活的对象。一般来说年老代存放的 都是生命期较长的对象。 3.Perm(持久代) 用于存放静态文件,如今Java类、方法等。持久代对垃 圾回收没有显著影响,但是有些应用可能动态生成或者调 用一些class,
类实例化: 为新的对象分配内存 为实例变量赋默认值 为实例变量赋正确的初始值 java编译 器为它编译的每一个类都至少生成一个实例初始化 方法,在java的class文件中,这个实例初始化方法被称为 ”<init>“。针对源代码中每一个类的构造方法,java编译器都 产生一个<init>方法
JVM内存回收
常用的算法:
1、 引用计数法(Reference Counting ollector) 2、tracing算法(Tracing Collector) 3、compacting算法(Compacting Collector) 4、copying算法(Coping Collector) 5、generation算法(Generational Collector) 6、adaptive算法(Adaptive Collector)
6.super_class 7.interfaces_count 和interfaces 8.fields_count 和 fields 9.methods_count 和 fields 10.attributes_count 和 attributes
2个字节
Java代码编译和执行的整个过程包含了以下三个重 要的机制: 1.Java源码编译机制 2.类加载机制 3.类执行机制 Java代码编译是由Java源码编译器来完成,流程图 如下所示: