jvm学习笔记
谈谈你对java的理解:
平台无关性:一次编译处处运行
GC:垃圾回收机制
语言特性:泛型、反射、lambda等
面向对象:封装、继承、多态
类库:集合、并发库、自带库等
异常处理:exception
Compile Once、Run Anywhere如何实现(平台无关性):
首先代码会经过.java文件会经过javac的编译生成字节码.class文件,然后正因为.class文件的生成有了平台无关的基础,.class时候经过JVM的解析生成对应平台的执行指令,JVM提供了Linux,WIn,IOS等平台的解析、Java虚拟机在执行字节码文件时,会把字节码转成具体平台上的机器指令。
为什么不将源码直接改为机器码去执行?
每次执行都需要进行检查、方便兼容,可以将其他语言解析成字节码提高兼容性
javap -c反解析字节码文件.class
jvm如何加载.class文件:
主要先将通过class loader将符合其格式的加载到内存
通过Execution Engine 对命令进行解析
native interface 融合不同开发语言的原生库为java所用
Runtime Data Area:JVM内存空间结构模型
java反射:
java反射机制就是可以动态的获取类中的方法属性以及动态的调用对象的方法和属性
Method method = class.getDeclaredMethod(methodName,参数类型)//可以获取该类中所有的方法
私有的方法和参数需要:method.setAccessible(true)将其公开调用
Method method = class.getMethod(methodName,参数类型)//可以获取该类中公有的方法
Field name= class.getDeclaredField(FieldName)//可以获取该类中所有的参数,并且可以调用get,set方法修改
私有的方法和参数需要:method.setAccessible(true)将其公开调用
谈谈class Loader:
类从编译到执行的过程:
什么是class Loader:
class Loader是负责从系统外部获得Class二进制数据流,将Class文件中的二进制数据流装载进系统,交给java虚拟机进行连接、初始化等操作。
class loader 的种类:
BootStrapClassLoader:C++编写,加载核心库java.*
ExtClassLoader:Java编写,加载扩展库javax.*
APPClassLoader:Java编写,加载程序所在目录。
两个关键函数:
findClass :查找.class文件
defineClass: 定义class,将.class读入,经过处理后返回一个class类
类的双亲委派机制:
1.自底向上的检查是否已经加载过
2.如果都没有加载过,就会自顶向下尝试寻找加载类,如果从顶层节点开始的指定路径都没有该类的话,就会最后通过ClassLoader按照findClass方式查找.class的字节数组,有的话就装载
好处:
防止多份同样的字节码的加载成相同的类
类的加载方式:
隐式加载:new(支持使用带参构造器生成实例)
显式加载:loadClass,forName(使用反射传入参数)
loadClass和forName的区别
forName在加载的时候会默认调用static代码块中的内容进行初始化,例如sql jar包中的Driver就是使用forName加载实例调用他的static初始化Driver
ClassLoad延时加载技术是不需要执行任何初始化内容,可以加快加载的速度,把初始化的工作留到实际应用中。
java内存模型
本地方法栈:与虚拟机栈相似,主要是作用于标注了native的方法(native:相当于调用不同的原生函数,与不同语言进行底层的交互)
元空间替代永久代的优势
面试常问题
并且在java堆中存放了实例后的对象
线程中会分配相应的虚拟机栈,本地栈和程序计数器来对方法进行实现