垃圾回收相关知识点

目录

1、System.gc()

2、内存溢出与内存泄漏

 2.1、内存溢出

2.2、内存泄漏

2.2.1 造成内存泄漏的可能原因

3、Stop The World

4、垃圾回收的并发与并行

5、安全点与安全区域

 5.1、安全点

5.2、如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?

5.3、安全区域(Safe Region)

6、引用


1、System.gc()

        在默认情况下,通过System.gc ()或者Runtime . getRuntime() .gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发GC),只有在垃圾回收线程抢到时间片时才会触发垃圾回收。

2、内存溢出与内存泄漏

 2.1、内存溢出

        内存溢出也就是内存被完全占用,后续程序无法正常运行,内存不够用,造成内存溢出的主要原因有两个:

  1. java虚拟机的堆内存大小设定过小
  2. 程序运行过程中创建了大量的对象,且长时间不能被垃圾回收器回收。

2.2、内存泄漏

        也称作“存储渗漏”。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏。

2.2.1 造成内存泄漏的可能原因

        单例的生命周期和应用程序是一样长的,所以单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄漏的产生。

        一些提供close的资源未关闭导致内存泄漏 数据库连接( dataSourse. getConnection()),网络连接(socket)和io连接必须手动close,否则是不能被回收的。

3、Stop The World

        Stop一the一World,简称STW,指的是Gc事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW。

        所有的垃圾回收器,都会存在STW,因为垃圾回收的分析过程必须在一个能确保一致性的快照中进行。一致性是指,整个分析期间整个执行系统仿佛冻结在了某个时间点上,如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证。

4、垃圾回收的并发与并行

  • 并行(Parallel) :指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。
  • 串行(Serial)相较于并行的概念,单线程执行。

  • 并发(Concurrent) :指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),垃圾回收线程在执行时不会停顿用户程序的运行。

5、安全点与安全区域

 5.1、安全点

        程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint)。

5.2、如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?

        抢先式中断: (目前没有虚拟机采用了) 首先中断所有线程。如果还有线程不在安全点,就恢复线程,让线程跑到安全点。

        主动式中断: 设置一个中断标志,各个线程运行到Safe Point的时候主动轮询这个标志,如果中断标志为真,则将自己进行中断挂起。

5.3、安全区域(Safe Region)

        安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。我们也可以把Safe Region 看做是被扩展了的Safepoint。

        线程处于Sleep 状态或Blocked状态,这时候线程无法响应JVM的中断请求,“走” 到安全点去中断挂起,JVM也不太可能等待线程被唤醒。对于这种情况,就需要安全区域(Safe Region)来解决。

实际执行时:

  • 1、当线程运行到Safe Region的代码时,首先标识已经进入了Safe Region,如果这段时间内发生GC,JVM会 忽略标识为Safe Region状态 的线程;
  • 2、当线程即将离开Safe Region时, 会检查JVM是否已经完成GC,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开SafeRegion的信号为止;

6、引用

  •  强引用(StrongReference) :最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“0bject obj=new object( )”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
  • 软引用(SoftReference) :在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。
  • 弱引用(WeakReference) :被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论内存空间是否足够,都会回收掉被弱引用关联的对象。
  • 虚引用(PhantomReference) :一个对象是否有虛引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象的实例。为一个对象设置虛引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知(回收跟踪)。

WeakHashMap使用的就是弱引用。

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值