Android虚拟机原理面试题汇总(含详细解析 三)

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇

Java中对象如何晋升到老年代?

这道题想考察什么?

Java基础掌握情况,掌握对象回收过程以避免开发时出现内存问题

考察的知识点

GC机制

考生如何回答

新对象的内存分配都是先在Eden区域中进行的,当Eden区域的空间不足于分配新对象时,就会触发年轻代上的垃圾回收,我们称之为"minor gc"。同时,每个对象都有一个“年龄”,这个年龄实际上指的就是该对象经历过的minor gc的次数。当对象的年龄足够大,当minor gc再次发生时,它会从Survivor内存区域中升级到年老代中。

因此对象晋升老年代的条件之一为:若年龄超过一定限制(如15),则被晋升到老年态。**即长期存活的对象进入老年代。**除此之外,以下情况都会导致对象晋升老年代:

  • 大对象直接进入老年代

    ​ 多大由JVM参数-XX:PretenureSizeThreshold=x 决定;

  • 动态对象年龄判定

    ​ 当 Survivor 空间中相同年龄所有对象的大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而不需要达到默认的分代年龄。

除了以上提到的几种情况外,其实还有一种可能导致对象晋升老年代:分配担保机制。

空间分配担保

在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间,

如果大于,则此次Minor GC是安全的

如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;如果小于或者HandlePromotionFailure=false,则改为进行一次Full GC。

为什么要进行空间担保?

新生代一般采用复制收集算法,假如大量对象在Minor GC后仍然存活(最极端情况为内存回收后新生代中所有对象均存活),而Survivor空间是比较小的,这时就需要老年代进行分配担保,把Survivor无法容纳的对象放到老年代。老年代要进行空间分配担保,前提是老年代得有足够空间来容纳这些对象,但一共有多少对象在内存回收后存活下来是不可预知的,因此只好取之前每次垃圾回收后晋升到老年代的对象大小的平均值作为参考。使用这个平均值与老年代剩余空间进行比较,来决定是否进行Full GC来让老年代腾出更多空间。

Minor Gc后的对象太多无法放入Survivor区怎么办?

假如在发生gc的时候,eden区里有150MB对象存活,而Survivor区只有100MB,无法全部放入,这时就必须把这些对象直接转移到老年代里。

如果Minor gc后新生代的对象都存活下来,然后需要全部转移到老年代,但是老年代空间不够,怎么办?

这时如果设置了 "-XX:-HandlePromotionFailure"的参数,就会尝试判断,看老年代内存大小是否大于之前每一次Minor gc后进入老年代的对象的平均大小。比如说,之前Minor gc 平均10M左右的对象进入老年代,此时老年代可用内存大于10MB,那么大概率老年代空间是足够的。

1、如果判断老年代空间不够,或者是根本没设置这个参数,那就直接触发"Full GC(对整个堆回收,包含:年轻代、老年代)",对老年代进行垃圾回收,腾出空间。

2、如果判断老年代空间足够,就冒风险尝试Minor gc。这时有以下几种可能。

  • Minor Gc 后,剩余的存活对象大小,小于Survivor区,那就直接进入Survivor区。
  • MInor Gc 后,剩余的存活对象大小,大于Survivor区,小于老年代可用内存,那就直接去老年代。
  • Minor Gc后,大于Survivor,老年代,很不幸,就会发生"Handle Promotion Failure"的情况 ,触发"Full GC"。

如果 Full gc后老年代还是没有足够的空间存放剩余的存活对象,那么就会导致**“OOM”** 内存溢出。

总结

实际上有四种情况可能会导致对象晋升老年代:

  • 大对象直接进入老年代
  • 年龄超过阈值
  • 动态对象年龄判定
  • 年轻代空间不足

判断对象是否被回收,有哪些GC算法,虚拟机使用最多的是什么算法?(美团)

这道题想考察什么?

是否掌握可达性分析法了解如何确定对象是否可被回收,从而避免程序内存泄露问题

考察的知识点

GC机制、可达性分析发、引用计数

考生如何回答

Java利用GC机制让开发者不必再像C/C++手动回收内存,但是并不是有了GC机制就万事皆可,在不了解GC机制算法的情况下,很容易出现代码问题导致该回收的对象无法被回收(内存泄漏),一直占用内存,导致程序可用内存越来越少,最终出现OOM。

首先GC会帮助我们自动回收内存,那么GC是如何确定对象是否可被回收的?在**《5.4 介绍下GC回收机制与分代回收策略》中介绍了可达性分析法**。而除了可达性分析法之外,还有被淘汰的引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

目前主流的java虚拟机都摒弃掉了这种算法,最主要的原因是它很难解决对象之间相互循环引用的问题,尽管该算法执行效率很高。比如:

class A{
    B b;
}
class B{
    A a;
}

A a = new A();
B b = new B();
//循环引用 导致无法释放
a.b = b;
b.a = a;

因此实际现在Java虚拟机都是采用的可达性分析法

由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

目录

在这里插入图片描述

第一章 Java方面

●Java基础部分
●Java集合
●Java多线程
●Java虚拟机

在这里插入图片描述

第二章 Android方面

●Android四大组件相关
●Android异步任务和消息机制
●Android UI绘制相关
●Android性能调优相关
●Android中的IPC
●Android系统SDK相关
●第三方框架分析
●综合技术
●数据结构方面
●设计模式
●计算机网络方面
●Kotlin方面

在这里插入图片描述

第三章 音视频开发高频面试题

●为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
●怎么做到直播秒开优化?
●直方图在图像处理里面最重要的作用是什么?
●数字图像滤波有哪些方法?
●图像可以提取的特征有哪些?
●衡量图像重建好坏的标准有哪些?怎样计算?

在这里插入图片描述

第四章 Flutter高频面试题

●Dart部分
●Flutter部分

在这里插入图片描述

第五章 算法高频面试题

●如何高效寻找素数
●如何运用二分查找算法
●如何高效解决雨水问题
●如何去除有序数组的重复元素
●如何高效进行模幂运算
●如何寻找最长回文子串

在这里插入图片描述

第六章 Andrio Framework方面

●系统启动流程面试题解析
●Binder面试题解析
●Handler面试题解析
●AMS面试题解析

在这里插入图片描述

第七章 企业常见174道面试题

●SD卡
●Android的数据存储方式
●Broadcast Receiver
●sp频繁操作会有什么后果?sp能存多少数据?
●dvm与jvm的区别
●ART
●Activity的生命周期
●Application能不能启动Activity
●…

在这里插入图片描述

搭建了一个基于chatGPT的微信群聊机器人,24小时为大家解答疑难技术问题, 需要的可以扫描二维码进群。

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值