1.JVM 内存分配与回收

Java 的⾃动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java ⾃动内存管理最核⼼的功能是堆内存中对象的分配与回收
Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap).从垃圾回收的⻆度,由于现在收集器基本都采⽤分代垃圾收集算法,所以 Java 堆还可以细分为:新⽣代和⽼年代:再细致⼀点有:Eden 空间、From Survivor、To Survivor 空间等。进⼀步划分的⽬的是更好地回收内存,或者更快地分配内存。
image.png
⼤部分情况,对象都会⾸先在 Eden 区域分配,在⼀次新⽣代垃圾回收后,如果对象还存活,则会进⼊ s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到⼀定程度(默认为 15 岁),就会被晋升到⽼年代中。image.png

2.堆内存中对象的分配的基本策略

image.png
image.png

2.1.对象优先在 eden 区分配

⼤多数情况下,对象在新⽣代中 eden 区分配。当 eden 区没有⾜够空间进⾏分配时,虚拟机将发起⼀次 Minor GC.

2.2.⼤对象直接进⼊⽼年代

⼤对象就是需要⼤量连续内存空间的对象(⽐如:字符串、数组)。
image.png

2.3.对象动态年龄判断
image.png

2.4.⻓期存活的对象将进⼊⽼年代

既然虚拟机采⽤了分代收集的思想来管理内存,那么内存回收时就必须能识别哪些对象应放在新⽣代,哪些对象应放在⽼年代中。为了做到这⼀点,虚拟机给每个对象设置了⼀个对象年龄(Age)计数器
image.png

image.png

总结:

针对 HotSpot VM 的实现,它⾥⾯的 GC 其实准确分类只有两⼤种:

部分收集 (Partial GC):

  1. - 新⽣代收集(Minor GC / Young GC):只对新⽣代进⾏垃圾收集;
  2. - ⽼年代收集(Major GC / Old GC):只对⽼年代进⾏垃圾收集。需要注意的是 Major GC 在有的语境中也⽤于指代整堆收集;
  3. - 混合收集(Mixed GC):对整个新⽣代和部分⽼年代进⾏垃圾收集。

整堆收集 (Full GC):

收集整个 Java 堆和⽅法区。

3. 如何判断对象是否死亡?(两种⽅法)

3.1. 引⽤计数法

给对象中添加⼀个引⽤计数器,每当有⼀个地⽅引⽤它,计数器就加1;当引⽤失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使⽤的

3.2.可达性分析算法

这个算法的基本思想就是通过⼀系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所⾛过的路径称为引⽤链,当⼀个对象到 GC Roots 没有任何引⽤链相连的话,则证明此对象是不可⽤的。
image.png
image.png

4.强引⽤,软引⽤,弱引⽤,虚引⽤

image.png
Especially,在程序设计中⼀般很少使⽤弱引⽤与虚引⽤,使⽤软引⽤的情况较多,这是因为软引⽤可以加速JVM对垃圾内存的回收速度,可以维护系统的运⾏安全,防⽌内存溢出(OutOfMemory)等问题的产⽣

5.如何判断⼀个类是的类” :

类需要同时满⾜下⾯ 3 个条件才能算是 “⽆⽤的类” :

  1. - 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
  2. - 加载该类的 ClassLoader 已经被回收。
  3. - 该类对应的 java.lang.Class 对象没有在任何地⽅被引⽤,**⽆法**在任何地⽅**通过反射访问该类的⽅法**