Java垃圾回收器与内存分配策略

一、如何判断对象已死?

引用计数法--Python

存在循环引用问题

可达性分析法--Java

GC Roots对象:

虚拟机栈中的引用对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

本地方法栈中引用的对象

引用类型--JDK1.2

强引用

软引用

弱引用

虚引用

生存还是死亡?

如果对象在进行可达性分析之后没有与GC Roots相连接,那么它会被标记并且进行筛选,筛选条件是是否有必要执行finalize()方法,如果此对象没有finalize()方法或者已经被调用过,这时,此对象才是真正的死亡

二、回收方法区

方法区(永久代)垃圾回收主要收集:废弃常量和无用的类

满足下列条件则为无用的类:

       该类所有的实例都已经被回收

       加载该类的ClassLoader被回收

       该类对应的Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

满足上述条件也仅仅是可以,而不是必然。在大量的反射、动态代理等场景都需要JVM具备类卸载的功能来防止永久代的溢出

三、垃圾回收算法

标记清除算法

效率问题:标记和清除俩个效率都不高

空间问题:标记清除会产生大量的不连续内存碎片,导致需要分配较大内存时,无法找到足够连续的空间而提前触发一次垃圾回收

复制算法--新生代

复制算法是为了解决标记-清除的效率问题。但是对象存活率较高时,则效率会降低。这时,我们就引入了老年代算法。每次一个周期年龄涨一岁,到十五岁则将其放入老年代。

标记-整理算法--老年代

复制算法在对象存活率较高时会进行比较多的复制操作,效率会变低,因此老年代不使用复制算法,针对老年代提出来标记-整理算法。

分代收集算法

JVM收集器采用分代收集算法,,将对象存活周期将内存化为几块。一般讲Java堆分为新生代和老年代,新生代中采用复制算法,老年代中采用标记-清除或者标记-整理算法。

面试题:请问了解Minor GC和Full Gc么,这俩种GC有什么不一样吗

Minor GC:称为新生代GC,发生在新生代的垃圾收集,由于Java对象都具有朝生夕死的特性,因此Minor GC非常频繁,因此回收速度比较快

Full Gc:称为老年代GC,发生在老年代的垃圾收集,出现了Full GC,一般会伴随一次Minor GC,Full GC一般比Minor GC慢十倍以上

四、垃圾收集器

Serial收集器--新生代收集器、串行GC

ParNew收集器--新生代收集器、并行GC

Parallel Scavenge收集器--新生代收集器、并行GC

Serial Old收集器--老年代收集器、串行GC

Parallel Old收集器--老年代收集器、并行GC

CMS收集器--老年代收集器、并发GC

G1收集器--全区域垃圾回收器

五、内存分配及回收策略

对象优先在Eden分配内存

大对象直接进入老年代

长期存活对象进入老年代

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值