1、jvm组成
jvm由运行时数据区,类加载子系统,执行引擎,本地方法库组成
2、类加载的过程
类加载过程
加载:将类加载到内存里面
验证:验证class文件是否正经
准备:就是为static修饰的变量分配内存空间,如果final修饰直接赋值
解析:将java类中的符号转换为引用地址
初始化:为第三阶段的赋值
3、类加载器有哪些
启动类加载器—-加载lib目录的
扩展类加载器—-加载lib/ext目录的
应用加载器—-加载classpath下面的
3、双亲委托机制是什么
双亲委托就是指从启动类加载器开始往下找,如果找到了的类就不在找,直到应用加载器也没有找到就报类加载异常。
4、运行时数据区具体包括哪些,里面各自包括哪些
1、线程计数器————用于确定指令执行顺序
2、虚拟机栈
1、局部变量表
2、操作栈
3、动态链接
4、返回地址
3、本地方法栈
4、方法区/元空间————用于存储类信息和编译代码,方法区使用jvm分配内存,元空间使用本地内存
5、堆内存———-用于存储对象和数组
新生代——————新生代主要存储新创建的对象,最开始在Eden区,之后经历过垃圾回收就会到from s,
Eden
to suvior
from s
老年代———————大对象,或者是经历过默认15次以上未回收的对象
5、jvm怎么判断对象已死
引用计数法——标记引用计数,为0就回收,解决不了类相互依赖
可达性分析——通过垃圾回收的起点gcroots没有引用就回收,栈帧中的局部变量表,本地方法栈中引用的对象,方法区静态属性引用的对象,常量引用的对象。
6、垃圾回收算法有哪些,具体实现
标记清除——标记可以回收的回收
复制——复制到另一半内存空间回收这一半
标记整理——-标记存活,移动到一起,在删除其他的
分代收集—-新生代使用minor gc,一般是复制算法 老年代使用full gc 标记清除和标记整理
7、垃圾在什么时候回收
安全点:针对运行中的线程,是特殊位置,到达某一个安全点局可以进行回收
安全区:针对一段代码中的引用关系不会发生变化。
8、垃圾回收器有哪些
默认收集器
parallel scavenge 新生代收集器,多线程,注重吞吐量
parallel Old 老年代收集器,多线程,注重吞吐量
G1—针对整个堆内存,分配为单元,每个单元存储引用地址,没用就删除
9、jvm优化应该怎么做
使用jvisualvm进行分析
代码优化
1、避免创建过大的对象及数组
2、避免同时加载大量数据
3、当集合中有对象的引用,这些对象使用完之后要尽快把集合中的引用清空
4、可以在合适的场景(如实现缓存)采用软引用、弱引用
5、避免产生死循环
6、尽量避免长时间等待外部资源(数据库、网络、设备资源等)的情况