学习路径
提出问题
1.为什么JAVA可以跨平台?
2.都知道Java是半解释半编译语言,为什么这么说?
3.classfile去哪了?如果都知道通过类加载器加载到内存,是怎么在内存中执行指令的?
4.类加载器为什么可以加载类,怎么加载类?
5.垃圾回收怎么回收垃圾?
6.既然垃圾回收可以回收垃圾,为什么要分为新生代、老年代
7.为什么要在JDK1.7以后把永久代换成元空间?
8.常见的StackOverflowError和OOM是怎么产生的?
9.为什么在学习Java基础的时候,代码是这样执行的,static为什么随着类加载?
......问题很多,不一一赘述,这里我希望下一次我看到这个博客的时候,我能带着这些问题看懂我自己的博客,是一个很好的复习吧
JVM基本概念
什么是JVM?
1.JVM实际上可以看作是一个可运行Java代码的假象计算机,JVM通过C/C++来实际操作计算机执行逻辑运算和存储
2.JVM实质上是运行在操作系统之上的,且无法与硬件直接交互,必须依靠于操作系统
因此我们也可以将JVM看作是一个可间接与硬件交互的软件(间接:就是通过Native调用C/C++来实现)
JVM为什么可以实现Java的跨平台?
因为执行引擎不同,这个我会单独做一章来解释
Java代码的执行流程
宏观上:.java文件---javac--->.class---java.exe-->执行
编译阶段:代码编译是从.java源文件通过编译器转换形成.calss字节码文件的过程(javac编译器)
执行阶段:.class字节码文件会通过JVM中的解释器,翻译成特定机器上的机器码,并执行对应的指令。
问题:这两个阶段会操作内存吗?什么时候操作内存?
编译阶段仅仅只是将源文件代码转换为对应的字节码,该过程不会执行指令,因此不会操作内存。
执行阶段会将字节码文件解释为机器码(解释执行),并执行指令(编译执行),因此该过程会频繁操作内存
JVM层面分析:Java代码到底经历了什么?
上面我们说过:编译阶段仅仅只是把源文件转换成对应的字节码,那我们可以知道,Java代码首先一定会经过javac编译器编译一次
所以我们应该分析的就是执行阶段,到底发生了什么?先看下面这张图!
JVM分类
Sun Classic VM(JDK1.0)
* 内部只提供解释器
* 可提供外挂JIT编译器,但是一旦使用JIT编译器,则JIT就会接管虚拟机的执行系统,解释器将不再工作
Exact VM(JDK1.2)
* 虚拟机可以知道内存中某一个位置的数据具体是什么类型
* 具备高性能虚拟机的雏形
* 热点探测
* 编译器与解释器混合工作模式
HotSpot VM(JDK1.3)(重点)
* HotSpot VM是默认虚拟机!
* Sun/Oracle的JDK和Open JDK的默认虚拟机
* 热点探测技术(通过计数器找到最具有编译价值的代码,触发即时编译或栈上替换)
* 编译器和解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。
* 服务器端、桌面到移动端、嵌入式都有应用
JRockit VM(重点)
* 专注于服务器端应用
* JRockit内部不包含解释器的实现,全部代码由即时编译器编译执行。
* JRockit是世界上最快的JVM
* 有全面的Java运行时解决方案
* 延迟敏感应用解决方案提供毫秒或微秒级JVM响应
* MissionControl服务套件,以极低的开销来监控、管理和分析生产环境中的应用程序工具
J9(IBM Technology for Java Virtual Machine IT4J)内部代号J9(重点)
* 服务器端、桌面应用、嵌入式等多用途VM
* 在IBM产品中时速度最快的JVM
* IBM开源J9命名为OpenJ9
//了解内容
Java ME
发布在Java ME产品线上的两款虚拟机CDC/CLDC HotSpotImplementation VM
KVM是CLDC-HI早期的产品
KVM简单、轻量、高度可移植,面向更低端的设备上还维持自己的市场
* 智能控制器、传感器
* 老人手机、经济欠发达地区的功能手机
所有虚拟机的原则:一次编译,到处运行
如何查看自己的JVM是哪一种?
JVM基本结构(待更新)
JVM体系结构主要分为两个子系统、两个组件
子系统
组件
这里我会更新在其他章
总结
当前章节的重点:
1.Java代码的执行流程(宏观和JVM层面)
这里一定要把JVM层面的执行流程当作一个问题去研究
2.几个重要的JVM
Hotspot VM
J9 VM
JRockit VM