面试分享-jvm

1.fiaalize()方法什么时候被调用,析构函数(finalization)的目的是什么?

  1.当一个对象 gc roots 不可达时,在下一个垃圾回收周期并尝试回收该对象。如果这个对象重写了finalize()方法,并在这个方法中成功自救(将自身赋值某个引用),那么该对象不会回收,如果这个对象没有重写finalize()或者已经执行过了,那么这个对象自救失败,该对象也将被回收。

  2.对象逃脱死亡的最后一次机会(只要对象重新与引用链上的任何一个对象建立关联即可)但不建议使用,运行代价高,不确定性大,且无法保证各个对象的调用顺序,可用try-finally来代替

2.如果对象的引用被置为null,垃圾搜集器是否会立即释放对象占用的内存?

  不会,会等到下一次收集器执行的时候

3.什么是分布式垃圾回收(DGC)?他是如何工作的?

  1)Java虚拟机中,一个远程对象不仅会被本地虚拟机内的变量引用,还会被远程引用。

2)只有当一个远程对象不受到任何本地引用和远程引用,这个远程对象才会结束生命周期

RMI 子系统实现基于引用计数的“分布式垃圾回收”(DGC),以便为远程服务器对象提供自动内存管理设施。
当客户机创建(序列化)远程引用时,会在服务器端 DGC 上调用 dirty()。当客户机完成远程引用后,它会调用对应的 clean() 方法。
针对远程对象的引用由持有该引用的客户机租用一段时间。租期从收到 dirty() 调用开始。在此类租约到期之前,客户机必须通过对远程引用额外调用 dirty() 来更新租约。如果客户机不在租约到期前进行续签,那么分布式垃圾收集器会假设客户机不再引用远程对象
 

4.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

  serial 收集器是带线程工作,在工作的时候会停掉所用的用户线程

  throughput收集器是多线程并行收集器,减少 sotp-the-Word

5.在Java中对象什么时候可以被垃圾回收?

  当一个对象 gc roots 不可达时,在下一个垃圾回收周期并尝试回收该对象。如果这个对象重写了finalize()方法,并在这个方法中成功自救(将自身赋值某个引用),那么该对象不会回收,如果这个对象没有重写finalize()或者已经执行过了,那么这个对象自救失败,该对象也将被回收。

6.简述内存分配与回收策略以及Minor GC和Major GC?

  1.对象首先会存在ende区

  2.大对象会直接进老年区

  3.长期存活的对象会存在老年代

  4.动态对象年龄判断,是否进老年代

  5.空间分配担保(在发生 minor dc 时 jvm会检查老年代的最大连续空间是否大于新生代所用对象的总空间)

  Minor GC 发生在新生代收集动作,新生代对象朝生夕死minor gc 比较频繁

  Major GC 发生在老年代收集动作 如果老年代中的空间无法承受新生代所生存下来的对象是会触发 full gc 速度慢 不频繁

7.jvm的永久代发生垃圾回收吗?

  垃圾回收是不会发送在永久代,如果永久代满了或者超越了临界值,会触发full gc(垃圾完全回收)Java 8 已经移除了永久代新增了元数据区

8.Java中的垃圾收集的方法有哪些?

  标记-清除,

    复制,

  标记-整理,

  分代收集,

  垃圾收集器

    serial/serial old收集器,是单线程收集器,工作的时候必须停掉所有的用户线程,serial收集器针对新生代 采用复制算法,serial old 收集器针对老年代 采用标记整理算法

    parnew收集器 是serila收集器的多线程版本

    parallel Scavenga 收集器是新生代的多线程收集器(并行收集器不需要停掉其他线程)采用copying算法,与上两个版本不一样,这个可以达到可控的吞吐量(程序运行时间/(程序运行时间+gc运行时间))

    parallel old 收集器是parallel scavenga的老年带收集器 采用 Mark- compact(标记整理)算法

    cms(current mark - sweep)收集器是一种获取最短回收停顿时间为目标的收集器,是一种并发收集器,采用的 mark-sweep(标记清除)算法

    G1收集器 是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。

9.什么是类加载器,类加载器有哪几种?

  1.类加载器是负责把.class文件 加载到内存中。

  2.启动类加载器,扩展类加载器,应用类加载器,自定义加载器

10.类加载器的双亲委派机制?

  当一个加载器接到了加载类的任务,会先去请求父类加载器,加载器并不会直接加载,如果父类加载器没有办法完成的时候,子类加载器才会自己加载

原文地址:https://www.cnblogs.com/panda777/p/11179057.html