java面试——JVM
谈谈你对java的理解
- 平台无关性
- GC
- 语言特性(泛型、反射、lamda)
- 面向对象(封装、多态、继承)
- 类型
- 异常处理
Complie Once,Run Anywhere如何实现?(平台无关性)
java一般分为编译时(javac指令)、运行时
java源码被编译成字节码,再由不同的平台的JVM进行解析,Java在不同平台上不需要重新编译,JVM在执行字节码时,只需转换成不同平台上的机器码
为什么JVM不直接将源码解析成机器码去执行?
准备工作:每次执行都需要各种检查
兼容性:也可以将别的语言解析成字节码
如何查看字节码?——>>javap
JVM如何加载.class文件?

Class Loader:依据特定格式,加载class文件到内存
Execution Engine:对命令进行解析
Native Interface:融合不同开发语言的原生库为java所用
Runtime Data Area :JVM内存空间结构模型
类的加载是指把类的.class 文件中的数据读入到内存中,
反射
java反射机制是运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能为java语言的反射机制。
类的加载方式
隐式加载:new
显示加载:loadclass.forName等
loadclass和forName的区别
类的加载过程
加载:通过ClassLoader加载class文件字节码,生成Class对象
链接:
- 校验:检查加载的class的正确性和安全性
- 准备:为类变量分配存储空间并设置类变量初始化值
- 解析:JVM将常量池内的符号引用转换为直接引用
初始化:执行类变量赋值和静态代码块
java的内存模型
内存简介

地址空间的划分
>>内核空间
>>用户空间

程序计数器(Program Counter Register)
>>当前线程所执行的字节码行号指示器(逻辑)
>>改变计数器的值来选取下一条需要执行的字节码指令
>>和线程是一对一的关系即“线程私有”
>>对java方法计数,如果是Native方法则计数器值为Underfined
>>不会发生内存泄露

浙公网安备 33010602011771号