腾讯蚂蚁字节美团后台实习
腾讯
最初电话面
- 自我介绍
- JVM的内存模型(描述的不流利,有点慌张,可以回答的更好)
- 堆:对象内存分配,创建,销毁的地点。
- 虚拟机栈。给方法分配栈帧,然后保存局部变量等信息。
- 本地方法栈。就是给本地方法,和虚拟机栈一样。
- 方法区:存储一些类信息,名字等。
- 程序计数器:解析为字节码后的代码行号
- 垃圾回收算法(三个算法太过于口语化了,中间还出错了)
- 复制算法:将内存一分二,分配的内存在一边,回收的时候将未被回收或者逃脱回收的对象放在另外一边。
- 标记回收:将需要被回收的对象标记然后直接回收,就会产生很多内存的碎片
- 标记整理:将需要被回收的对象标记然后直接回收,并且将未被回收的对象进行整理形成连续的内存。
- 有没有开发一个比较系统的JAVA项目
- 进程和线程的区别
- 进程是系统资源分配和调度的基本单位
- 线程是进程的一个实体,进程之间不会共享地址空间和内存资源,而同一个进程的线程则会。
- 线程一般不拥有系统资源,但是有一些必不可少的资源(ThreadLocal存储)
- 进程切换比线程切换消耗更多资源,因为要保存当时的环境变量,已经为新进程铺设新的环境。
- 线程和进程你喜欢哪个。(很懵逼)接着问 你为什么喜欢。
- 线程遇到一些临界资源怎么处理。
- 为了保证安全第一种是加锁
- 乐观锁
- 乐观锁介绍一下
1.乐观锁采用了更加宽松的加锁机制。悲观锁大多数是将整个需求的数据锁住,然后独占,而乐观锁在一定程度上是解决了。在Java中CAS操作就是乐观锁的体现,先是获取数据的值,然后在次获取比较如果相同则执行操作不同则重新获取,直至2次相同为止。 - 原子性解释一下。
对于涉及共享变量访问的操作,若操作从执行线程以为的任意线程来看是不可分割。
可见性:一个线程对共享变量的更新,对于后续访问该变量的线程是否可见的问题。
有序性:一个处理器上运行的线程锁执行的内存访问操作在另外一个处理器上运行的线程来看是否有序的问题。 - TCP状态转换。
- CLOSED:起始状态,连接关闭或者超时的时候变化此状态。
- LISTEN:监听来自网络节点上其他主机的TCP端口连接请求。
- SYN_RCVD:当服务器收到客户端的连接请求时就从LISTEN->SYN_RCVD:
- SYN_SEND:客户端发送请求建立连接,当收到服务器端的确认后就从SYN_SEND->SYNRCVD;
- ESTABLISHED:完成三次握手之后就会进入创建连接状态。
- FIN_WAIT_1:主动关闭方发送关闭的请求后从CLOSED->FIN_WAIT_1;
- CLOSED_WAIT:被动关闭请求,发送ACK
- FIN_WAIT_2:收到了CLOSED_WAIT发送的ACK,从FIN_WAIT_1->FIN_WAIT_2
- CLOSED_WAIT_LAST_ACK;当不需要在接受客户端的数据时发送,最终的确认:从CLOSED_WAIT-> CLOSED_WAIT_LAST_ACK;
- TIME_WAIT:当收到了服务器端最终的确认后,发送确认收到等待2个MSL然后关闭;FIN_WAIT_2-> TIME_WAIT;
- CLOSING:同时关闭。
- TCP怎么保证有序。
将数据进行分块,然后进行连续的标号。还有超时重传的机制,丢弃重复的数据,检验出接受段有差错则丢弃。 - 3个数据包只剩下中间那个包没有收到。
- 在发送方:如果没有收到已发送数据的序列号的确认回复在超过2个MSL后就会重传
- 接收方:当收到了第三个包,而还未收到第二个包时就会认为包丢失,然后重复发送第一个数据包的序列号进行回复,接受收到这个回复就就会重新发送。
- UDP的应用场景
1.用于即时通讯,比如游戏,直播,或者视频通话等,尽最大努力的交付,允许有帧的丢失 - 用UDP实现TCP的功能(如何让UDP在应用层上有序获得数据)
1.确认机制2.超时重传机制3.分包发送,包调序等确认。 - 10万个数据进行排序(快排)
- 快排的基本过程
随机找到一个关键节点或者平均节点,然后通过一趟待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对2部分进行相同的操作。 - 找10万个数据的中位数(数据没有任何一个特点)
- 将数进行分区,然后统计每个区域的数量,然后就能得到中位数所在的那个区域,然后在对所在区域,然后再次统计该区出现的数的个数最终得出中位数。
- 将数进行高位(二进制)分割,高位为0在一个内存然后,1的在另外一个内存,然后多于一般的内存里的数在进行次高位0,1分配,最后找到中位数
- 找10万数中最大的10个数。
用一个小顶堆,维持10个数,然后进行遍历。
最好的方法是将:10万数分成100份等,然后在进行Hash去重复,最好在使用一个小顶堆。 - 图的基本算法讲一下。
- 迪杰斯特:找到初始点直接相连的权值最小的点,加入集合,在以该节点找直接相连的最短的节点,如果找到的点也和先前已经加入集合相连并且此时的路径最短则从刚刚哪条线路,以新进的点继续进行刚刚节点的寻找。
- 弗洛伊德:将每一个点作为一个中间节点看待,然后用2个二维数组分别统计距离和到另外一个节点的中转节点。其实思想是差不多的,只是会更加的简介。
- 描述一下项目,难点在哪里
- TCP实时通讯有没有用到epoll和select
IO多路复用技术:在一般的服务器与客户端中,每个客户端创建一个进程或者线程来进行处理,但是当客户端数量巨大的时候就需要,此时的线程/进程的上下文切换花销的性能就会巨大。为了解决这个问题就提出了这个技术,让每一个客户端维持一个或者多个端口(io通道),然后通过这个通道进行数据的交换。
Select()是通过一个数组,来对维护文件的描述符,当服务器准备好数据的时候就修改文件描述符,然后返回否则一直进行循环遍历指导文件描述符改变。然后将数据从内核态拷贝用户态,然后再次遍历所有管道将数据读取处理。完成后进入下一次循环,但是开始时初始化文件描述符数组。有大小的限制,一般为1024个。
Poll()和select()差不多只不过是通过链表,所以没有数量的限制,不需要每次都初始化文件描述符
Epoll()则于poll和select不一样,服务器与用户共享内存所以不进行内核态和用户态转换,并且把准备好数据的管道重排序也就是放到前面,并返回数量。当用户接收时直接从前面管道获取为O(1)的复杂度,并且没有数量的限制。 - HashMap底层原理是怎么样的
- 红黑树和平衡二叉树有什么区别。(描述红黑树和平衡二叉树)
- 平衡二叉树为了维护自身的平衡性,当插入和删除节点时就需要维护,对于多插入和修改的树来说,维护的开销是极大的。
- 红黑树则只需要维护自己的规则,就好了,维护开销没那么大,适合多更改少查询的树。
- 如何存储一百万条URL
- 假如一个程序出现了性能问题,一般要怎么解决。(速度慢了)
- 问Linux文件系统原理
- 伙伴系统
- 操作系统怎么进行内存分配
- MYSQL查询的基本原理
腾讯TEG初试
- 自我介绍
- 讲项目(怎么实现讲了30多分钟)
- 迪杰斯特,弗洛伊德,最小生成树的算法思想是什么
- TCP/UDP的区别是什么
- 三次握手谈论的内容是什么(TCP相对于UDP怎么保证可靠性,当时还不明白他要问什么)答案:滑动窗口大小,初始序列号,确认机制,重传机制,重复数据丢失机制,根据序列号大小判断什么包丢失了再次请求发送。
- 谈你知道的锁有哪些(其实他想讲互斥锁这类,当时我没理解以为谈java锁,然后谈了CAS以及存在的ABA问题,以及如何解决)
- 100无序个数找第K大的数
a) 利用小顶堆即可(nlogk)
b) 利用哈希算法,将数分组,一个范围一组,然后在找到第90个数 - 三个链表的数相加(当时没问清题目的要求)
腾讯-应用开发
初试
- 算法4题
a) 阶乘 (先简单编写,然后在聊到越界问题,然后在聊到大数乘法)
b) 链表节点的删除(注意只给要删除的节点)
c) 排序顺组旋转(先暴力解决,然后在说进行3次反转,面试官说优化了很好)
d) 3sum为0 - 自我介绍
- 聊七大排序算法及稳定性
- HTTP各版本区别
- HTTP和HTTPS的区别
- HTTPS的底层原理
- Session和cookie的区别
- Session在服务器是存在哪里的,可能会出现什么问题,会怎么解决(其实就是问session的弊端)
- 常见的web安全问题(SQL注入,CSRF,DDos,XSS)
- 请求方式get,post的区别
- 数据库索引结构等
- 聊项目
复试
- 自我介绍
- 各个项目的详细介绍(以及常规套路问法,项目背景,你做了啥,难点是啥,你怎么解决的,还让我打开了其中一个项目,问我亮点是啥)
- 常见的会话状态(session,cookie,token)
- 触发子是怎么做的
- 你所了解的mysql索引包含哪些
- 聚集/非聚集索引区别
(可能我运气好?开始聊天了) - 你为什么不保研,考研的(成绩还算可以)
- 你在大学有啥遗憾,最有成就感的事
- 给你一次机会,重新做啥的
- 工作地点等
字节跳动
一面
- 算法-写区间合并(自己太菜+面试官自己干自己的事+写很久没写出来)
- TCP头包含哪些信息
- 四次挥手的过程
- HTTP和HTTPS的区别
- 了解CSRF,DDos,XSS?
- Mysql索引等(索引就是b+树嘛?问懵了)
- Linux基本操作命令
- 聊聊项目
(然后草草结束了,可能自己太菜了,然后面试官后面的不怎么给脸,而且在电脑面前有说笑但不是和我,中途还离开当我描述的时候)
阿里
蚂蚁金服一面
- 自我介绍
- HashMap和ConcurentHashMap的介绍底层原理(整个一个过程)
- 加载因子,扩容的数量,多线程下是否安全,为什么不安全,2个版本的区别
- ConcurrentHasp1.7/1.8区别,怎么做的
- 谈谈线程池及各个参数,(出题:核心线程池2,队列5,这时来了10个请求,情形是怎么样的。)说实话到这里我才意识到,扎实的基础是这样的
- 谈谈数据库索引
- 问分库分表(不懂)
- 分布式数据库怎么保持一致性
- 问Redis了解嘛(不懂)
- 聊项目了开始(常规套路,上面说过)
蚂蚁金服二面
(自我介绍都不用?难道我面了个假试)
- 然后发了个连接到我邮箱写代码,很简单(有序链表合并)
- 谈谈Spring容器初始化过程
- 谈谈AOP,JDK动态代理和cglib的区别
- 谈谈SpringBoot(不懂)
- 分布式数据库相关(我也不懂)
- 常见设计模式
- 问项目(常规套路)
- 开始了灵魂发问,为啥不应用框架,为啥不改进,你学了那么多知识为啥不用,这样会记得很清晰更加熟悉
- 开始给建议:平时多练多写多思考,平时除了计网算法数据结构操作系统等基础知识学校,还需要有其他
只能说:阿里的面试是真的难,平时我看阿里的面经也会问问其他基础知识(锁高并发,JVM等),然而上来就是各种各样的框架,我……当时就开始怀疑人生,面完晚上我也开始沉默思考人生了
美团
一面(小姐姐好评,问的不深,但问的很广)
- HTTP和HTTPS的区别
- HTTPS整个访问过程
- Get/post请求方式的区别
- 谈谈HashMap/concurrentHashMap
- 谈谈ArrayList和LinkedList区别,突然发问LinkedList是不是双向链表,之前一直在复习其他知识,突然被问,沉默,这说明基础知识还是要常常复习,虽然简单
- Volatile关键字及语义
- AQS队列,以及一般用在哪些地方
- 死锁4个条件,以及怎么预防等
- 谈谈类加载器及类加载过程
- 谈谈JVM内存模型
- 谈谈CMS和G1垃圾回收器
- Spring IOC,AOP
- 问Sping boot(没学)
- Mysql索引
- 当你知道sql语句慢了,你是怎么操作(explain)
- 谈谈你熟悉的Explain的几个关键字
- 谈项目(常规套路)
- 平时你是怎么单元测试的(平时没有测试,就实现了功能在提高性能,也就没问了确实不懂)
- 写算法
a) 二叉树中序遍历(你可能没听错这也太简单了吧,但是他给你一些数据,你需要先构造这个二叉树,都是几行数据几行数据,差点翻车,我就没做过要自己构造数据在写算法的)
b) Nim游戏(之前看过思考过秒懂,假装思考,其实是确认不出错) - 工作地点
基本上都答上了,但是有时候答的可能不清晰,自我感觉良好,毕竟没有深挖,果然下午就发明天面试通知了。小姐姐面试Nice,nice,nice,nice……