关于Java虚拟机中的垃圾回收---面试题

本文探讨了Java中垃圾回收的目的,解释了何时进行垃圾回收,详细介绍了system.gc()和runtime.gc()的作用,以及finalize()方法的调用时机。此外,还讨论了对象的生命周期、不同类型的垃圾收集器,如串行收集器与吞吐量收集器的差异,以及JVM永久代在垃圾回收中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Java中垃圾回收的目的:
  • 垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源
2.什么时候进行垃圾回收:
  • 垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行的
3.system.gc() 和 runtime.gc() 会做什么事情:
  • 这两个方法用来提示jvm要进行垃圾回收,但是,立即开始还是延迟进行垃圾回收是取决于jvm的
4.finalize() 方法什么时候被调用:
  • 当垃圾回收器要宣告一个对象死亡时,至少要经过两次标记过程:如果对象在进行可达性分析后发现没有GC Roots相连接的引用链,就会被第一次标记,并且判断是否执行finalizer() 方法,如果对象覆盖 finalizer() 方法且未被虚拟机调用过,那么这个对象会被放置在F-Queue队列中,并在稍后有一个虚拟机自动建立的低优先级的finalizer线程区触发finalizer() 方法,但不承诺等待其运行结束
5.析构函数(dinalization)的目的是什么:
  • 对象逃脱死亡的最后一次机会,只要重新与引用链上的任何一个对象建立关联即可,但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序,可以用try-finally或其他代替
6.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存:
  • 不会,在下一个垃圾回收周期中,这个对象将是可被回收的
7.串行收集器和吞吐量收集器的区别:
  • 串行GC:整个扫描和复制过程中均采用单线程的方式,相对于吞吐量GC来说简单,适用于但CPU,客户端级别
  • 吞吐量GC:采用多线程的方式来完成垃圾收集,适用于吞吐量要求较高的场合,比较适合中等和大规模的应用程序
8.对象什么时候可以被垃圾回收:
  • 当没有任何对象的引用指向该对象时,在下次垃圾回收周期到来的时候,对象才会被回收
9.jvm的永久代中会发生垃圾回收么:

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)如果你自己查看垃圾收集器的输出信息,就会发现永久代十倍回收的,这就是为什么正确的永久代大小对避免Full GC 是非常重要的原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值