双亲委派机制

JVM G1垃圾回收算法

标记清除算法

  • 内存碎片对
  • 当有大对象需要分配连续的内存空间时,可能会触发再次的垃圾回收

标记整理算法

  • 清除之后整理
  • 避免产生大量内存碎片
  • 整体效率较低

复制算法

  • 内存区域一分为二,内存利用率较低
  • 效率较高,没内存碎片
  • 适合朝生夕死的内存区域
  • 不适合对象存活率较高的老年代使用

分代回收法

  • 对于新生代朝生夕死采用复制算法,将内存空间分为三部分8:1:1
  • 老年代/源数据区采用标记清除/整理算法

GC(G1)

首先先解释下怎么给JVM定义什么是垃圾

如果JVM里判断垃圾就是指没有对象引用

那么很容易出现一个问题,比如三个都没有用的对象 A指向B,B指向C,C指向A 那么在判断的时候,这三个都不是垃圾

所以我们引入根可达算法,简而言之就是在栈空间是否有引用,就是是否当前正在使用的对象,不管你堆空间里面如何互相调用,我只管你是否正在被使用。

定义了垃圾为何物,现在就到了垃圾回收过程

首先我们将垃圾分为新生代和老年代

新生代:常常占用内存小,存活时间短,所以会频繁引起垃圾回收

老年代:常常占用内存大,存活时间长,所以不会频繁引起垃圾回收

我们常说的四个垃圾回收算法

  1. 标记清除法 垃圾碎片多
  2. 标记整理法 没有内存碎片 内存移动性能损耗大
  3. 复制法 浪费内存,比如我买了张8G内存条,使用复制算法可能就只有4G了
  4. 分代算法 综上

GC算法里面是将

内存空间以 新生代与老年1:3的比例 划分

其中新生代里面又分为8:1:1 分别叫做伊甸区 s0 s1

创建对象是新生代就放入新生代内存区 是老年代就放入老年代区 比如这个对象占用内存过大就直接放入老年代

一次YGC 先是使用标记清除算法将垃圾回收,剩下的一堆内存碎片复制进S0区域

老年代回收一般就使用标记整理算法

第二次YGC的时候会将伊甸区里存活下来的对象复制进s1区域 同时还会将上次一YGC,s0

里的对象复制进s1

每存活一次新生代年龄增加1 markdown

GC算法要注意FGC,如果

他将老年代与新生代分为3:1

新生代内部伊甸:s1:s2为 8:1:1

如果对象过大直接丢入老年代

第一次新生代