1. 什么是JVM?
JVM是Java程序运行的底层平台,与Java支持库一起构成了Java程序的执行环境。 分为JVM规范和JVM实现两个部分。简单来说,Java虚拟机就是指能执行标准Java字节码的虚拟计算机。
1.1 请问JDK与JVM有什么区别?
现在的JDK、JRE和JVM一般是整套出现的。
JDK = JRE + 开发调试诊断工具
JRE = JVM + Java标准库
1.2 你认识哪些JVM厂商?
常见的JDK厂商包括:
Oracle公司,包括 Hotspot虚拟机、GraalVM;分为OpenJDK和OracleJDK两种版本。
IBM 公司,J9虚拟机, 用在IBM的产品套件中
Azul Systems公司,高性能的Zing和开源的Zulu 阿里巴巴,Dragonwell 是阿里开发的OpenJDK定制版亚马逊,Corretto OpenJDK
Red Hat公司的OpenJDK
Adopt OpenJDK
此外,还有一些开源和试验性质的JVM实现,比如Go.JVM
1.3 OracleJDK与OpenJDK有什么区别?
各种版本的JDK一般来说都会符合Java虚拟机规范。
两者的区别一般来说包括:
两种JDK提供的工具套件略有差别,比如jmc等有版权的工具。
某些协议或配置不一样,比如美国限制出口的加密算法。
其他细微差别,比如JRE中某些私有的API不一样。
1.4 开发中使用哪个版本的JDK?生产环境呢? 为什么这么选?
有一说一。选择哪个版本需要考虑研发团队的具体情况:比如机器的操作系统,团队成员的掌握情况,兼顾遗留项目等等。
当前Java最受欢迎的长期维护版本是Java8和Java11。
Java8是经典LTS版本,性能优秀,系统稳定,良好支持各种CPU架构和操作系统平台。
Java11是新的长期支持版,性能更强,支持更多新特性,而且经过几年的维护已经很稳定。
有的企业在开发环境使用OracleJDK,在生产环境使用OpenJDK。
也有的企业恰好相反,在开发环境使用OpenJDK,在生产环境使用OracleJDK。也有的公司使用同样的打包版本。
开发和部署时只要进行过测试就没问题。
一般来说。 测试环境、预上线环境的JDK配置需要和生产环境一致。
2. 什么是Java字节码?
Java 中的字节码,是值 Java 源代码编译后的中间代码格式,一般称为字节码文件。
2.1 字节码文件中包含哪些内容?
字节码文件中,一般包含以下部分:
版本号信息
静态常量池(符号常量)
类相关的信息
字段相关的信息
方法相关的信息
调试相关的信息
可以说,大部分信息都是通过常量池中的符号常量来表述的。
2.2 什么是常量?
常量是指不变的量,字母 | 或者数字 | 在UTF8编码中对应到对应的二进制 | |
格式都是不变的。同样地,字符串在Java中的二进制表示也是不变的, 比如 | 。 | ||
在Java中需要注意的是, | 关键字修饰的字段和变量,表示最终变量,只能赋 |
值1次,不允许再次修改,由编译器和执行引擎共同保证。
2.3 你怎么理解常量池?
在Java中,常量池包括两层含义:
静态常量池,class文件中的一个部分,里面保存的是类相关的各种符号常量。运行时常量池, 其内容主要由静态常量池解析得到,但也可以由程序添加。