JVM—GC算法
双亲委派机制
JVM G1垃圾回收算法
标记清除算法
- 内存碎片对
- 当有大对象需要分配连续的内存空间时,可能会触发再次的垃圾回收
标记整理算法
- 清除之后整理
- 避免产生大量内存碎片
- 整体效率较低
复制算法
- 内存区域一分为二,内存利用率较低
- 效率较高,没内存碎片
- 适合朝生夕死的内存区域
- 不适合对象存活率较高的老年代使用
分代回收法
- 对于新生代朝生夕死采用复制算法,将内存空间分为三部分8:1:1
- 老年代/源数据区采用标记清除/整理算法
GC(G1)
首先先解释下怎么给JVM定义什么是垃圾
如果JVM里判断垃圾就是指没有对象引用
那么很容易出现一个问题,比如三个都没有用的对象 A指向B,B指向C,C指向A 那么在判断的时候,这三个都不是垃圾
所以我们引入根可达算法,简而言之就是在栈空间是否有引用,就是是否当前正在使用的对象,不管你堆空间里面如何互相调用,我只管你是否正在被使用。
定义了垃圾为何物,现在就到了垃圾回收过程
首先我们将垃圾分为新生代和老年代
新生代:常常占用内存小,存活时间短,所以会频繁引起垃圾回收
老年代:常常占用内存大,存活时间长,所以不会频繁引起垃圾回收
我们常说的四个垃圾回收算法
- 标记清除法 垃圾碎片多
- 标记整理法 没有内存碎片 内存移动性能损耗大
- 复制法 浪费内存,比如我买了张8G内存条,使用复制算法可能就只有4G了
- 分代算法 综上
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
如果对象过大直接丢入老年代
第一次新生代
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地