一、java虚拟机
官网:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html#jvms-1.2
什么是JVM:
- Java虚拟机是Java平台的基石,其负责其硬件和操作系统的独立性,其编译的代码很小以及保护用户免受恶意程序攻击的能力。
- Java虚拟机是一种抽象计算机,像真正的计算机一样,它有一个指令集并在运行时操作各种内存区域。
- Java虚拟机不承担任何特定的实现技术、主机硬件或主机操作系统,它本身并没有被解释。
- Java虚拟机不知道Java编程语言,只知道特定的二进制格式,即 class 文件格式, class 文件包含Java虚拟机指令(或字节码)和符号表,以及其他辅助信息。
- 出于安全考虑,Java虚拟机对 class 文件中的代码施加了强大的语法和结构约束,但是,任何具有可以用有效 class 文件表示的功能的语言都可以由Java虚拟机托管,由通用的、与机器无关的平台吸引,其他语言的实现者可以将Java虚拟机作为其语言的交付工具。
- 如果你在线上遇到了OOM,你是否会束手无策。
- 线上卡顿是否可能是因为频繁Full GC造成的。
- 新项目上线,服务器数量以及配置不足,对于性能的扩展只能靠服务器的增加,而不能通过JVM的调优达到实现服务器性能的突破。
- 面试经常会问到JVM的一些问题,但是当面试官问到你实际的落地点时,你就会茫然不知所措,没有条理性,或者答非所问。
二、编程语言
编程语言(英语:programming language),是用来定义[计算机程序]的[形式语言]。它是一种被[标准化]的交流技巧,用来向[计算机]发出指令。一种能够让[程序员]准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。说白了就是让人类能够和计算机沟通,所以要学习计算机能够懂的语言三、计算机能懂的语言
3.1、计算机的发展史
1946-1958:电子管计算机 1958-1964:晶体管计算机 1964-1970:集成电路计算机 1970-至今:大规模集成电路计算机3.2、计算机体系结构
计算机的体系结构设计遵循冯诺依曼计算机结构,这很多朋友相信也听过,下面是他的结构图体系结构
(1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断. 在现在CPU的保护模式中,每个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这就变相的指定了哪些内存中存储的是指令哪些是数据)指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。 (2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。 (3)指令由操作码和地址码组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。 (4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。 (5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。 (6)数据以二进制表示。3.3、计算机处理数据过程
把计算机处理过程简化下,可以大致分成以下四个阶段: (1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来 (2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令 (3)执行阶段:再由控制器把需要处理或计算的数据调入运算器 (4)最终阶段:由输出设备把最后运算结果输出 本质上就是CPU取数据指令然后返回(CPU=存储器+运算器+控制器)3.4、机器语言
我们把CPU能够直接认识的数据指令,称为机器语言,也就是010101001这种形式3.5、编译型和解释型
3.5.1、编译型
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。例如:C、C++、GoLang 编译型语言:- 执行速度快、效率高;依靠编译器、跨平台性差些。
- 把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
3.5.2、解释型
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。例如:Python、Javascript 解释型语言:- 执行速度慢、效率低;依靠解释器、跨平台性好。
- 把做好的源程序翻译一句,然后执行一句,直至结束。
3.5.3、编译型+解释型
Java属于编译型+解释型的高级语言其实并不是因为有javac将Java源码编译成class文件,才说Java属于编译+解释语言,因为在这个编译器编译之后,生成的类文件不能直接在对应的平台上运行。那为何又说Java是编译+解释语言呢?因为class文件最终是通过JVM来翻译才能在对应的平台上运行,而这个翻译大多数时候是解释的过程,但是也会有编译,称之为运行时编译,即JIT(Just In Time)。综上所述,Java是一门编译型+解释型的高级语言。四、JVM是什么
Java Virtual Machine(Java虚拟机)五、JDK JRE JVM
5.1、什么是JRE
Java运行时环境(JRE)
是一个软件包,它捆绑了libraries
(jar)和JVM
,以及用Java编写的应用程序的其他组件。JVM
只是JRE
发行版的一部分。执行任何Java
程序,需要在机器上安装JRE
,这是最低要求。
JRE
捆绑的组件如下:
- DDL文件:由Java客户端虚拟机使用.
- 代码库,属性设置,资源文件也都包含,比如rt.jar和charsets.jar
- Java扩展文件,如localedata.jar
- 包含用于安全管理的文件,这些文件包括安全策略(security policy)和安全属性(security properties)
- 包含applets支持类的jar文件
- 包含平台使用的TrueType字体文件
JRE
可以作为JDK
的一部分下载或者也可以单独下载,JRE
依赖于平台,这意味着根据机器类型(操作系统和体系结构),必须选择要导入和安装的JRE
包
例如:你不能安装64位的JRE
到32位的机器上,同样,针对windows
的发行版无法在Linux
平台中工作.
5.2、什么是JDK
JDK
是JRE
的超集,JDK
包含了JRE
的所有开发,调试和监视应用程序的工具。当要开发Java
应用程序时,需要安装JDK
.
下面是JDK
附带的一些重要组件:
- apt 注解处理工具
- javadoc 文档生成器,可以自动从源代码生成说明文档
- jar 归档器,将相关的类库打包到一个JAR文件中。还可以帮助管理JAR文件
- jConsole Java监控和管理平台
- jhat Java堆分析工具
- jstack 打印Java线程的堆栈信息
- keytool 策略创建和管理工具
- jarsigner Java签名和验证工具
同JRE
,JDK
也依赖于平台,所以要下载与机器相对应的JDK
包
5.3、JDK,JRE,JVM之间的差异
基于上面的简述,我们可以得出这样的差异:
JRE = JVM + libraries to run Java Application JDK = JRE + tools to develop Java Application
简单来说,如果你是编写代码的Java
应用开发人员,你将需要发安装JDK
,如果只是想运行使用Java
构建的应用程序,你只需要安装JRE
即可。
5.4、JDK,JRE,JVM相关的面试题
- Java中的类加载有几种类型
三种,分别是:Bootstrap,extendsion,application
- 类加载器是如何工作的
类加载器扫描它们预定义的jar文件和类的位置。它们扫描路径中的所有类文件并寻找所需的类。如果发现类则加载,链接并初始化类文件。
- JRE和JVM的不同
JVM是运行时环境的规范,它执行Java应用程序。Hotspot JVM就是这种规范的一种实现。它加载类文件,使用interpreter和JIT Compiler将字节码转换成机器码并执行它。
- interpreter和JIT compiler的不同
interpreter逐行解释字节码并按顺序执行。这会导致性能低下。JIT compiler通过在块中分析代码并在这个过程添加优化,然后准备(编译)为更优化的机器码。