Java虚拟机工作原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
As the Java Virtual Machine is a stack-based machine, almost all of its instructions involve the operand stack in some way. Most instructions push values, pop values, or both as they perform their functions.
Java虚拟机是基于栈的(stack-based machine)。几乎所有的java虚拟机的指令,都与操作数栈(operand stack)有关.绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。
1Java体系结构介绍
Javaís architecture arises out of four distinct but interrelated technologies, each of which is defined by a separate specification from Sun Microsystems:
1.1 Java体系结构包括哪几部分?
Java体系结构包括4个独立但相关的技术
the Java programming language →程序设计语言
the Java class file format →字节码文件格式
the Java Application Programming Interface→应用编程接口
the Java Virtual Machine →虚拟机
1.2 什么是JVM
java虚拟机和java API组成了java运行时。
1.3 JVM的主要任务。
Java虚拟机的主要任务是装载class文件并执行其中的字节码。
Java虚拟机包含了一个类装载器。
类装载器的体系结构
二种类装载器
启动类装载器
用户定义的类装载器
启动类装载器是JVM实现的一部分
当被装载的类引用另外一个类时,JVM就是使用装载第一个类的类装载器装载被引用的类。
1.4 为什么java容易被反编译?
●因为java程序是动态连接的。从一个类到另一个类的引用是符号化的。在静态连接的
可执行程序中。类之间的引用只是直接的指针或者偏移量。相反在java的class文件中,指向另一个类的引用通过字符串清楚的标明了所指向的这个类的名字。
●如果引用是指向一个字段的话。这个字段的名字和描述符(字段的类型)会被详细说明。
●如果引用指向一个成员方法,那么这个成员方法的名字和描述符(方法的返回值类型,
方法参数的数量和类型)会被详细说明。
●包含对自己字段和成员方法的符号引用。
●包含可选的调试信息。(包括局部变量的名称和类型)
1.5 垃圾回收器缺点:
无法确认什么时候开始回收垃圾,无法确认是否已经开始收集,也无法确认要持续多长时间2平台无关
3安全
4网络移动性
5Java虚拟机
●每个JVM都有一个类装载子系统。
●运行时数据区:方法区,堆,java栈,pc寄存器,本地方法栈
●每个JVM实例都有一个方法区和堆。他们是由该虚拟机中所有线程共享的。
●每个线程都会得到自己的pc寄存器和java栈,
⏹pc寄存器的值指示下一条将被执行的指令。
⏹java栈记录存储该线程中java方法调用的状态。(包括局部变量,参数,返回值,
运算的中间结果。)
⏹这些内存区域是私有的。任何线程都不能访问另一个线程的pc寄存器和java栈
●java栈由许多栈帧组成。一个栈帧包含一个java方法的调用的状态。
⏹当线程调用一个方法的时候,虚拟机压入一个新的栈桢到该线程的java栈中。
⏹当方法返回时,这个栈桢被从java栈中弹出并抛弃。
●引用有3中,类类型,接口类型,数组类型。
●JVM中,最基本的数据单元是字。至少选择32位作为字长。
●JVM有两种类装载器:
⏹启动类装载器(JVM实现的一部分,每个JVM都必须有一个)
⏹用户自定义的类装载器(JA V A程序的一部分,必须继承ng.CloassLoader)。
●由不同的类装载器装载的类被放在虚拟机内部的不同的命名空间中。
●方法区:
⏹大小不固定,根据需要动态调整
⏹方法区可以被垃圾回收
⏹包含
◆提取装载的类的信息,放到方法区
●JVM总能通过存储于方法区的内存信息来确定一个对象需要多少内存
◆类的静态变量也放到方法区。
⏹虚拟机为装载的每个类存储如下信息:
◆这个类型的全限定名
◆这个类型的直接超类的全限定名
◆这个类型是类类型还是接口类型
◆这个类的访问权限修饰符
◆任何直接超接口的全限定名的有序列表
◆该类型的常量池
●该类型所用常量的一个有序集合,包括直接常量(String,Integer,floating
point),和对其他类型,字段,方法的符号引用
◆字段信息
●字段名
●字段类型
●字段的修饰符
●声明的顺序
◆方法信息
●方法名
●方法的返回值类型
●方法的参数和类型,顺序
●方法的修饰符
●方法的操作码
●操作数栈和该方法的栈帧中局部变量区的大小
●异常表
◆除了常量以外的所有类(静态)变量
◆一个到类CloassLoader的引用
◆一个到Class类的引用
◆方法表
●虚拟机为每一个装载的非抽象类都生成一个方法表
●堆
◆
◆一个java程序独占一个JVM,一个JVM中只存在一个堆。所以,每个java
程序有它自己的堆,但同一个java程序的多个线程共享一个堆
◆运行时创建的所有类实例
◆数组对象
●垃圾回收器
◆回收内存
◆移动对象以减少碎片
◆不必是连续的内存,可以动态的扩展和收缩
◆一个JVM的实现的方法区可以在堆顶实现
●栈帧frame
◆栈帧由3部分组成:局部变量区,操作数栈,帧数据区。
◆局部变量区,操作数栈的大小在编译的时候就确定了。
◆局部变量区(variable Table)
●以字长为单位,从0开始计数的数组。
●int,float,reference,return address只占据一个字长
●byte,short,char存入数组前转换成int,占据一个字长
●long,double占据2个字长。