字节日常实习系统架构(一二面已offer)
系统架构一面:
较多八股
1. java的内存结构
2. gc垃圾回收会回收栈和方法区吗
3. 一个对象在堆和栈里面怎么分配内存(int和Integer),程序计数器是在栈上移动,怎么调用对象
4. java是值引用还是指针传递
5. 四种引用类型
6. 垃圾回收被判断为垃圾的对象还有机会吗
7. java的面向对象的特性
8. 接口和抽象类的区别, 接口内部可以实现类吗(内部类)
9. java的锁类型,java内部实现的锁,cas,reentrantlock,公平锁和非公平锁,sychronized锁的升级
10. thread local(没用过多线程)
11. 单线程和多线程的区别,线程和进程的区别
12. IO多路复用,redis里面IO多路复用怎么实现处理多个请求,如果redis放在多核的服务器上有用吗?
13. 线程和进程切换上下文开销为什么会更大,涉及到内核态和用户态的转换吗
14. 协程
15. redis的数据类型
16. 有序集合怎么实现,跳表和B+树的区别,B+树为什么适合mysql数据库
17. 数据和链表的区别
18. hashmap的底层数据结构,没了解过treemap,如果要你实现一个treemap怎么实现(红黑树)
19. 计网tcp和udp的区别,tcp的拥塞避免,udp的应用场景(视频的时候可以允许包的丢失,比如丢失一两个字)
20. 算法题:合并有序链表
3. java一个线程的执行都对应一个虚拟机栈,线程的方法执行对应栈帧的入栈和出栈,堆栈共用其实是将运行和存储分离,程序运行和上下文切换都是在栈中,栈的大小不是动态变化的,而一个对象的大小是不可估计的,所以栈中只存放基本数据类型,和对象的引用,这样对象存放在堆中更合适,线程执行的时候,只需要从栈中取的堆的引用就可以了。
8. 接口是不能实例化的,但是接口内和普通类一样可以定义内部类,这个内部类是可以实例化的
12. redis是单线程,redis并不适合多线程,单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),其他模块仍用了多个线程。一个是内存内的数据结构如果是多线程要上锁,要多很多复杂的操作,得不偿失,对内存的操作本来就很快了,多线程反而多了上下文的切换时间,如果部署在多核服务器上,官方的解释是可以在多核上开多个redis实例,实现分片集群
13. 线程的上下文切换一般在进程内部的虚拟地址切换,除了不同进程间的线程间切换,进程切换要切换硬件上下文,如果多核cpu可能还要涉及cpu转换,其实主要是因为进程是对应内存资源的基本单位,各个进程间的内存资源都不一样,切换麻烦,而同一进程下的线程切换只是在共享资源间切换,就方便许多。
16. B+树更矮,mysql需要对磁盘进行读取数据,B+树作为索引,对磁盘的IO次数更少,对磁盘的IO很费时,所以次数越少越好
系统架构二面
1. 有一篇数据库领域的A类文章,跟面试官聊了二十分钟
2. 聊完之后他问我最近在学什么,我说redis
3. 然后我从redis的底层数据结构,到五种对象,然后单机,多机,主从复制,哨兵机制,分片集群给他过了一遍,都是讲了一个概念,没深讲,差不多讲了十分钟吧
4. String的底层结构是什么?相比C的string有哪些优化
5. 跳表的实现
6. 分片集群的时候,如果一次性访问多个key,但是不在一个节点上,是怎么确保能取到正确结果的
7. 算法题:一亿个三维节点,怎么设计一个数据结构,让每次执行Topk(x,y,z,k)的时候能找到距离最近的k个点
二面完第二天约hr面了,hr面视频聊了十分钟就直接发offer了,不得不说字节的效率还是很高的,相比同时进行的hw,字节都拿到offer了,才开始约一面时间
#字节跳动日常实习##字节跳动##面试题目#