荣耀面经(一面)-2022.9.08
首先说明,本人笨比一枚,若有些我的回答气死人,请原谅我。
流程:
- 自我介绍:姓名+学校+专业+科研项目+竞赛项目
- 谈及项目:
- 请说说项目背景
- 背景巴拉巴拉
- 整个项目有哪些模块,你负责哪些模块?
- 巴拉巴拉
- 看到GC算法,那么在堆中,将其分为了eden和s0和s1,那么其比例是多少?s0和s1的比例可以更改吗?怎么更改?
- 比例是8:1:1。s0和s1的比例不可更改,但是eden和survivor区的比例可以更改:通过-XX:SurvivorRatio设置比例
- 那么更进一步,为什么s0和s1的比例是不可变的?(自问)
- 这个问题我和室友讨论了一下,我目前的理解是:在GC回收新生代时,其会将eden和s0中存活的对象复制到s1中,然后清空eden和s0;下次再次回收新生代时,会将eden和s1中存活的对象复制到s0中,也就是说s0和s1的身份会调换。那么若其比例不一致,s0和s1有大有小,则当复制对象到小的si时,si(i=0,1)容量不足,从而将对象放入老年代的概率会比比例一致时的概率更大。而新生代的GC频率比老年代的GC回收频率更高,为释放更多的内存,尽可能的将对象放在新生代上会更好。
- (心中滴泪,我只知道一点呀)堆内存使用达到80%,(但是也还没到90%呀,那会出现什么问题呢?,疯狂思索,也没有报OOM)出现什么问题我也不知道,但是排查的话,我记得有一个软件可以将堆内存给dump出来,分析dump文件,可以分析每个类的使用内存情况。而具体的步骤,我不甚了解。堆内存溢出排查参考:https://blog.csdn.net/AnOrdinaryLife/article/details/106303015
- 答:(自信)Redis的基本数据类型有5中,其value可以是字符串string、哈希表hash、列表list、集合set和有序集合sortedset。
- 问:SortedSet的底层实现是怎么样的?
- 答:SortedSet的底层实现,我没有看过sortedset的底层实现,但是以我对Java的理解,去映射redis。我认为sortedset的底层实现是一个数组,一个Object[]数组。
- 问:那么SortedSet是怎么实现有序的呢?
- 答:我知道redis在存入zadd时,会指定数据的序号,那么这个序号时排列的依照。那么,在我的思路之上,其底层是一个object[]数组实现,那么其就类似ArrayList;而为了实现有序,我觉得每次插入时会维护数组的有序性,从而能够根据序号随机访问。
- 问:以这样子插入时维护数组的有序,那么当大量的数据插入时,每次插入都维护,那效率?
- 答:应该效率差不多吧
- 面试官答:哈,差很多的。其实SortedSet的底层实现是链表+跳表实现的。(面试官,笑,既然如此,咋们下一个问题吧,微笑)跳表参考:https://blog.csdn.net/WSYW126/article/details/105611088
4. 那么来聊聊笔试吧,你还记得笔试的题目吗?
- 答:(自信)记不清了,有点久了,请面试官提示一下吧。
- 问:最后一题是redis缓存的那道,我看你笔试判断整数多进制是否是回文的题,系统判断代码重复度较高呢?
- 答:不会吧,这道题比较简单的,Integer有一个自带函数toString(int i, int radix), 可将int类型的10十进制转化为指定进制的数据。我调库运行,所以若代码重复度较高我也没办法。进制转换代码参考:https://blog.csdn.net/m0_37961948/article/details/80438113
需求:
- 目录动态访问,需要访问的目录会随时变换,且不能重启服务器,该如何实现?
- 答:我的思路历程:代码是写不出来的,我可将思路告知面试官。首先访问不同的目录,可用重新调用函数,改变入参即可,但是不能重启服务器,方法也只调用一次,那硬编码就不行了。那若将目录以加载xml文件的形式,但是不能重启服务器呀,也不会重读xml文件。边思考变告知我的思路,最后请面试官给一些提示。
- 问:你其实可以在远端设置一个配置文件,去读配置文件即可,例如Apollo。
- 答:确实。是我思路狭隘了。这就类似Nacos的配置中心,Nacos可作为配置中心,在云端设置配置文件,然后去读取即可,在云端更改配置文件后,本地会自动拉取更改后的数据进行更新。
- 答:一个方法处理多个文件格式。我认为可以使用泛型,将txt、json等文件格式包装为对象,作为泛型对象,传入该方法,再调用各个对象的具体的处理方法即可。
- 问:考虑一下扩展性,你用哪种设计模式来处理?
- 答:我。。。不知道。(要恶补!!我常了解的只有工厂和单例模式哒,若要用工厂模式,其扩展性不行。单例模式,都不适用,麻了。)此处该使用适配器模式比较合适。设计原理参考:https://blog.csdn.net/sugar_no1/article/details/88317950
- 答:回答和第一个问题类似,在云端设置一个时间,拉取所配置的时间。
面试官的部门、在荣耀工作的感受。
面试结束啦,人已经崩溃啦,我当天下午的状态十分萎靡。郁郁寡欢。我将面试经历和线下的同学分享后,心情总算恢复,努力奋战下一场面试。
经过这次面试,结合上一次面试,我认识到面试官的问题会结合场景来细问一下技术的细节,其次mybatis,我还需要继续深入学习,redis的各个基本类型需要了解其底层实现,JVM方面需要对堆内存的分配、回收等需要更加细致的学习。在设计模式方面,至少掌握设计模式的分类,以及各个分类下的常用模式,以及常用模式的经典样例。
最后,每一场面试都是提升自己的机会,希望大家都有一个美好的未来。