JVM常见问题


相关问题

  1. 双亲委派机制原理
    首先经过编译器编译的class文件,要加载到JVM当中,需要通过类加载器来完成。而JVM提供了三层类加载器来完成class文件的加载过程,这三个类加载依次是AppClassLoader, ExtClassLoader, BootstrapClassLoader, 加载顺序逐级增加,抛开自定义的类加载器,从AppClassLoader开始, 每次先判断该class是否被加载过,已经加载后,就不会重复加载。如果没有加载,则交给ExtClassLoader进行处理,ExtClassLoader同样也会先判断,而不会主动尝试进行加载,如果没有,则继续交给父加载器,及BootStrapClassLoader, 如果BootStrapClassLoader加载失败,则交给ExtClassLoader进行加载,如果ExtClassLoader加载失败,继续交给AppClassLoader进行加载,如果加载失败,则抛出异常。

加载, 验证,准备, 解析, 初始化

  1. 为什么要采取双亲委派机制
    防止类被串改,从而在一定程度上防止危险代码注入。

  2. 为什么要自定义类加载器?
    首先并不是所有的.class文件都是放在classpath下面,这个时候如果用JVM提供的类加载器是无法成功加载的。所以需要自定义类加载器来完成。有一些类文件,是从网络的输入流中获取,这个时候涉及一些加密和解密的动作,这个过程也需要自定义类加载器来完成,在一定程度上防止源码泄漏。

  3. 引用的类别?
    引用分为强引用,软引用,弱引用, 虚引用
    强引用: 只有引用存在,就不会被GC回收,直到JVM停止运行。
    软引用: 当内存不足当时候, 会被GC回收。
    弱引用:在下一次GC的时候,会被回收。
    虚引用:GC的时候就会被回收,不能通过引用取得对象值。

  1. 垃圾回收算法
  • 标记清除, 效率低, 小内存太多
  • 复制算法, 每次只能用一半内存 新生代处理,在survivor中处理,s1, s2 ,如果空间不足,则扔到老年代当中
  • 标记整理 针对老年代的处理方法
  • 分代收集 分代收集算法是根据内存的分代选择不同的算法。对于新生代,一般选择复制算法。对于老年代,一般选择标记-整理-清除算法。
  1. 垃圾回收器
  • serial 单线程垃圾收集器,处理新生代内存收集, 缺点慢
  • parnew 多线程垃圾收集器,实现原理是复制算法。 缺点较慢
  • Parallel Scavenge 收集器 实现原理复制算法, 新生代收集器, 优点:吞吐量优化
  • Cms 实现原理标记清除算法, CMS是一个并发的收集器。优点是减少延迟,增加响应速度 缺点: 占用大量的CPU资源, 空间碎片,无法处理浮动垃圾
  • G1 初始标记, 并发标记,最终标记, 筛选回收,优点:集中了其他回收器的优点,利用了多核的并行特点,分代收集,空间整合,可预测的停顿
  1. 判断对象是否可以为垃圾对象
  • 引用计数法, 每当一个对象被引用,则在计数器上加1, 当引用失效的时候,计数器为0
  • 可达性分析算法 从变量引用,虚拟机栈引用等出发, 然后开始从引用链向下出发,如果对象跟任何一条引用链没有相连,说明是可以进行回收的
  1. JVM运行时的数据区
  • 线程私有:本地方法栈, 程序计数器, 虚拟机栈, 线程共享: 堆, 方法区

  1. 新生代
    分为eden, survivor
    老年代

  2. 区分对象是垃圾对象的方法?

  3. 标记计数法

  4. 可达性分析

  1. JVM调优

  2. Xmn设置新生代大小,过小会增加Minor GC频率, 过大会减小老年代的大小。一般为1/4,1/3

  3. 设置的时候,尽量保证Xms=Xmx,可以使得堆相对稳定,避免不停的震荡

  4. 为了性能考虑, 一开始尽量将新生代对象留在新生代,避免新生代的对象直接进入老年代,这就造成了老年代的内存浪费,并且回收代价也高。(Full GC发生在老年代和方法区)

  5. 元空间主要存储的类加载信息, 常量, 静态变量 , 如果像spring通过动态代理生成很多类,就有可能超出设定的空间,发生元空间溢出情况。

  6. JVM命令

  7. jps查看进程相关信息

  8. jinfo查询JVM参数

  9. jstack查看JVM运行时的状态信息,包括内存状态,垃圾回收

  10. jmap查看内存信息

  11. minorGC的过程

  12. 初始阶段,新创建的对象被分配到eden区, survivor的两块都为空

  13. 当eden区满了, minorGC触发

  14. 经过扫描和标记, 存活的对象被放到S0, 不存活的对象被回收, 并且存活的对象年龄都增大一岁。

  15. 在一下的minorGC中,Eden区和上面的过程一致, 没有引用的对象直接回收,存活的对象被复制到survivor区。当eden和s0都满了, s0的所有数据都被复制到s1。

  16. 在下一次minorGC, 存活的对象被放到s0, eden和s1被清空

  17. 经过几次minorGC之后,当存活的对象年龄达到一个阈值之后,就会被年轻代转到老年代当中。


文章作者:
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 !
评论
  目录