小米公司评价合集
面经合集目录
帖子标题 |
作者 |
原贴链接 |
小米后端开发日常实习二面 |
||
打工日记|入职小米一个月 |
||
自己第一份实习的收获和体验||武汉小米 |
帖子1:小米后端开发日常实习二面
应该是去年10月面的,最近复习八股,就每天往牛客贴一条面试记录,自己也复习一下。
1. 没让我自我介绍,而是问我还没找到实习吗? 。。。找到实习了我还面试干嘛。。。
2. 实习做了什么?项目来源?
3. redis常见数据结构,用了哪些?
4.除了redis还有知道有哪些缓存,回答memcached。追问区别。
5.布隆过滤器。(简历里写了用来解决缓存穿透,每次都会被问,面试官真的喜欢问这个)
6.jvm内存结构,垃圾回收算法
7.除了kafka还了解哪些消息队列,有什么区别,为什么有这么多种
8.读过哪些源码
9.算法题:快排
10.反问
对里面的八股我简单贴下回答和扩展(个人理解,有问题欢迎指出)
3. String:最常见,字符串和数字都能用String存。实现是动态字符串和int。
Hash:kkv结构。可用来存订单购物车这种,订单id——商品id——数量
List:
Set
ZSet:跳表实现,有序集合,可以根据元素权重来排序。排行榜,比如牛客有个人品排行榜,可能就是存了redis。有人送花,加了人品,可以通过 ZINCRBY命令来增加对应权重。
可能引申的问题:为什么ZSet的实现用跳表而不是其它结构例如红黑树
其它几种不常用数据结构BitMap,HyperLogLog,GEO,Stream
4.这个问题倒是不常见,因为基本都是用的redis。既然问了稍微背两句八股吧
相比于Memcached,redis支持更丰富的数据类型,而Memcached仅支持kv结构;
redis支持数据持久化(aof,rdb);
redis主流程单线程(aof刷盘,关闭文件,释放内存。注意还有这三个后台线程;6.0后又引入了多个线程来处理网络请求,当然不影响主线程是单线程),memcached是多线程
除了分布式缓存,还有常见的本地缓存像Caffeine
5. 布隆过滤器本质是一个很长的Bit数组以及多个hash函数,当写入一条数据进数据库,求多个hash函数的code,在数组的对应位置改为1。读取数据时,先通过多个hash函数找到对应哈希槽,如果里面有一个是0,就说明该数据一定不存在于数据库,也就不用查数据库了,很大程度上解决了缓存穿透。但注意,查的所有哈希槽都是1不代表该数据一定存在于数据库,因为存在hash冲突的问题。但是没关系,不过是多查一次数据库,还是能发现数据不存在的。
6.堆,虚拟机栈,本地方法栈,方法区,直接内存。 字符串常量池在堆中,运行时常量池在方法区中,直接内存是用的本地内存,jdk1.8将方法区移到了本地内存。
堆分为新生代,老年代,永久代(1.7之前有,1.8后被元空间代替,移到了本地内存,实际上都是对方法区的实现),其中新生代又能分为Eden,S0,S1(其中Eden区一般占内存较大)。新创建的对象首先分配在Eden区,当Eden满了会触发一次Minor GC,存活下来的对象会被移动到Survivor区(s0或s1,这两个区是对称的,每次只有一个用来使用),MinnorGC后,从Eden区和当前Survivor区中存活下来的对象会被复制到另一个Survivor区。在Survivor中存活下来多次(可通过jvm设置阈值)后就能进入老年代。
作用范围 触发时机
Minor GC: 新生代 Eden区满
MajorGC: 老年代 老年代空间不足
FullGC: 整堆+元空间(1.8) JVM显示请求(System.gc())或老年代严重不足
注意元空间用的是本地内存,一般比较充足,当然也可能把整个操作系统的内存全部用完了。
FullGC回收堆,自然是回收的垃圾对象。那么在元空间里回收什么呢?
元空间主要存放类的元信息,运行时常量池,方法定义,字段定义。。。
回收元空间主要是回收已经被卸载的类的元数据(包括类的结构信息墩、字段方法常量。。。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
收录站内真实有效的大厂中厂公司评价汇总,供牛友们参考 注:仅做拼团奖励发放使用