java gc面试_JavaGC面试题

GC的标记算法

引用计数算法

通过判断对象的引用数量来决定对象是否可以被回收

每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1

任何引用计数为0的对象实例可以被当作垃圾收集

优点:执行效率高,程序执行受影响较小

缺点:无法检测出循环引用的情况,导致内存泄漏

可达性分析算法(主流)

通过判断对象的引用链是否可达来决定对象是否可以被回收

d0f014bd16ea22e2058b394059bc3aee.png

可以作为GC Root的对象

虚拟机栈中引用的对象(栈帧中的本地变量表)

方法区中的常量引用对象

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

本地方法栈中JNI(Native方法)的引用对象

活跃线程的引用对象

GC的垃圾回收算法

标记-清除算法(Mark and Sweep)(适合垃圾少)

标记:从根集合进行扫描,对存活的对象进行标记(可达性分析算法)

清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存

8d27a8a3443735af766cbc97be8a611e.png

标记-整理算法(Compacting)(适合垃圾少)

标记:从根集合进行扫描,对存活的对象进行标记(可达性分析算法)

整理:移动所有存活的对象,且按照内存地址次序依次排列,将末端内存地址以后的内存全部回收(对标记-清除算法的优化,防止内存碎片问题)

复制算法(Copying)(适合垃圾多,减少复制的对象数量)

将内存分为对象面和空闲面

对象在对象面创建

存活的对象被从对象面复制到空闲面,此时原先的对象面变为现在空闲面,被复制了对象的原先空闲面变为现在对象面

分代收集算法(Generational Collector)

以上回收算法的组合拳

按照对象生命周期的不同划分区域以采用不同的垃圾回收算法

年轻代使用复制算法(年轻代,垃圾多适合复制算法),老年代使用标记整理算法或标记清除算法(老年代,垃圾少适合这两种算法)

2fd0361d4b55b8167606712a40d3bf12.png

1791ad50afc706901f0867d90d59efa5.png

年轻代使用的算法,也叫Minor GC

年轻代的内存分布(Eden区,两个Surrvivor区(from区,to区))

54f581e4af32c43d26223826fbaf3a8c.png

313b91012bab21944bcf9d0b9a27da7f.gif

对象如何晋升到老年代

经历一定Minor次数依然存活的对象

Survivor区中存放不下的对象

新生成的大对象(-XX:+PretenuerSizeThreshold 大于该值直接放进老年代)

常用的调优参数

-XX:SurvivorRatio:Eden和Survivor的比值,默认8:1

-XX:NewRatio:老年代和年轻代内存大小的比例

-XX:MaxTenuringThreshold:对象从年轻代晋升到老年代经过GC次数的最大阈值

老年代使用的算法

Full GC(新老同时一起GC)和Major GC(老年代GC:标记-整理算法)

触发Full GC的条件

老年代空间不足

永久代空间不足(jdk8前)

Minor GC 晋升到老年代的平均大小大于老年代的剩余空间

调用System.gc()

年轻代常见的垃圾收集器

JVM的运行模式

Server:启动慢,重量级,启动后运行速度快

Client:启动快,轻量级,启动后较Server运行速度慢

Serial收集器

-XX:+UseSerialGC,复制算法

单线程收集,进行垃圾收集时,必须暂停所有工作进程

简单高效,Client模式下默认的年轻代收集器

f37de319a0aaea886a16233308f5cbdc.png

ParNew收集器

-XX:+UseParNewGC,复制算法

多线程收集,其余行为、特点和Serial收集器一样

属于Server模式下的收集器单核执行效率不如Serial,在多核下执行才有优势

f6299378e1801690412a7d03119c1717.png

Parallel Scavenge收集器

-XX:+UseParallerel,复制算法

吞吐量=运行代码的时间/(运行代码的时间+垃圾收集时间)

比起关注用户线程停顿时间,更关注系统的吞吐量

在多核下执行才有优势,Server模式下默认的年轻代收集器

0ab45ce9ac2f3e657ae081213c5af724.png

老年代常见的垃圾收集器

Serial Old收集器

-XX:+UseSerialOldGC,标记-整理算法

单线程收集,进行垃圾收集时,必须暂停所有的工作线程

简单高效,Client模式下默认的老年代收集器

2d705b1bef780611108ae0b3755b13cc.png

Parallel Old收集器

-XX:+UserParallelOldGC,标记-整理算法

多线程,吞吐量优先

CMS收集器

-XX:+UseConcMarkSweepGC,标记-清除算法

07f6bd1771402fe33b1d9834b329865b.png

ddd340a45e8f84cd52d19c178a9532c1.png

新老代集成的垃圾回收器

G1收集器

-XX:+UseG1GC,复制+标记-整理算法

ce0467f3e3412bc9754b512b7066a99f.png

垃圾收集器之间的联系

连线表示可以共用

6fddaeee5084de2c17b273f17918e5cf.png

Java中的引用类型

强引用

最普遍的引用:Object obj=new Object()

即使抛出OutOfMemoryError(内存满了)也不会回收具有强引用的对象

通过将对象设置为null来弱化引用,使其被回收

软引用(Soft Reference)

对象处在有用但非必须的状态

只有当内存空间不足时,GC会回收该引用的对象的内存

可以用来实现高速缓存

同样,软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

2cdc935b68cfd767d4790ade8ea7e176.png

弱引用(Weak Reference)

非必须的对象,比软引用更弱一些

GC时会被回收

被回收的概率也不大,因为GC线程优先级比较低

同样,弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

5d417175858f7c3522f29f18183587ad.png

虚引用(PhantomReference)

不会决定对象的生命周期

任何时候都可能被垃圾收集器回收

跟踪对象被垃圾收集器回收的活动,起哨兵作用

必须和引用队列ReferenceQueue联合使用

a2cb7efbd8631847fc1b54239e7917bc.png

四种引用的关系

ea000bfa9a74a7df5c6fd92815210fd0.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值