相关问题
- 双亲委派机制原理
首先经过编译器编译的class文件,要加载到JVM当中,需要通过类加载器来完成。而JVM提供了三层类加载器来完成class文件的加载过程,这三个类加载依次是AppClassLoader, ExtClassLoader, BootstrapClassLoader, 加载顺序逐级增加,抛开自定义的类加载器,从AppClassLoader开始, 每次先判断该class是否被加载过,已经加载后,就不会重复加载。如果没有加载,则交给ExtClassLoader进行处理,ExtClassLoader同样也会先判断,而不会主动尝试进行加载,如果没有,则继续交给父加载器,及BootStrapClassLoader, 如果BootStrapClassLoader加载失败,则交给ExtClassLoader进行加载,如果ExtClassLoader加载失败,继续交给AppClassLoader进行加载,如果加载失败,则抛出异常。
加载, 验证,准备, 解析, 初始化
为什么要采取双亲委派机制
防止类被串改,从而在一定程度上防止危险代码注入。为什么要自定义类加载器?
首先并不是所有的.class文件都是放在classpath下面,这个时候如果用JVM提供的类加载器是无法成功加载的。所以需要自定义类加载器来完成。有一些类文件,是从网络的输入流中获取,这个时候涉及一些加密和解密的动作,这个过程也需要自定义类加载器来完成,在一定程度上防止源码泄漏。引用的类别?
引用分为强引用,软引用,弱引用, 虚引用
强引用: 只有引用存在,就不会被GC回收,直到JVM停止运行。
软引用: 当内存不足当时候, 会被GC回收。
弱引用:在下一次GC的时候,会被回收。
虚引用:GC的时候就会被回收,不能通过引用取得对象值。
- 垃圾回收算法
- 标记清除, 效率低, 小内存太多
- 复制算法, 每次只能用一半内存 新生代处理,在survivor中处理,s1, s2 ,如果空间不足,则扔到老年代当中
- 标记整理 针对老年代的处理方法
- 分代收集 分代收集算法是根据内存的分代选择不同的算法。对于新生代,一般选择复制算法。对于老年代,一般选择标记-整理-清除算法。
- 垃圾回收器
- serial 单线程垃圾收集器,处理新生代内存收集, 缺点慢
- parnew 多线程垃圾收集器,实现原理是复制算法。 缺点较慢
- Parallel Scavenge 收集器 实现原理复制算法, 新生代收集器, 优点:吞吐量优化
- Cms 实现原理标记清除算法, CMS是一个并发的收集器。优点是减少延迟,增加响应速度 缺点: 占用大量的CPU资源, 空间碎片,无法处理浮动垃圾
- G1 初始标记, 并发标记,最终标记, 筛选回收,优点:集中了其他回收器的优点,利用了多核的并行特点,分代收集,空间整合,可预测的停顿
- 判断对象是否可以为垃圾对象
- 引用计数法, 每当一个对象被引用,则在计数器上加1, 当引用失效的时候,计数器为0
- 可达性分析算法 从变量引用,虚拟机栈引用等出发, 然后开始从引用链向下出发,如果对象跟任何一条引用链没有相连,说明是可以进行回收的
- JVM运行时的数据区
- 线程私有:本地方法栈, 程序计数器, 虚拟机栈, 线程共享: 堆, 方法区
堆
新生代
分为eden, survivor
老年代区分对象是垃圾对象的方法?
标记计数法
可达性分析
JVM调优
Xmn设置新生代大小,过小会增加Minor GC频率, 过大会减小老年代的大小。一般为1/4,1/3
设置的时候,尽量保证Xms=Xmx,可以使得堆相对稳定,避免不停的震荡
为了性能考虑, 一开始尽量将新生代对象留在新生代,避免新生代的对象直接进入老年代,这就造成了老年代的内存浪费,并且回收代价也高。(Full GC发生在老年代和方法区)
元空间主要存储的类加载信息, 常量, 静态变量 , 如果像spring通过动态代理生成很多类,就有可能超出设定的空间,发生元空间溢出情况。
JVM命令
jps查看进程相关信息
jinfo查询JVM参数
jstack查看JVM运行时的状态信息,包括内存状态,垃圾回收
jmap查看内存信息
minorGC的过程
初始阶段,新创建的对象被分配到eden区, survivor的两块都为空
当eden区满了, minorGC触发
经过扫描和标记, 存活的对象被放到S0, 不存活的对象被回收, 并且存活的对象年龄都增大一岁。
在一下的minorGC中,Eden区和上面的过程一致, 没有引用的对象直接回收,存活的对象被复制到survivor区。当eden和s0都满了, s0的所有数据都被复制到s1。
在下一次minorGC, 存活的对象被放到s0, eden和s1被清空
经过几次minorGC之后,当存活的对象年龄达到一个阈值之后,就会被年轻代转到老年代当中。