- 浏览: 250141 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (192)
- 技术研究学习 (19)
- 工作总结 (4)
- spring3.x (11)
- mail (2)
- jar (2)
- FCKeditor (1)
- quartz (2)
- json (1)
- jdbc (5)
- struts2 (6)
- java基础 (18)
- jboss (3)
- IT名称解析 (1)
- 测试工具 (2)
- 工作趣谈 (1)
- 数据库 (8)
- js (8)
- jquery (1)
- mysql (20)
- Sql (3)
- Oracle (1)
- easyui (0)
- log4j (1)
- 源码研究 (1)
- Jasper Report (0)
- Jbpm4 (4)
- xml (1)
- ireport (0)
- javavm (1)
- sitemesh (5)
- compass (1)
- jvm (1)
- ext (1)
- lucene (0)
- cxf (1)
- Blazeds (0)
- Resteasy (1)
- jaxb (1)
- tomcat (1)
- Rmi (1)
- BoneCP (1)
- velocity (3)
- OSCache (1)
- EHCache (1)
- 高性能开发 (9)
- 设计模式 (0)
- 网络协议应用 (1)
- Ibatis (1)
- powerdesigner (1)
- 架构师之路 (2)
- memcached (4)
- MapReduce (1)
- 测试组 (1)
- 图像处理 (2)
- LoadRunner (2)
- 报表 (1)
- 负载均衡 (1)
- 分布式 (3)
- c# (1)
- java中一些特殊问题 (3)
- java 8 (1)
- Mogodb (1)
- 项目设计与实现 (2)
- Ubuntu (1)
- eclipse (1)
- gradle (1)
- 私有云 (1)
- redis (1)
- 移动前端 (1)
最新评论
一. 运行时栈帧结构
1. 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的元素。栈帧存储了方法的局部变量,操作数栈,动态链接,方法返回地址等信息。
2. 对于执行引擎来讲,活动的线程,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。
局部变量表
1. 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在java程序被编译为Class文件时,在方法的Code属性的max_locals数据项中确定该方法所需要分配的最大局部变量表的容量。
2. 局部变量表的容量以变量槽:Slot为最小单位,这些Slot是可充用的。
3. 旁门索道
Public static void main(String[] args) {
{
Byte[] b = new Byte[64*1024*1024];
}
System.gc();
}
//这是并不能立马进行GC
Public static void main(String[] args) {
{
Byte[] b = new Byte[64*1024*1024];
}
Int a = 0;
System.gc();
}
//这是立马进行GC
操作数栈
1. 操作数栈是一个后入先出的栈。操作数栈的最大深度也是在编译时写入到Code的max_stacks数据项中。
2. 操作数栈的数据类型必须与字节码指令的序列严格匹配,否则会发生错误。
动态链接
1. 指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。
2. 静态解析:部分引用会在类加载阶段或第一次使用时转化为直接引用。
3. 动态解析:部分引用将在每一次的运行期间转化为直接引用。
方法返回地址
1. 执行引擎退出方法的途径:遇到任意一个方法返回的字节码指令--正常退出;方法执行过程中遇到了异常--异常退出。
2. 不论采用任何方式退出,在方法退出之后都需要返回到方法调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复他的上层方法的执行状态。
二. 方法调用
1. 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本,暂时不涉及方法内部的具体运行过程。
解析
1. 所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用。方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。
2. 符合"编译器可知,运行期不变"的方法:静态方法,私有方法。
3. 方法调用指令:
invokestatic
调用静态方法
invokespecial
调用实例够在其<init>方法、私有方法、父类方法
invokevirtual
调用所有的虚方法
invokeinterface
调用接口方法,会在运行时再确定一个实现此接口的对象
4. 使用的方法:静态方法,私有方法,实例构造器,父类方法。
5. 解析调用是一个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用转变为可确定的直接引用,不会延迟到运行期间去完成。
分派
1. 静态分派:所有依赖静态类型来定位方法执行版本的分派动作都是静态分配。静态分派发生在编译阶段,确定静态分配的动作实际上不是由虚拟机来执行的。有时候重载的版本并不是唯一的,但编译器只能确定一个更合适的版本。
2. 动态分派:在运行时期根据实际类型确定方法执行版本的分派过程称为动态分配。
3. 单分派和多分派根据分派基于多种宗量可以将分派划分为多分派和单分派(宗量:方法的接收者与方法的参数统称为方法的宗量)。
4. 静态分派属于多分派类型;动态分派属于单分派类型。
1. 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的元素。栈帧存储了方法的局部变量,操作数栈,动态链接,方法返回地址等信息。
2. 对于执行引擎来讲,活动的线程,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。
局部变量表
1. 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在java程序被编译为Class文件时,在方法的Code属性的max_locals数据项中确定该方法所需要分配的最大局部变量表的容量。
2. 局部变量表的容量以变量槽:Slot为最小单位,这些Slot是可充用的。
3. 旁门索道
Public static void main(String[] args) {
{
Byte[] b = new Byte[64*1024*1024];
}
System.gc();
}
//这是并不能立马进行GC
Public static void main(String[] args) {
{
Byte[] b = new Byte[64*1024*1024];
}
Int a = 0;
System.gc();
}
//这是立马进行GC
操作数栈
1. 操作数栈是一个后入先出的栈。操作数栈的最大深度也是在编译时写入到Code的max_stacks数据项中。
2. 操作数栈的数据类型必须与字节码指令的序列严格匹配,否则会发生错误。
动态链接
1. 指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。
2. 静态解析:部分引用会在类加载阶段或第一次使用时转化为直接引用。
3. 动态解析:部分引用将在每一次的运行期间转化为直接引用。
方法返回地址
1. 执行引擎退出方法的途径:遇到任意一个方法返回的字节码指令--正常退出;方法执行过程中遇到了异常--异常退出。
2. 不论采用任何方式退出,在方法退出之后都需要返回到方法调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复他的上层方法的执行状态。
二. 方法调用
1. 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本,暂时不涉及方法内部的具体运行过程。
解析
1. 所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用。方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。
2. 符合"编译器可知,运行期不变"的方法:静态方法,私有方法。
3. 方法调用指令:
invokestatic
调用静态方法
invokespecial
调用实例够在其<init>方法、私有方法、父类方法
invokevirtual
调用所有的虚方法
invokeinterface
调用接口方法,会在运行时再确定一个实现此接口的对象
4. 使用的方法:静态方法,私有方法,实例构造器,父类方法。
5. 解析调用是一个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用转变为可确定的直接引用,不会延迟到运行期间去完成。
分派
1. 静态分派:所有依赖静态类型来定位方法执行版本的分派动作都是静态分配。静态分派发生在编译阶段,确定静态分配的动作实际上不是由虚拟机来执行的。有时候重载的版本并不是唯一的,但编译器只能确定一个更合适的版本。
2. 动态分派:在运行时期根据实际类型确定方法执行版本的分派过程称为动态分配。
3. 单分派和多分派根据分派基于多种宗量可以将分派划分为多分派和单分派(宗量:方法的接收者与方法的参数统称为方法的宗量)。
4. 静态分派属于多分派类型;动态分派属于单分派类型。
发表评论
-
java集合查询测试结果
2013-06-08 09:41 1148package test.com; import j ... -
对象池修订版
2013-03-08 14:09 0public class ObjectPool { ... -
深入研究java.lang.Process类
2013-03-07 12:07 857一、概述 Process ... -
深入研究java.lang.Runtime类
2013-03-07 11:54 971一、概述 Runtime ... -
JAVA图像缩放处理
2012-11-09 16:33 915import java.awt.image.Buffere ... -
oa
2012-10-19 18:03 0http://code.google.com/p/joffic ... -
Frameset导致Cookies和Session丢失的原因及解决办法
2012-09-29 11:27 75311.Frameset导致Cookies和Session丢失 ... -
java synchronized详解
2012-09-29 11:28 821来源:http://www.cnblogs.com/GnagW ... -
长连接与短连接
2012-09-29 11:29 1043来源:http://www.cnblogs.com ... -
java实时监测文件夹的变化,允许多用户同时访问,完成文件转移
2012-10-04 09:26 1192来源:http://www.189works.com/arti ... -
jndi调用时,各种应用服务器InitialContext的写法
2012-09-27 11:12 949调用ejb时,如果客户端和ejb不在同一个jvm,就要 ... -
ClassWorking技术
2012-08-16 12:25 1373ClassWorking技术 IBM所提出的,动态地监测、修 ... -
动态加载class文件
2012-08-16 12:26 8591.参考老外: public class ClassPat ... -
quartz-scheduler的集群化配置
2012-08-13 09:33 1692由于集群只能工作在JDBC-Jobstore(JobStore ... -
dbcp连接池实现
2012-08-09 13:10 1644dbcp连接池实现commons DBCP 配置参数简要说明 ... -
常用jar包之commons-beanutils使用
2012-08-20 14:07 1459核心提示:Jakarta Commons 项目提供了相当丰富的 ... -
aop详解
2012-08-09 13:09 1335使用Spring进行面向切面 ... -
Dwr2+Struts2+Spring2.5+Hibernate3整合
2012-08-08 12:33 9671.//如果不用,启动时不会出错,但使用Dwr时,会抛出异常: ... -
AOP面向编程的使用场合
2012-08-07 20:45 977AOP(Aspect-Oriented Programming ... -
23种设计模式详解
2012-08-08 13:41 1370Java中23种设计模式 目录 1. 设计模式 3 1. ...
相关推荐
Java虚拟机(JVM)面试题(总结最全面的面试题!...能不能解释一下方法区(重点理解)什么是JVM字节码执行引擎你听过直接内存吗?知道垃圾收集系统吗?堆栈的区别是什么?深拷贝和浅拷贝Java会存在内存泄漏吗?请说 收
Java虚拟机(JVM)的执行引擎是Java程序运行的核心组件,它负责解析并执行Java字节码。执行引擎的工作流程涉及多个阶段,包括编译和解释,以确保代码在各种硬件平台上高效运行。 首先,Java代码被编译为字节码,这...
5. **执行**: JVM字节码执行引擎开始执行`main`方法。 #### 类加载的时机 类加载发生在以下情况: - 当代码中使用到某个类时。 - 当JVM启动时,会首先找到包含`main`方法的类,并将其加载到JVM内存中,然后执行`...
总之,JVM执行引擎通过解释或编译字节码,利用栈帧、局部变量表、操作数栈等机制来执行Java方法,同时通过符号引用解析和分派策略实现动态绑定和多态性。这一系列机制确保了Java程序的高效运行和跨平台兼容性。
通过对JVM执行子系统原理的深入分析,我们不仅了解了Class文件的具体结构和字节码指令的基本概念,还探讨了类加载机制的各个环节以及字节码执行引擎的核心组成部分。这些知识点对于深入理解JVM的工作原理、优化程序...
4. **执行引擎**:JVM的执行引擎是解析和执行字节码的核心,包括解释器和即时编译器(JIT)。书里会介绍如何通过编译策略和优化技术提升程序的运行效率。 5. **垃圾收集**:Java的一大优势是自动内存管理,而垃圾...
这些指令共同构成了JVM字节码指令集,是Java程序运行时的基础。了解这些指令有助于深入理解Java程序的运行机制,并有助于性能调优和错误排查。由于文档内容中存在OCR技术导致的错误和遗漏,因此在实际分析字节码时,...
"JVM字节码简介"这个会话可能深入探讨了如何理解和分析Java字节码,以提升程序性能、进行反编译或优化。源代码通常包括用于解释和演示这些概念的示例。 Java字节码是编译后的程序代码,它是平台无关的,由Javac...
这显示了JVM如何通过字节码执行简单的方法调用。 总之,Java字节码技术是Java平台的基石,它在软件开发、性能优化、语言实现等多个方面都发挥着关键作用。深入理解字节码可以帮助开发者更好地利用JVM的功能,并提高...
字节码执行引擎则是JVM的心脏,它通过解释器或即时编译器(JIT)将字节码转换为机器码。JIT技术能够在运行时动态优化代码,显著提升性能。此外,JVM的垃圾收集机制是其内存管理的关键,它自动回收不再使用的对象,...
字节码执行引擎是执行子系统的核心部分,它将字节码指令转换成机器码执行。JVM中的执行引擎是抽象的,它可以采用即时编译(JIT)技术将字节码直接编译成本地机器码执行,也可以采用解释执行,逐条解释字节码指令。 ...
然而,这个简单的实现旨在帮助初学者理解JVM的基本工作原理,通过实践加深对Java字节码执行的理解。 总结来说,"JVM.rar_jvm_jvm 实现"项目是一个简化版的Java虚拟机实现,重点关注了基本的字节码解析、操作数栈的...
执行引擎是 JVM 的核心组成部分,它负责读取运行时数据区的字节码,并逐个执行它们。执行引擎可以分为两种类型:解释器和 JIT 编译器。解释器可以更快地解释字节码,但执行缓慢。JIT 编译器可以消除解释器的缺点,它...
* 执行引擎:负责执行字节码文件。 Java 栈 Java 栈是一个抽象概念,用于存储线程的执行状态和局部变量。Java 栈的主要组件包括: * 栈帧:用于存储方法的执行状态和局部变量。 * 操作数栈:用于存储操作数和...
Java代码的编译和执行涉及从源代码到字节码的转换,再到JVM执行引擎解释执行字节码的过程。Java源码编译机制包括三个主要步骤:分析和输入到符号表、注解处理和语义分析、生成class文件。生成的class文件包含了类的...
JVM的执行引擎是JVM的核心组件之一,它负责执行字节码文件中的指令。执行引擎将字节码翻译成底层系统指令,再交由CPU去执行。 JVM的本地方法接口是JVM的核心组件之一,它负责调用其他语言的接口,与本地资源交互。 ...
Java代码编译后生成的字节码,是与平台无关的中间码,通过JVM的执行引擎可以将字节码转换成具体平台上的机器码执行。字节码技术保证了Java程序的“一次编写,到处运行”。 类加载机制是Java语言中的一个核心概念,...
执行引擎负责解释或即时编译字节码,执行程序逻辑。 在JVM的工作过程中,运行时数据区(也称为Java堆内存)是另一个重要的概念。它分为以下区域: - **堆**:存储所有实例对象和数组。Java垃圾收集器负责管理堆...