1.fiaalize()方法什么时候被调用,析构函数(finalization)的目的是什么?
1.当一个对象 gc roots 不可达时,在下一个垃圾回收周期并尝试回收该对象。如果这个对象重写了finalize()方法,并在这个方法中成功自救(将自身赋值某个引用),那么该对象不会回收,如果这个对象没有重写finalize()或者已经执行过了,那么这个对象自救失败,该对象也将被回收。
2.对象逃脱死亡的最后一次机会(只要对象重新与引用链上的任何一个对象建立关联即可)但不建议使用,运行代价高,不确定性大,且无法保证各个对象的调用顺序,可用try-finally来代替
2.如果对象的引用被置为null,垃圾搜集器是否会立即释放对象占用的内存?
不会,会等到下一次收集器执行的时候
3.什么是分布式垃圾回收(DGC)?他是如何工作的?
1)Java虚拟机中,一个远程对象不仅会被本地虚拟机内的变量引用,还会被远程引用。
2)只有当一个远程对象不受到任何本地引用和远程引用,这个远程对象才会结束生命周期
RMI 子系统实现基于引用计数的“分布式垃圾回收”(DGC),以便为远程服务器对象提供自动内存管理设施。
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.类加载器的双亲委派机制?
当一个加载器接到了加载类的任务,会先去请求父类加载器,加载器并不会直接加载,如果父类加载器没有办法完成的时候,子类加载器才会自己加载