JVM 有 Full GC,为什么还会出现 OutOfMemoryError呢?
点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
Your dream is not what you find in your sleep but what makes you not sleep.
所谓梦想,不是你睡觉时梦到了什么,而是想到了什么令你激动得没法睡觉。
每日掏心话
一切误会缘自智商的不对等。你很清楚地指出某人的问题时,她却无法理解,不是你分析得不够彻底,而是她的经历、见识和各种观念,都不足以支撑她理解更深更高层次的东西。
来自:R 大 | 责编:乐乐
链接:zhihu.com/question/38511221
程序员小乐(ID:study_tech)第 942 次推文 图源:百度
正文
平时有逛知乎的习惯,一般对JVM相关话题比较感兴趣。偶然看到这个问题,结果发现了一个很有意思的回复。
问题:
既然在触发Full GC的时候,年老代和持久带都会被清理,那么为什么还会出现OOM问题?
而且,对于强引用,当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
关注公众号程序员小乐回复关键字“offer”获取算法面试题和答案。
那么Full GC机制的存在有何意义?
还是说FGC主要针对的是驻扎在年老代的软引用?既然如此,对于四种引用的方式如何抉择?总不能所有对象都创建引用队列使用软引用或者弱引用吧?
R大回复
这个问题的意思是:
为什么我请了佣人来收拾房间,我的房间还是会堆满?
那我还请佣人来干什么?
他不是号称能把我房间里的垃圾都清理干净的么?
问题是如果您房间里堆的都是宝贝(或者看起来都是宝贝)的话,佣人也没辙。
怎么判断是不是宝贝呢?
就看主人有没有用手抓着它——被抓住的宝贝如果有连接到别的宝贝的话那被连接到的也算上。用力抓住的肯定是宝贝,一点没碰的肯定不是宝贝,半抓不抓着的先观望。
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。
猜你还想看
关注订阅号「程序员小乐」,收看更多精彩内容
嘿,你在看吗?