深入理解Java虚拟机(JVM高级特性与最佳实践)
- 格式:pdf
- 大小:899.86 KB
- 文档页数:5
第1章走近Java1.2 Java技术体系1.Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(JavaDevelopment Kit),JDK是用于支持Java程序开发的最小环境。
1.4 Java虚拟机发展史1.4.1 Sun Classic / Exact VM1.Exact VM因它使用准确式内存管理而得名,即虚拟机可以知道内存中某个位置的数据具体是什么类型。
譬如内存中有一个32位的整数123456,它到底是一个reference类型指向123456的内存地址还是一个数值为123456的整数,虚拟机将有能力分辨出来,这样才能在GC的时候准确判断堆上的数据是否还可能被使用。
由于使用了准确式内存管理,Exact VM可以抛弃以前Classic VM基于handler的对象查找方式,这样每次定位对象都烧了一次间接查找的开销,提升执行性能。
1.4.2 Sun HotSpot VM1.HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。
如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。
1.4.6 Apache Harmony / Google Android Dalvik VM1.Dalvik VM并不是一个Java虚拟机,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。
但是它与Java又有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API 等。
1.5 展望Java技术的未来1.函数式编程的一个重要优点就是这样的程序天然地适合并行运行。
第2章Java内存区域与内存溢出异常2.2 运行时数据区域2.2.4 Java堆1.此内存区域(Java堆)的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
计算机入门书籍推荐1.Python灰帽子2.C#开发宝典3.编译原理(第2版)(龙书)4.深入理解Linu某内核(第3版)5.数据库系统导论(原书第8版)6.EffectiveJava中文版(第2版)7.Linu某内核编程8.提高C++性能的编程技术9.人月神话10.UNI某环境高级编程(第2版)11.大话设计模式12.Java编程(第4版)13.浪潮之巅14.C++编程思想第1卷15.PHP&MySQLWeb数据库应用开发指南(第2版)16.设计模式:可复用面向对象软件的基础17.算法导论(第2版)18.从网管员到CTO:网络设备配置与管理实战详解19.自动机理论、语言和计算导论20.C++Primer中文版(第4版)21.现代编译原理:C语言描述(虎书)22.UNI某网络编程卷2:进程间通信23.编程珠玑(第2版)、编程珠玑(续)24.Linu某内核设计的艺术:图解Linu某操作系统架构设计与实现原理25.国外计算机科学经典教材:Uni某&Linu某大学教程框架程序设计27.C++标准程序库:自修教程与参考手册28.深入理解Java虚拟机:JVM高级特性与最佳29.深入理解计算机系统(修订版)31.Java核心技术卷2:高级特性32.PHP经典实例(第2版)33.代码之美34.深入理解计算机系统(原书第2版)35.Java核心技术卷1:基础知识36.软件随想录:程序员部落酋长Joel谈软件37.EffectiveC++中文版38.C程序设计语言(第2版新版)39.架构之美40.UNI某网络编程卷1:套接字联网API41.软件框架设计的艺术42.UNI某编程艺术43.设计原本:计算机科学巨匠FrederickP.Brook的思考44.Python参考手册(第4版)45.代码整洁之道46.黑客与画家:硅谷之父PaulGraham文集47.高级编译器设计与实现(鲸书).编程之美:微软面试心得49.WCF服务编程:.NET开发者决战SOA的制胜利剑(第3版)50.软件架构的艺术。
深入理解java虚拟机(一)虚拟机内存划分Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区。
这些区域有不同的特性,起不同的作用。
它们有各自的创建时间,销毁时间。
有的区域随着进程的启动而创建,随着进程结束而销毁,有的则始终贯穿虚拟机整个生命周期。
Java虚拟机运行时内存区域主要分为七部分,分别是:程序计数器,Java虚拟机栈,本地方法栈,方法区,Java堆,运行时常量池,直接内存。
如上图所示(图片来源于网络):蓝色区域包裹的部分为运行时几个数据区域:白色的部分为线程私有的,既随着线程的启动而创建。
每个线程都拥有各自的一份内存区域。
它们是:JAVA栈(JAVA STACK),本地方法栈(NATIVE METHOD STACK),和程序计数器(PROGRAM COUNTER REGISTER)。
黄色部分是线程共享的,所有的线程共享该区域的内容。
他们是:方法区(METHOD AREA),堆(HEAP)。
我们分别来介绍这些区域。
(1)程序计数器(program counter register)学过计算机组成原理的都知道计算机处理器中的程序计数器。
当处理器执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。
与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。
此后经过分析指令,执行指令。
完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。
处理器的程序计数器是指寄存器,而java程序计数器是指一小块内存空间。
java代码编译字节码之后,虚拟机会一行一行的解释字节码,并翻印成本地代码。
这个程序计数器盛放的就是当前线程所执行字节码的行号的指示器。
在虚拟机概念模型中,字节码解释器工作室就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等都依赖于它。
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此为了线程切换后还能恢复执行位置,每条线程都需要一个独立的程序计数器。
1、深入理解Java虚拟机:JVM高级特性与最佳实践如果你不满足于做一个只会写if…else…的Java程序员,而是希望更进一步,我随便举几个例子吧:1. 了解Java代码的底层运行机制2. 定位性能问题3. 对整个系统进行性能调优4. 解决各种奇奇怪怪的线上线下问题5. 更加高级别的,为自己的项目量身定做一款适合自己项目的虚拟机那么Java虚拟机是你必学的一门技术。
《深入理解Java虚拟机:JVM高级特性与最佳实践》作者是周志明,这本书可以说是国内写得最好的有关Java虚拟机的书籍,近半年,前前后后这本书我起码看了有5遍。
国内写虚拟机的书除了这本,其实还有一些其他的,我也买过,不过粗略看下来,很多内容也是《深入理解Java虚拟机:JVM高级特性与最佳实践》此书里面的。
另外值得一提的是,《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书,有电子版的,网上搜一下就能下载到了。
不过建议有兴趣的朋友还是去买书看,电子版本下载到的一般是比较老的版本,相比最新修订版的《深入理解Jav a虚拟机:JVM高级特性与最佳实践》,有很多作者新补充的知识点是没有的。
2、HotSpot实战所有的Java虚拟机都是遵循着Java虚拟机规范来的,市面上的Java虚拟机几十款,《深入理解Java虚拟机:JVM高级特性与最佳实践》一书里面讲的虚拟机并不针对某种特定的虚拟机,而是从Java虚拟机规范的角度来讲解Java虚拟机。
我们平时使用的乃至商用的大多数Java虚拟机都是Sun公司的HotSpot,大家cmd进入命令行,使用”java -version”命令就可以看到了。
如果希望在Java虚拟机规范的基础上更加深入地去理解虚拟机的一些细节是怎么实现的,就可以看一下《HotSpot实战》一书,作者是陈涛。
不过由于HotSpot的源码都是C/C++写的,所以要求读者有非常好的C/C++基础,如果对这两门语言不是很熟悉的朋友,看这本书可能对你帮助不是很大。
计算机专业必读书籍计算机专业要读哪些书籍呢?下面是店铺精心为您整理的计算机专业必读书籍,希望您喜欢!一些经典的计算机书籍算法导论(第2版)代码大全(第2版)C++ Primer中文版(第4版)设计模式:可复用面向对象软件的基础浪潮之巅Java编程思想(第4版)Java核心技术卷1:基础知识Java核心技术卷2:高级特性人月神话Linux内核编程C程序设计语言(第2版新版)黑客与画家:硅谷创业之父Paul Graham文集编程之美:微软技术面试心得代码之美软件随想录:程序员部落酋长Joel谈软件架构之美国外计算机科学经典教材:Unix & Linux大学教程深入理解计算机系统(原书第2版)UNIX网络编程卷1:套接字联网APIUNIX网络编程卷2:进程间通信自动机理论、语言和计算导论软件架构的艺术Effective C++中文版Effective Java中文版(第2版)PHP & MySQL Web数据库应用开发指南(第2版)PHP经典实例(第2版)C++ 编程思想第1卷C++ 编程思想第2卷两卷合订本Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理数据库系统导论(原书第8版)Python参考手册(第4版)Python灰帽子提高C++性能的编程技术从网管员到CTO:网络设备配置与管理实战详解深入理解计算机系统(修订版)UNIX编程艺术深入理解Java虚拟机:JVM高级特性与最佳实践框架程序设计代码整洁之道编程珠玑(第2版)、编程珠玑(续)大话设计模式C#开发宝典深入理解Linux内核(第3版)UNIX环境高级编程 (第2版)WCF服务编程:.NET开发者决战SOA的制胜利剑(第3版)现代编译原理:C语言描述 (虎书)高级编译器设计与实现 (鲸书)编译原理(第2版)(龙书)Windows核心编程 (第5版)C++标准程序库:自修教程与参考手册设计原本:计算机科学巨匠Frederick P.Brooks的思考软件框架设计的艺术计算机专业人士必读好书(30本经典)1. 《代码大全》史蒂夫·迈克康奈尔推荐数:1684“优秀的编程实践的百科全书,《代码大全》注重个人技术,其中所有东西加起来,就是我们本能所说的“编写整洁的代码”。
深入理解java虚拟机《深入理解Java虚拟机:JVM高级特性与最佳实践》内容简介:作为一位Java程序员,你是否也曾经想深入理解Java虚拟机,但是却被它的复杂和深奥拒之门外?没关系,本书极尽化繁为简之妙,能带领你在轻松中领略Java虚拟机的奥秘。
本书是近年来国内出版的唯一一本与Java虚拟机相关的专著,也是唯一一本同时从核心理论和实际运用这两个角度去探讨Java虚拟机的著作,不仅理论分析得透彻,而且书中包含的典型案例和最佳实践也极具现实指导意义。
全书共分为五大部分。
第一部分从宏观的角度介绍了整个Java技术体系的过去、现在和未来,以及如何独立地编译一个OpenJDK7,这对理解后面的内容很有帮助。
第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见的虚拟机的监控与调试工具的原理和使用方法。
第三部分分析了虚拟机的执行子系统,包括Class的文件结构以及如何存储和访问Class中的数据;虚拟机的类创建机制以及类加载器的工作原理和它对虚拟机的意义;虚拟机字节码的执行引擎以及它在实行代码时涉及的内存结构。
第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果。
第五部分探讨了Java实现高效并发的原理,包括JVM 内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。
本书适合所有Java程序员、系统调优师和系统架构师阅读。
[1]图书目录前言致谢第一部分走近Java第1章走近Java / 21.1 概述/ 21.2 Java技术体系 / 31.3 Java发展史/ 51.4 展望Java技术的未来/ 91.4.1 模块化/ 91.4.2 混合语言/ 91.4.3 多核并行/ 111.4.4 进一步丰富语法/ 121.4.5 64位虚拟机 / 131.5 实战:自己编译JDK / 131.5.1 获取JDK源码/ 131.5.2 系统需求/ 141.5.3 构建编译环境/ 151.5.4 准备依赖项/ 171.5.5 进行编译/ 181.6 本章小结/ 21第二部分自动内存管理机制第2章Java内存区域与内存溢出异常/ 24 2.1 概述/ 242.2 运行时数据区域/ 252.2.1 程序计数器 / 252.2.2 Java虚拟机栈/ 262.2.3 本地方法栈/ 272.2.4 Java堆/ 272.2.5 方法区/ 282.2.6 运行时常量池/ 292.2.7 直接内存/ 292.3 对象访问/ 302.4 实战:OutOfMemoryError异常/ 32 2.4.1 Java堆溢出/ 322.4.2 虚拟机栈和本地方法栈溢出 / 352.4.3 运行时常量池溢出/ 382.4.4 方法区溢出/ 392.4.5 本机直接内存溢出 / 412.5 本章小结/ 42第3章垃圾收集器与内存分配策略/ 43 3.1 概述/ 433.2 对象已死?/ 443.2.1 引用计数算法/ 443.2.2 根搜索算法/ 463.2.3 再谈引用/ 473.2.4 生存还是死亡?/ 483.2.5 回收方法区/ 503.3 垃圾收集算法/ 513.3.1 标记-清除算法/ 513.3.2 复制算法/ 523.3.3 标记-整理算法/ 543.3.4 分代收集算法/ 543.4 垃圾收集器/ 553.4.1 Serial收集器 / 563.4.2 ParNew收集器 / 573.4.3 Parallel Scavenge收集器/ 593.4.4 Serial Old收集器/ 603.4.5 Parallel Old收集器/ 613.4.6 CMS收集器 / 613.4.7 G1收集器 / 643.4.8 垃圾收集器参数总结/ 643.5 内存分配与回收策略/ 653.5.1 对象优先在Eden分配/ 663.5.2 大对象直接进入老年代/ 683.5.3 长期存活的对象将进入老年代/ 693.5.4 动态对象年龄判定/ 713.5.5 空间分配担保/ 733.6 本章小结/ 75第4章虚拟机性能监控与故障处理工具/ 76 4.1 概述/ 764.2 JDK的命令行工具/ 764.2.1 jps:虚拟机进程状况工具/ 794.2.2 jstat:虚拟机统计信息监视工具/ 80 4.2.3 jinfo:Java配置信息工具/ 824.2.4 jmap:Java内存映像工具/ 824.2.5 jhat:虚拟机堆转储快照分析工具/ 84 4.2.6 jstack:Java堆栈跟踪工具/ 854.3 JDK的可视化工具/ 874.3.1 JConsole:Java监视与管理控制台 / 88 4.3.2 VisualVM:多合一故障处理工具/ 96 4.4 本章小结/ 105第5章调优案例分析与实战/ 1065.1 概述/ 1065.2 案例分析/ 1065.2.1 高性能硬件上的程序部署策略/ 106 5.2.2 集群间同步导致的内存溢出 / 1095.2.3 堆外内存导致的溢出错误/ 1105.2.4 外部命令导致系统缓慢/ 1125.2.5 服务器JVM进程崩溃/ 1135.3 实战:Eclipse运行速度调优/ 1145.3.1 调优前的程序运行状态/ 1145.3.2 升级JDK 1.6的性能变化及兼容问题/ 117 5.3.3 编译时间和类加载时间的优化/ 1225.3.4 调整内存设置控制垃圾收集频率/ 1265.3.5 选择收集器降低延迟/ 1305.4 本章小结/ 133第三部分虚拟机执行子系统第6章类文件结构/ 1366.1 概述/ 1366.2 无关性的基石/ 1366.3 Class类文件的结构/ 1386.3.1 魔数与Class文件的版本/ 1396.3.2 常量池 / 1416.3.3 访问标志/ 1476.3.4 类索引、父类索引与接口索引集合/ 148 6.3.5 字段表集合/ 1496.3.6 方法表集合/ 1536.3.7 属性表集合/ 1556.4 Class文件结构的发展/ 1686.5 本章小结/ 170第7章虚拟机类加载机制/ 1717.1 概述/ 1717.2 类加载的时机/ 1727.3 类加载的过程/ 1767.3.1 加载/ 1767.3.2 验证/ 1787.3.3 准备/ 1817.3.4 解析/ 1827.3.5 初始化/ 1867.4 类加载器/ 1897.4.1 类与类加载器/ 1897.4.2 双亲委派模型/ 1917.4.3 破坏双亲委派模型/ 1947.5 本章小结/ 197第8章虚拟机字节码执行引擎/ 1988.1 概述/ 1988.2 运行时栈帧结构/ 1998.2.1 局部变量表/ 1998.2.2 操作数栈/ 2048.2.3 动态连接/ 2068.2.4 方法返回地址/ 2068.2.5 附加信息/ 2078.3 方法调用/ 2078.3.1 解析/ 2078.3.2 分派/ 2098.4 基于栈的字节码解释执行引擎/ 2218.4.1 解释执行/ 2218.4.2 基于栈的指令集与基于寄存器的指令集/ 223 8.4.3 基于栈的解释器执行过程/ 2248.5 本章小结/ 230第9章类加载及执行子系统的案例与实战/ 231 9.1 概述/ 2319.2 案例分析/ 2319.2.1 Tomcat:正统的类加载器架构/ 2329.2.2 OSGi:灵活的类加载器架构/ 2359.2.3 字节码生成技术与动态代理的实现/ 2389.2.4 Retrotranslator:跨越JDK版本/ 2429.3 实战:自己动手实现远程执行功能/ 2469.3.1 目标/ 2469.3.2 思路/ 2479.3.3 实现/ 2489.3.4 验证/ 2559.4 本章小结/ 256第四部分程序编译与代码优化第10章早期(编译期)优化/ 25810.1 概述/ 25810.2 Javac编译器/ 25910.2.1 Javac的源码与调试/ 25910.2.2 解析与填充符号表/ 26210.2.3 注解处理器/ 26410.2.4 语义分析与字节码生成/ 26410.3 Java语法糖的味道/ 26810.3.1 泛型与类型擦除/ 26810.3.2 自动装箱、拆箱与遍历循环/ 27310.3.3 条件编译 / 27510.4 实战:插入式注解处理器/ 27610.4.1 实战目标/ 27610.4.2 代码实现/ 27710.4.3 运行与测试/ 28410.4.4 其他应用案例/ 28610.5 本章小结/ 286第11章晚期(运行期)优化/ 28711.1 概述/ 28711.2 HotSpot虚拟机内的即时编译器 / 28811.2.1 解释器与编译器/ 28811.2.2 编译对象与触发条件/ 29111.2.3 编译过程/ 29411.2.4 查看与分析即时编译结果/ 29711.3 编译优化技术/ 30111.3.1 优化技术概览/ 30111.3.2 公共子表达式消除/ 30511.3.3 数组边界检查消除/ 30711.3.4 方法内联/ 30711.3.5 逃逸分析/ 30911.4 Java与C/C++的编译器对比/ 31111.5 本章小结/ 313第五部分高效并发第12章 Java内存模型与线程/ 31612.1 概述/ 31612.2 硬件的效率与一致性/ 31712.3 Java内存模型/ 31812.3.1 主内存与工作内存/ 31912.3.2 内存间交互操作/ 32012.3.3 对于volatile型变量的特殊规则/ 32212.3.4 对于long和double型变量的特殊规则/ 327 12.3.5 原子性、可见性与有序性/ 32812.3.6 先行发生原则/ 33012.4 Java与线程/ 33312.4.1 线程的实现/ 33312.4.2 Java线程调度/ 33712.4.3 状态转换/ 33912.5 本章小结/ 341第13章线程安全与锁优化/ 34213.1 概述/ 34213.2 线程安全/ 34313.2.1 Java语言中的线程安全/ 34313.2.2 线程安全的实现方法/ 34813.3 锁优化/ 35613.3.1 自旋锁与自适应自旋 / 35613.3.2 锁消除/ 35713.3.3 锁粗化/ 35813.3.4 轻量级锁/ 35813.3.5 偏向锁/ 36113.4 本章小结/ 362附录A Java虚拟机家族/ 363附录B 虚拟机字节码指令表/ 366附录C HotSpot虚拟机主要参数表/ 372附录D 对象查询语言(OQL)简介/ 376附录E JDK历史版本轨迹/ 383作者简介周志明,资深Java技术专家,对JavaEE企业级应用开发、OSGi、Java虚拟机和工作流等都有深入的研究,并在大量的实践中积累了丰富的经验。
Java虚拟机与性能优化:理解Java底层工作原理Java虚拟机(Java Virtual Machine,JVM)是Java程序运行的基础。
了解Java虚拟机的工作原理可以帮助开发者更好地优化程序性能。
本文将介绍Java虚拟机的工作原理以及一些性能优化的技巧。
一、Java虚拟机的工作原理Java虚拟机作为Java程序的执行环境,负责将Java代码转化为可执行的机器码。
它包含了以下几个主要的组成部分:1.类加载器(Class Loader):负责加载和查找类文件,将类文件转化为运行时的类对象。
类加载器有三种层次结构:启动类加载器、扩展类加载器和应用程序类加载器。
2.运行时数据区(Runtime Data Areas):包括了方法区、堆区、栈区、本地方法栈和程序计数器等。
其中方法区用于存储类的结构信息、静态变量以及常量池等,堆区用于存储对象实例,栈区用于存储局部变量和方法调用的信息,本地方法栈用于支持本地方法的调用。
3.执行引擎(Execution Engine):负责执行字节码。
根据字节码的不同,可以使用解释器(Interpreter)或即时编译器(Just-In-Time Compiler,JIT)来执行字节码。
解释器逐条执行字节码指令,而JIT编译器将字节码编译成机器码后再执行。
4.垃圾收集器(Garbage Collector):用于回收不再使用的对象内存,释放空间供新对象使用。
二、性能优化技巧理解Java虚拟机的工作原理对于优化Java程序的性能至关重要。
下面介绍几个常见的性能优化技巧:1.选择合适的垃圾收集器Java虚拟机默认的垃圾收集器是串行收集器,适用于小型的单线程应用。
对于大型、多线程应用,可以选择并行垃圾收集器或并发垃圾收集器来提高垃圾收集的效率。
2.调整堆内存大小堆内存是存储对象实例的地方,通过调整堆内存的大小可以避免内存溢出或过度消耗内存。
可以使用-Xms参数设置堆内存的初始大小,-Xmx参数设置堆内存的最大大小。
概述JVMJVM简介:JVM全称是Java VirtualMachine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM你是看不到的,它存在内存中。
我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个JVM 也是有这成套的元素,运算器是当然是交给硬件CPU还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM自己的命令集,这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU,比如8086系列的汇编也是可以用在8088上的,但是就不能跑在8051上,而JVM的命令集则是可以到处运行的,因为JVM做了翻译,根据不同的CPU,翻译成不同的机器语言。
JVM中我们最需要深入理解的就是它的存储部分,存储?硬盘?NO,NO,JVM是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中,这决定着我们程序运行的是否健壮、是否高效,接下来的部分就是重点介绍之。
JVM组成从这个图中可以看到,JVM是运行在操作系统之上的,它与硬件没有直接的交互我们再来看下JVM有哪些组成部分,如下图所示:Class Loader类加载器类加载器的作用是加载类文件到内存,比如编写一个HelloWord.java程序,然后通过javac编译成class文件,那怎么才能加载到内存中被执行呢?Class Loader承担的就是这个责任,那不可能随便建立一个.class文件就能被加载的,Class Loader加载的class文件是有格式要求,在《JVM Specification》中式这样定义Class文件的结构:ClassFile{u4magic;u2minor_version;u2major_version;u2constant_pool_count;cp_infoconstant_pool[constant_pool_count-1];u2access_flags;u2this_class;u2super_class;u2interfaces_count;u2interfaces[interfaces_count];u2fields_count;field_infofields[fields_count];u2methods_count;method_infomethods[methods_count];u2attributes_count;attribute_infoattributes[attributes_count];}需要详细了解的话,可以仔细阅读《JVM Specification》的第四章“The class File Format”,这里不再详细说明。
JVM(Java虚拟机)简介1,什么是Java虚拟机Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。
Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
2,为什么使用Java虚拟机?Java语言最重要的特点就是可以在任何操作系统中运行。
使用Java虚拟机就是为了支持与操作系统无关,在任何系统中都可以运行。
3,Java虚拟机的基本原理Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
Java的平台无关性是Java最重要的特性,而实现这一特性的基础就是Java虚拟机。
因此,了解Java虚拟机的结构和工作方式对进一步理解Java概念十分有益。
下面我们将从两个方面介绍Java虚拟机。
什么是Java虚拟机从底层看,Java虚拟机就是以Java字节码为指令组的软CPU。
附图显示了Java系统流程图(内含Java虚拟机)。
从附图可以看出,在服务器端首先由开发人员编写Java程序并存为. Java 文件;其次,Java编译器将.java文件编译成由字节码组成的.class文件;最后,将.class文件存放在Web服务器上。
到此,Java程序已作为Internet或Intranet资源存放在Web服务器上随时可让客户使用。
在客户端,用户使用WWW浏览器,通过Internet/Intranet将Web服务器上的含有Java程序的主页下载,再依赖本地Java虚拟机对.class文件解释执行。
这样,内容丰富的Java 应用资源便由服务器传送到客户端,并在用户浏览器上显示出来。
和普通的程序装入器一样,Java虚拟机执行程序时首先从网络或本地存储器中装入.class 文件。