本周总结,本周主要是对jvm进行了复习吧,其他时间除了练车就是有事,在家的效率还是比较低的,这两天又有事外出了,可能回不了家,在外面的学习时间会更少一点,但是白天也会抓住时间学习的,以下是我复习想的一些问题,有的顺手答出来一点,有的没有写,是因为答案我有的是背出来的,就懒得写结果了,这个问答博客就当作课余没事干的时候我自己看看吧
下周计划:学习以下jvm的工具吧,以及调优
-
说一下加载器的作用
-
总结一下类加载器
-
可以说一下双亲委派模型吗?
-
使用双亲委派模型的好处有哪些?
- 避免类的重复加载,也保证了java核心Api不被篡改
-
不想用双亲委派模型怎么办?怎么破坏?
- 自定义类加载器要继承classLoad,然后重写loadClass方法
-
GCRoots都可以有哪些?
-
说一下垃圾收集器的搭配情况
-
说一下G1垃圾收集器吧
-
说一下CMS垃圾收集器在手机的时候有几个步骤,每一个步骤都在干什么
-
说一下类的生命周期
- 加载,连接(验证,准备,解析),初始化,使用,卸载
-
说一下类的加载过程
- 主要是加载,连接,初始化
- 其中连接包含验证,准备,解析
-
加载阶段干什么?非数组类和数组类加载区别?
- 加载阶段一般有三步,第一步:通过该类的全限定名来获取该类的二进制字节流,第二步:将字节流的静态存储结构转化为方法区的运行时动态数据结构,第三步:在内存中生成一个java.lang.class对象,作为方法区这个类的各种数据访问的入口
- 对于java虚拟机规范中并没有对这三条有明确的规定,就比如说第一条,他没有说是从哪里获取类的字节流文件,比如说可以从zip中获取字节流,最终成为日后jar,war的基础,还有jsp生成的对应的class文件等等,从网络中获取
- 非数组类型的加载是该阶段可控性比较强的,可以重写loadClass()或者findClass()来控制字节流的获取方式
-
验证阶段目的是什么?验证阶段都验证哪几个部分,每个部分都验证什么信息?
- 验证阶段的目的是为了确保class文件中的字节流包含的信息符合java虚拟机规范中的全部约束,以确保这些信息被当作代码在运行时不会对虚拟机自身造成伤害
- 验证阶段是在类加载阶段中占比较重的一个阶段
- 验证阶段一般都验证四个部分:class文件格式验证,元数据验证,字节码验证,符号引用验证
- class文件格式验证:主要验证class文件是否正确,版本号是否能被java虚拟机处理,比如说魔数,还有主次版本号,常量池中是否有不被接受的常量
- 元数据验证:这个阶段主要对字节码进行语义分析,以确保字节码描述的信息符合java语言规范,他主要有这几个验证点,判断一个类是否有父类除了object,其他类都有父类,一个类的父类是否继承了不能被继承的类(被final修饰),非抽象类是否全部实现了其父类或父接口的所有方法
- 字节码验证:这个阶段主要是通过数据流分析和控制流分析,确保程序语义是合法的符合逻辑的,这个验证点主要是,保证任意时刻操作数栈的数据类型和指令代码序列能够配合工作
- 符号引用验证:确保解析正常运行本阶段通常校验以下内容:能否通过字符串描述的全限定名称找到该类,方法中是否存在字段描述符以及简单名称
-
准备阶段的目的是什么?分配的话在哪里分配?
- 准备阶段主要对类变量(静态变量,不是实例变量,实例变量在对象实例化的时候随着对象一块分配在堆中)进行分配内存和设置初始值
-
准备阶段需要注意什么?
- 初始化的是静态变量(类变量,不是实例变量,实例变量在实例化的时候随着对象一起分配在堆中)
-
基本数据类型的零值有哪些?说出五个
- char:‘\u0000’
- int: 0
- long :0l
-
请说一下解析阶段针对什么解析?
- 解析阶段是java虚拟机将常量池内符号引用替换为直接引用的阶段,主要对接口或类,字段,接口方法,类方法,方法类型,方法句柄,调用限定符
-
说一下符号引用和直接引用的区别
- 符号引用是class文件中的常量池中的,它是由任意的字面量组成的,他必须在加载解析的时候变成直接引用
- 直接引用是指向该目标的指针、相对偏移量,或一个间接定位到该系统的句柄
- 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。
-
请说一下初始化阶段执行什么方法,都有哪些情况需要初始化?
- 遇到new,getstatic,putstatic,invokestatic指令的时候
- 反射的时候
- 父类未被加载会先加载父类,接口不同,只有在用到父接口的时候才会加载
- main
- default
-
卸载类的适用场景是什么?哪些类可以被回收?
-
卸载类需要满足什么条件?
- 该类中的所有实例都已经被GC也就是说,堆中不存在该类中的实例
- 该类没有在其他地方被引用
- 该类的加载器的实例被gc