垃圾回收机制

  • 匿名对象:没有引用执行的对象
    • 作用:如果只想调用一次方法或者访问一次属性可以使用匿名对象(节省空间)
      • 不可对匿名对象进行下一步的操作

垃圾回收机制

  • 概述:垃圾回收机制实际上是JVM内部运行的一个优先级比较低的后台线程,这种多线程的模式使得java 具有更好的性能,完全不用程序员参与。垃圾回收机制仅仅作用于堆内存,于栈内存无关。
  • 注意:垃圾回收机制针对的只是堆内存

什么样的对象才会被垃圾回收机制回收?

  • 没有引用指向的对象
    • 匿名对象
    • 对象的引用被赋值为null;
    • 超出变量的生命周期

JVM内存分析

  • :栈的存取速度比堆快,效率高。在栈内保存基本数据类型的局部变量和对象的引用值。
  • :堆可以保存那些对空间要求较大的变量。如对象的属性和数组的元素。在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字new的地方必定分配了一个堆内存。
  • 新生代:存放新建的对象
  • 老年代:存放生命周期长的对象或者比较大的对象
    • 生命周期长:经过15次 minor gc还存活的对象
    • 比较大的对象:byte[] b = new byte[1024 1024 1024]
  • 永久代::它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类。
  • 方法区:存放类的信息和对象共享的数据(常量 静态资源 字符串常量池)
  • 元空间:在jdk 7之后,原先位于方法区里的字符串常量池已被移动到了java堆中。并且在jdk8以后,使用元空间替代了永久代。
  • PC寄存器:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。

垃圾回收机制是如何进行回收?(垃圾回收算法)

  • Mark-Sweep(标记-清除)算法
    这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。具体过程如下图所示:
    181024382398115.jpg
    从图中可以很容易看出标记-清除算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。
  • Copying(复制)算法
    为了解决Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。具体过程如下图所示:
    181041528488728.jpg
    这种算法虽然实现简单,运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。
    很显然,Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低。
  • Mark-Compact(标记-整理)算法
    为了解决Copying算法的缺陷,充分利用内存空间,提出了Mark-Compact算法。该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。具体过程如下图所示:
    181100129575916.jpg
  • Generational Collection(分代收集)算法
  1. 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
  2. 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。
  3. 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收。
  4. 新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

1646883291620.png