某司:
- 如何提高应单率~某个业务问题
- MySQL存储引擎及差异,说了myisam的表行数没啥用,因为业务中很少count*并且没有where条件的情况
- 连接有心跳,设计一种数据结构管理他们,快速发现超时等,按心跳时间戳排序,堆结构
- 讲项目和业务中间穿插各种奇怪的场景问题
- 怎么理解ioc,rd定义创建方式以及依赖,生成模板,把创建以及初始化和依赖管理等等动作交给spring,因此将对象的部分控制权交给spring
- es的索引结构,是怎么根据一个值快速找到文档的 (倒排索引,没啥说的)
- pxc原理,为啥要用,和主从比较的优缺点(pxc高可用,强一致性。DB是业务的最后一道防线(其实最底层的防线是日志),一致性至关重要)
- Redis分布式锁的使用,以及它所存在的问题,需不需要规避,哪种场景怎么选(失效问题,误删问题,主从模式下释放或加失败问题)
- 为什么要用es,地理点位及评价
- 好多记不清了
某某司:
- final关键字使用及作用 类 方法 属性 局部变量
- 对象分配过程 类加载->逃逸分析->TLAB->eden&from&to->old,另外gc就是由内存分配引起的
- cms流程 初始标记(标记出roots)->并发标记(根据roots向下一层继续标记)->预处理(记不清了,应该是处理引用变更dirty card)–>最终标记–>并发清除
- 线程池 参数,shutdown 会中断执行中的任务吗?running的是不会被中断的,io阻塞的是runnable状态也不会被中断.
- MySQL需不需要主键,为啥需要,为啥一般都是数字 B+树索引结构,叶子要排序,数字比较快没有多余的计算啥的
- 事务特性,以及innodb分别怎么保证 借大佬的话:(一致性是目标,需要其他的三个性质保证一致性。隔离性 mvcc, 持久性 redo log, 原子性 redo/undo)
- sql优化器 (没答上来,没接触过)
- 慢sql优化思路 (explain 查看执行计划,合理的使用索引,利用好联合索引减少回表, join 尽量别要, 无论对将来的大表还是分表, join都不太友好)
- 聚簇索引与非聚簇索引 (聚簇主键索引文件即数据文件,非聚簇索引叶子存的是地址)
- 为啥是b+树 不是b树和二叉树 (预读,4k&16k,磁盘寻址次数)
- Redis分布式锁,为啥用 (互斥场景,判定set是否成功, 不互斥的场景,也可以作标记使用,这种场景也可以不用)
- volatile关键字 可见性, 程序执行有序(happen-before规则), 禁止重排序
- monitor对象有哪些属性 (只答了 _owner,等待队列两个,其实还有重入次数,还有别的)
- 线程的状态有哪几种 (NEW,RUNNABLE,WAITING,TIMED_WAITING,BLOCKED,TERMINATED)
- 好多记不清了
某某某司
16. 整场都是我在讲项目以及业务,以及问题及各种解决方案优劣势比较
17. 二面也是
某某某某司
18. MySQL事务及索引相关
19. Redis数据类型 结构 以及删除策略
20. 操作系统,select poll epoll
21.网卡收到的数据是怎么被应用程序感知到的?(中断处理例程)
22. url展示详细过程
某某某某某司:
- gc算法 CMS收集原理;
- CMS与G1的区别 (处理dirty card不太一样,cms收集老年代,G1收集整个堆,都是分代算法,都依赖基础的标记整理,复制,清除);
- 对象分配过程 ;
- jvm运行数据区 ;
- 堆正常但是进程经常被kill,啥原因; 我会往直接内存(堆外内存)上考虑
- jvm参数 ; 最大值,新老比例,eden&from&to比例,gc日志
- 线程池参数 拒绝策略 ;拒绝, 不处理,。。。。。
- 直接内存使用场景; 多是io使用
- guava内存删除策略 ; get的时候会检查所有过期的key
- Future在抛异常的时候isDone返回的是true吗,不想用get但是想在任务完成的时候收到通知,怎么办 是true,扩展ListenableFuture
- MySQL索引结构 与二叉树对比的优势 (os的预读, io次数即磁盘寻址次数)
- rpc调用过程 (几个组成部分 注册中心 producer consumer. consumer动态代理进行网络通信,producer使用wrapper生成代码在优化反射)
- Redis集群方式分片 需要虚拟节点作映射
- 灵活的分配线程池的两个size (统计,在coreSize之外的次数, 队列里的任务数等,调整coreSize以及maxSize的值,或者 直接走配置中心,手动调整)
- 四个Java进程部署在同一台物理机,有一个进程在某段时间进行频繁的磁盘io,导致我的应用响应缓慢。 怎么解决或规避,负载均衡的策略是在哪一端做 (根据响应时间作负载均衡,负载均衡当时答的在客户端做)
- mq基本原理 如何保证数据不丢失,有没有重复消息 (在保证消息不丢失的情况下,避免不了要重试,重试就与可能受到重复消息,所以需要业务方幂等)
- 啥是缓存击穿,怎么解决.key不过期,数据更新时主动缓存或者拦截key只允许一个线程查db
- 活动项目怎么抽象的,补偿是怎么做的; 流程抽象,多活动复用,补偿就是重试,有记录表,数据有状态,每次重试前先检查我方以及依赖方的状态
- 分布式锁以及事务问题
- 遇到的线上问题,怎么排查 (根据链路追踪找问题节点,如果大批量的RT激增,需要看受影响的业务的公共特性,比如DB,缓存等等多数不是因为机器的活某个服务的问题)
- 订单流程的并发怎么处理,状态不一致怎么处理的(标记状态,加后续流程拦截,没有采用简单的加锁,1是影响其他业务性能 2是不确定PXC架构是否可以正常加行锁,目前还在研究中)
- 发单策略,轮选
- 为啥选择pxc,强一致,高可用。db是业务的最后一道防线,db的一致性至关重要
- 如果大量的请求接单,怎么扛并发业务和技术两个角度分别准备怎么做,业务上利用缓冲buffer抢单进池子,大顶堆结构,排序按某些指标打分,达到最大时间限制时,拿出顶部接单,其余的都返回失败
总结:
- 八股还是有点用的,明知道会问却不去了解,只能说明你态度或者智商或者处事有问题, 吹嘘八股无用论的,有种面试都说"没用,我不答"
- 需要平时注意线上各种问题解决方案,以及更优方案,以及方案确定时的考虑,哪怕不是自己发现的,哪怕不是自己解决的,了解并学到别人的思路那就是自己的
- 纯背八股是不太可取的,随便来俩灵活的问题贼容易被问住
- 多思考每一道面试题产生的背景,比如新生代:老年代一般是1:2,那么为什么呢,有没有新生代很大老年代很小的场景
- 比如Java内存分配过程,为什么需要逃逸分析,为什么要有tlab
- 比如线程池大小为什么要那样设置,为什么要选那样的队列
- 比如非阻塞io,为什么需要,诞生的背景,进化历程,为什么是select poll epoll这么个发展历程
- 不管是简单复杂, 小型或大型, 独立或合作开发的业务或基础组件, 肯定有一些亮点在等着你去发现。
- 最后深恶痛绝一下, 看代码先不看有没有啥高端技术, 有没有啥模式。只要没有【注释】就都是 【屎】。
所有
算法题:反转单链表 从第m开始反转n个节点
算法题:自己实现bitmap
算法题:无锁计数器,按key计数
算法题:从一个数字组成的集合中找出出现次数最多的1个或几个数,要求循环尽可能的少,不考虑空间
算法题: 归并排序
算法题: 力扣42
算法题: 找多叉树的公共节点
算法题: 找出二叉树中和为给定值的路径
算法题: 力扣41
算法题: 快速排序
算法题: 手写lru
算法题: 二叉树右视图
算法题: 双端栈