深入理解Java虚拟机(JVM高级特性与最佳实践)
《深入理解Java虚拟机》第2版笔记(完整)
![《深入理解Java虚拟机》第2版笔记(完整)](https://img.taocdn.com/s3/m/76f06644a1c7aa00b42acb1f.png)
第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堆)的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
计算机入门书籍推荐
![计算机入门书籍推荐](https://img.taocdn.com/s3/m/3af823b7c67da26925c52cc58bd63186bceb9219.png)
计算机入门书籍推荐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虚拟机](https://img.taocdn.com/s3/m/d693a0dbd5bbfd0a79567368.png)
深入理解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虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此为了线程切换后还能恢复执行位置,每条线程都需要一个独立的程序计数器。
java程序员必看书籍
![java程序员必看书籍](https://img.taocdn.com/s3/m/395c5f6a7fd5360cbb1adb1c.png)
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++基础,如果对这两门语言不是很熟悉的朋友,看这本书可能对你帮助不是很大。
计算机专业必读书籍
![计算机专业必读书籍](https://img.taocdn.com/s3/m/de5428fb9a89680203d8ce2f0066f5335a8167b8.png)
计算机专业必读书籍计算机专业要读哪些书籍呢?下面是店铺精心为您整理的计算机专业必读书籍,希望您喜欢!一些经典的计算机书籍算法导论(第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虚拟机](https://img.taocdn.com/s3/m/c747aebe294ac850ad02de80d4d8d15abe2300ce.png)
深入理解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虚拟机:JVM高级特性与最佳实践(第3版)
![深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)](https://img.taocdn.com/s3/m/306f8bf0dd36a32d727581a7.png)
第3章 垃圾收集器与内存分配策略
3.2 对象已死?
0 1
3.2.1 引用计
数算法
0 2
3.2.2 可达性
分析算法
0 3
3.2.3 再谈引
用
0 4
3.2.4 生存还
是死亡?
0 5
3.2.5 回收方
法区
第3章 垃圾收集器与内存分配策略
0 5
1.5 展望Java 技术的未来
0 3
1.3 Java发展 史
0 6
1.6 实战:自 己编译JDK
第1章 走近Java
1.7 本章小结
第1章 走近Java
1.4 Java虚拟机家族
1.4.1 虚拟机始祖:
Sun
1
Classic/Exact VM
1.4.6 挑战者:Apache
Harmony/Google
3.8 实战:内存分配与回收策 略
01 3 . 8 . 1 对 象 优 先 在
Eden分配
03 3 . 8 . 3 长 期 存 活 的
对象将进入老年代
02 3 . 8 . 2 大 对 象 直 接
进入老年代
04 3 . 8 . 4 动 态 对 象 年
龄判定
05 3 . 8 . 5 空 间 分 配 担
保
01
2.2.1 程序 计数器
05
2.2.5 方法 区022.2.2 Java 虚拟机栈
04
2.2.4 Java 堆
03
2.2.3 本地 方法栈
第2章 Java内存区域与内存溢出异常
2.2 运行时数据区域
Java虚拟机与性能优化:理解Java底层工作原理
![Java虚拟机与性能优化:理解Java底层工作原理](https://img.taocdn.com/s3/m/93a93157c381e53a580216fc700abb68a882ad12.png)
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参数设置堆内存的最大大小。
深入理解JVM
![深入理解JVM](https://img.taocdn.com/s3/m/41fd46e30975f46527d3e17d.png)
概述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”,这里不再详细说明。
Java虚拟机
![Java虚拟机](https://img.taocdn.com/s3/m/9bbe6236ee06eff9aef8077c.png)
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 文件。
深入理解Java虚拟机(JVM)
![深入理解Java虚拟机(JVM)](https://img.taocdn.com/s3/m/9e09708884868762caaed574.png)
虽然类加载器对象是Java程序的一部分,但是ClassLoader类中的三个方法可以访问Java虚拟机中的类加载子系统。
1)、protected final Class defineClass(…):使用这个方法可以出入一个字节数组,定义一个新的类型。
除了布尔型,其他Java语言中的原始类型都是Java虚拟机中的数据类型。在Java中数据类型被分为:整形的byte,short,int,long;char和浮点型的float,double。Java语言中的数据类型在任何主机上都有同样的范围。
在Java虚拟机中还存在一个Java语言中不能使用的原始数据类型返回值类型(returnValue)。这种类型被用来实现Java程序中的“finally clauses”,具体的参见18章的“Finally Clauses”。
TypeRange
byte8-bit signed two's complement integer (-27 to 27 - 1, inclusive)
short16-bit signed two's complement integer (-215 to 215 - 1, inclusive)
2)、连接:进行验证、准备和解析
①验证:确保导入类型的正确性
②准备:为类型分配内存并初始化为默认值
③解析:将字符引用解析为直接饮用
3)、初始化:调用Java代码,初始化类变量为合适的值
五、字节长度
Java虚拟机中最小的数据单元式字(word),其大小由Java虚拟机的实现者定义。但是一个字的大小必须足够容纳byte,short,int, char,float,returnValue,reference;两个字必须足够容纳long,double。所以虚拟机的实现者至少提供的字不能小 于31bits的字,但是最好选择特定平台上最有效率的字长。
深入理解java虚拟机
![深入理解java虚拟机](https://img.taocdn.com/s3/m/118cf69ed0d233d4b14e692b.png)
Java虚拟机基本结构Java虚拟机基本结构1.类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放在一块叫方法区的内存空间。
除了类的信息外,方法区可能还存放常量池信息。
2.Java堆在虚拟机启动时候建立,他是java程序最主要的内存工作区域,几乎所有的对象实例都保存在这,堆是所有线程共享的。
3.Java的NIO库允许java程序直接使用内存,直接内存是java堆外的,直接像系统申请内存空间。
4.垃圾回收系统是java虚拟机重要的组成部分,垃圾回收系统主要对方法区,java堆,直接内存进行回收,其中java堆是垃圾回收的主要场合。
5.每一个java虚拟机线程都有一个私有的java栈,一个线程在创建的时候就建立了一个java栈,java栈中保存着帧信息,局部变量,方法参数,和java方法的调用返回密切关系。
6.本地方法栈和java栈类似,最大的不同在于java栈用于java方法的调用,本地方法栈用于本地方法的调用。
7.PC寄存器也是每个线程的私有空间,java虚拟机会为每个java线程创建一个PC寄存器,在任意时刻,每个java线程都在执行一个方法,这个正在被执行的方法被称为当前方法,如果当前方法不是本地方法,那么PC寄存器会指向当前正在被执行的指令,否则(本地方法),PC寄存器值就是undefined。
8.执行引擎是java虚拟机最核心组件之一,他主要负责执行虚拟机字节码。
Java堆Java堆是和java应用程序关系最为密切的内存空间,几乎所有的java对象实例存储在堆中,并且java堆完全是自动管理,通过垃圾回收制度,垃圾对象会被自动清理,不需要显示释放。
根据垃圾回收机制的不同,java堆有可能会被分为不同的结构,最常见的一种,就是将java堆分成新生代和老年代,新生代新对象和存放年龄不大的对象,老年代存放老年对象,新生代有可能又被分为eden区,s0区,s1区。
S0,s1又被称为from区和to区,它们是两块大小相同的内存空间。
Java虚拟机原理与性能调优技巧
![Java虚拟机原理与性能调优技巧](https://img.taocdn.com/s3/m/fafb3bc9cd22bcd126fff705cc17552707225e06.png)
Java虚拟机原理与性能调优技巧在程序开发领域中,Java是一种非常常见的编程语言,而Java虚拟机(JVM)则是Java程序运行的核心引擎。
了解Java虚拟机的原理以及如何进行性能调优,对于开发人员来说是非常重要的。
本文将探讨Java虚拟机的原理,并分享一些性能调优的技巧。
一、Java虚拟机的原理Java虚拟机是一个在计算机上模拟执行Java字节码的软件程序。
它负责将Java源代码编译成字节码,然后在运行时解释和执行字节码。
1. Java字节码Java字节码是一种中间语言,类似于汇编语言,但比汇编语言更高级。
它是由Java源代码编译生成的,在Java虚拟机上执行。
Java字节码的优势在于它是与平台无关的,可以在任何支持Java虚拟机的操作系统上运行。
2. 类加载器类加载器是Java虚拟机的一个核心组件,负责加载字节码文件到内存中,并在运行时动态链接和初始化类。
类加载器有三个重要的概念:委派机制、双亲委派模型和类加载的过程。
3. 运行时数据区Java虚拟机在运行时将内存划分为不同的区域,每个区域用于存储不同的数据。
主要的运行时数据区包括方法区、堆、栈和程序计数器等。
方法区用于存储类的元数据,堆用于存储对象实例,栈用于存储方法的局部变量和操作数栈,程序计数器用于指示当前执行的字节码指令。
4. 垃圾回收Java虚拟机通过垃圾回收机制自动管理内存。
垃圾回收器会定期扫描堆内存,找出不再使用的对象,并释放其占用的内存空间。
垃圾回收的算法和策略不同,可以根据应用需求进行配置。
二、性能调优技巧在Java应用程序开发过程中,对性能的管理和优化是至关重要的。
以下是一些常用的性能调优技巧。
1. 内存管理合理管理内存是提高性能的关键。
可以通过调整堆内存大小、配置垃圾回收器的算法和策略,以及使用内存分析工具来监控和优化内存的使用。
2. 多线程编程多线程能够提高应用程序的并发性能。
合理利用多线程可以将任务并行执行,提高系统的吞吐量。
Windows Open JDK1.7 配置方法
![Windows Open JDK1.7 配置方法](https://img.taocdn.com/s3/m/c2fa466c168884868762d6fc.png)
明:1.本文来自于《深入理解Java虚拟机:JVM高级特性与最佳实践》第一章,转载请注明出处。
2.作者推荐大家对本文“看过就算”,真正要编译JDK的话,请不要选择在Windows平台编译,难度……嗯,应该说是“麻烦程度”比Linux平台编译高几个数量级。
在Linux 平台的JDK编译攻略,请参考撒迦这篇文章。
相信我,哪怕你没有Linux环境,临时装一个ubuntu,加上安装操作系统的时间都比直接在Windows下编译来得快。
3.如果要在Windows平台编译的话,看看是否需要把整个JDK(HotSpot、Library、Utils(如VisualVM等)、JAXWS、etc)都编译出来,相信大部分人只想要一个虚拟机,那可以关闭掉其他部分的编译,省事不少。
但本文是按照“全部编译”来写的攻略。
-------------------------- 上面是唠叨,下面是攻略,我是分割线 -------------------------- 1.5 实战:自己编译JDK想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛会高一点,当肯定会比阅读各种文章、书籍来得更加贴近本质些。
另外JDK中的很多底层方法都是Native的,需要跟踪这些方法的运作或对JDK进行Hack的时候,都需要自己编译一套JDK。
现在网络上有不少开源的JDK实现可以供我们选择,如Apache Harmony、OpenJDK等。
考虑到Sun系列的JDK是现在使用得最广泛的JDK版本,笔者选择了OpenJDK进行这次编译实战。
1.5.1 获取JDK源码首先确定要使用的JDK版本,OpenJDK 6和OpenJDK 7都是开源的,源码都可以在它们的主页(/)上找到,OpenJDK 6的源码其实是从OpenJDK 7的某个基线中引出的,然后剥离掉JDK 1.7相关的代码,从而得到一份可以通过TCK 6的JDK 1.6实现,因此直接编译OpenJDK 7会更加“原汁原味”一些,其实这两个版本的编译过程差异并不大。
线程安全(上)--彻底搞懂volatile关键字
![线程安全(上)--彻底搞懂volatile关键字](https://img.taocdn.com/s3/m/42b67114fd4ffe4733687e21af45b307e871f9b8.png)
线程安全(上)--彻底搞懂volatile关键字对于volatile这个关键字,相信很多朋友都听说过,甚⾄使⽤过,这个关键字虽然字⾯上理解起来⽐较简单,但是要⽤好起来却不是⼀件容易的事。
这篇⽂章将从多个⽅⾯来讲解volatile,让你对它更加理解。
计算机中为什么会出现线程不安全的问题volatile既然是与线程安全有关的问题,那我们先来了解⼀下计算机在处理数据的过程中为什么会出现线程不安全的问题。
⼤家都知道,计算机在执⾏程序时,每条指令都是在CPU中执⾏的,⽽执⾏指令过程中会涉及到数据的读取和写⼊。
由于程序运⾏过程中的临时数据是存放在主存(物理内存)当中的,这时就存在⼀个问题,由于CPU执⾏速度很快,⽽从内存读取数据和向内存写⼊数据的过程跟CPU执⾏指令的速度⽐起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进⾏,会⼤⼤降低指令执⾏的速度。
为了处理这个问题,在CPU⾥⾯就有了⾼速缓存(Cache)的概念。
当程序在运⾏过程中,会将运算需要的数据从主存复制⼀份到CPU的⾼速缓存当中,那么CPU进⾏计算时就可以直接从它的⾼速缓存读取数据和向其中写⼊数据,当运算结束之后,再将⾼速缓存中的数据刷新到主存当中。
我举个简单的例⼦,⽐如cpu在执⾏下⾯这段代码的时候,t = t + 1;会先从⾼速缓存中查看是否有t的值,如果有,则直接拿来使⽤,如果没有,则会从主存中读取,读取之后会复制⼀份存放在⾼速缓存中⽅便下次使⽤。
之后cup进⾏对t加1操作,然后把数据写⼊⾼速缓存,最后会把⾼速缓存中的数据刷新到主存中。
这⼀过程在单线程运⾏是没有问题的,但是在多线程中运⾏就会有问题了。
在多核CPU中,每条线程可能运⾏于不同的CPU中,因此每个线程运⾏时有⾃⼰的⾼速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执⾏的,本次讲解以多核cup为主)。
这时就会出现同⼀个变量在两个⾼速缓存中的值不⼀致问题了。
jvm的理解
![jvm的理解](https://img.taocdn.com/s3/m/bc323832fbd6195f312b3169a45177232f60e4a3.png)
jvm的理解JVM,全称为Java虚拟机(Java Virtual Machine),是Java语言的核心部分,是Java的运行环境。
Java程序在运行时,需要通过JVM来解释执行Java代码。
JVM的主要作用是将Java代码翻译成计算机可以理解的机器语言,同时还负责内存管理和垃圾回收等任务。
本文将从JVM的结构和工作原理、内存管理和垃圾回收、性能优化和调试等方面,对JVM进行深入的讲解。
一、JVM的结构和工作原理JVM的结构可以分为三个部分:类加载器、运行时数据区和执行引擎。
其中,类加载器用于将Java类加载到内存中;运行时数据区用于存储程序运行时所需要的数据;执行引擎则用于执行Java代码。
1. 类加载器类加载器是JVM中的重要组成部分,它负责将Java类从磁盘上的.class文件中加载到JVM的内存中。
类加载器按照类的来源可以分为三种类型:启动类加载器、扩展类加载器和应用程序类加载器。
启动类加载器用于加载JVM自带的核心类库,扩展类加载器用于加载JVM扩展的类库,应用程序类加载器则用于加载应用程序的类库。
2. 运行时数据区运行时数据区用于存储程序运行时所需要的数据,包括方法区、堆、栈、本地方法栈和程序计数器。
其中,方法区用于存储类的元数据信息,堆用于存储对象实例,栈用于存储方法执行时的局部变量和操作数栈,本地方法栈用于存储本地方法的调用栈,程序计数器用于记录正在执行的指令地址。
3. 执行引擎执行引擎是JVM的核心部分,它用于执行Java代码。
执行引擎按照执行方式可以分为两种类型:解释执行和编译执行。
解释执行是将Java代码逐行翻译成机器语言执行,缺点是速度较慢;编译执行是将Java代码预先编译成机器语言,然后再执行,速度较快。
JVM 支持两种编译方式:静态编译和动态编译。
静态编译是在程序运行前将Java代码编译成机器语言,动态编译则是在程序运行时根据代码的执行情况动态进行编译。
二、内存管理和垃圾回收JVM的内存管理和垃圾回收是Java语言的重要特性之一。