【JVM】关于GC的一些问题,面试常问

目录0)为什么需要GC 垃圾回收呢?0)Java的回收机制1)可能导致Full GC:2)System.gc()的理解3) Java垃圾回收--强引用、软引用、弱引用、虚引用强引用——**OOM不回收**软引用——内存不足时回收弱引用——发现就回收虚引用——对象回收跟踪4)减少系统的停顿时间(STW)的算法——增量收集算法,分区算法5)STW(stop the world)6)分代收集算法——年轻代回收算法、老年代回收算法7)判断一个对象是否可以被回收8)解释一下对象的finalization机制0)为什
摘要由CSDN通过智能技术生成

0)为什么需要GC 垃圾回收呢?

  • 如果不及时对内存中的垃圾进行清理,这些垃圾独享一直占用内存知道程序结束,内存迟早会被消耗完,则可能会造成OOM
  • 垃圾回收,可以清理内存碎片,并且进行碎片整理将所有占用堆内存的移到另一端,是JVM可以将整理出来的内存分配给新的对象

0)Java的回收机制

  • Java的自动内存管理,无需开发人员分配与回收,这样降低内存泄露和内存溢出的风险。
  • 自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心于业务开发。

1)可能导致Full GC:

a) 年老代(Tenured)被写满;

b) 持久代(Perm)被写满;

c) System.gc()被显示调用;

d) 上一次GC之后Heap的各域分配策略动态变化;

2)System.gc()的理解

面试的时候这么多是记不住的,下面是帮助理解,所以总结一句话对System.gc()的理解

System.gc()底层就是Runtime.getRuntime.gc(),是显示触发Full GC,用户调用System.gc()的调用不一定会Full GC,只是提醒JVM的垃圾回收器执行Full GC,不确定是或否马上执行。

而System. runFinalization()方法:就是强制调用失去引用的对象的finalize()方法

1、在默认情况下,通过System. gc()或者Runtime . getRuntime() .gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。(System. gc()的底层就是Runtime . getRuntime() .gc() )

2、然而System. gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。也就是说调用System. gc() JVM不一定会去Full GC,GC与否还是JVM说了算,这也算Java内存自动管理机制的一个特点了。

3、JVM实现者可以通过System. gc() 调用来决定JVM的GC行为。**而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。**在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。

4、System. gc()只是提醒JVM的垃圾回收器执行Full GC,但是不确定是否马上执行。System. gc()与Runtime . getRuntime().gc()的作用一样。

而System. runFinalization()方法:就是强制调用失去引用的对象的finalize()方法

5、空口无凭,直接演示一下,为了证明System.gc()的调用不一样会Full GC,我试了好几次,终于有一次没有GC。

3) Java垃圾回收–强引用、软引用、弱引用、虚引用

有这些引用,是当内存空间还足够的时候,会保留这些引用在内存中,但是一旦内存空间在垃圾收集后还是很紧张,则可以抛弃这些对象。</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值