JVM面试篇(下)

本文详细探讨了Java垃圾回收的基本原理和机制,包括垃圾收集器的工作方式、垃圾回收的两种主要机制(引用计数和可达性分析)、内存分代(新生代、老年代、永久代)以及各种垃圾收集算法(标记-清除、复制、标记-整理、分代收集)。此外,还介绍了Java中不同类型的引用以及如何判断对象是否可回收。垃圾回收器如Serial、Parallel、CMS和G1等也在讨论范围内。
摘要由CSDN通过智能技术生成

垃圾收集器

简述 Java 垃圾回收机制


在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。


GC 是什么?为什么要 GC


  1. GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存。

  2. 回收会导致程序或系统的不稳定甚至崩溃 Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动。

  3. 回收内存的目的, Java语言没有提供释放已分配内存的显示操作方法。


垃圾回收的优点和原理。2 种回收机制


Java 语言最显著的特点就是引入了垃圾回收机制,它使 Java 程序员在编写程序时不再考虑内存管理的问题。

由于有这个垃圾回收机制, Java 中的对象不再有“作用域”的概念,只有引用的对象才有“作

用域”。


  1. 垃圾回收机制有效的防止了内存泄露,可以有效的使用可使用的内存。
  2. 垃圾回收器通常作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。

程序员不能实时的对某个对象或所有对象调用垃圾回收器进行垃圾回收。垃圾回收有分代复制 垃圾回收标记垃圾回收、增量垃圾回收


垃圾回收器的基本原理是什么?


对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。


主动通知虚拟机进行垃圾回收的办法?


通常,GC 采用有向图的方式记录管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当 GC 确定一些对象为" 不可达"时,GC 就有责任回收这些内存间。


垃圾回收器可以马上回收内存吗?


可以。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。


我们能保证 GC 执行吗?


不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证GC 的执行。


Java 中引用类型有哪些?


  • 强引用:发生 gc 的时候不会被回收。
  • 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。
  • 弱引用:有用但不是必须的对象,在下一次 GC 时会被回收。
  • 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference 实现虚引用,虚引用的用途是在 gc 时返回一个通知。

强引用、软引用、弱引用、虚引用的区别?


思路: 先说一下四种引用的定义,可以结合代码讲一下,也可以扩展谈到ThreadLocalMap 里弱引用用处。

  • 强引用

    我们平时 new 了一个对象就是强引用,例如 Object obj = new Object();即使在内存不足

    的情况下,JVM 宁愿抛出 OutOfMemory 错误也不会回收这种对象

  • 软引用

    如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

      SoftReference<String> softRef=new SoftReference<String>(str); // 软引用
    
    • 用处:软引用在实际中有重要的应用,例如浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。

      1. 如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建
      2. 如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出.

      如下代码


Browser prev = new Browser(); // 获取页面进行浏览
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用 
if(sr.get()!=null){
	rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
}else{
	prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了
	sr = new SoftReference(prev); // 重新构建
}

  • 弱引用

    具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

      String str=new String("abc"); 
      WeakReference<String> abcWeakRef = newWeakReference<String>(str);
      str=null;
      等价于
      str = null;
      System.gc();
    
  • 虚引用

    如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二价亚铁.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值