面试题2018
Contents
蚂蚁金服
在线编程半小时
- 手写单例模式
- 实现一个集群模式下系统生成唯一流水号的算法:流水号不能重复、不能生成一次访问一次数据库
- 从给定的数组中找3个数,让他们的和为0.输出所有可能
- jvm类加载机制 或者任意WEB服务器的类加载机制
- 有一个程序能够接受很多网络申请,同时把这些网络请求中携带的信息记录下来。如果是记录至文件,那么瓶颈可能是哪些,如何设计来提高性能,其中的关键点是?相应的解决方案又有哪些副作用呢?
电话面试题
- JUC下的Executors框架熟悉吗? 不熟悉,那么数据库的线程池熟悉吗? 超过连接数如何处理
- 命令模式、责任链设计模式
- Loombok的实现原理是什么? 反射和编译期Anotation Process过程
- Spring的IOC原理,AOP实现机制。
- TCP的3次握手,阻塞队列的流量控制
- AIO有用过吗?Socket编程有了解吗?
- redis的集群和持久化方式
阿里云部门
2018-3-22 技术面试
- 频繁跳槽的原因,能否接受出差,自我介绍
- 最有挑战性的一个问题,如何解决的。(我聊了任务调度,从前端到后端完整的过程)
- mysql B+树的索引实现原理
- 线上频繁FULLGC 如何排查?何时会触发 FULLGC ,永久代如果满了,如何解决
- ZK 分布式锁原理
- JMeter 测试工具是否有用过
蚂蚁金服财务对账部门
- 介绍之前做过的项目:特别是 增值税项目(因为是金融方面的面试部门),大概的业务模块和业务处理方式。
- 你的技术如何?是偏项目管理还是技术开发,因为我项目介绍当中侧重了项目整体
- JVM的类加载机制。 和Tomcat容器的类加载机制。如果一个类已经被加载了,但是做过了修改,如何重新加载?
- 有没有做过分布式的项目,我说我们的项目就是消息队列实现通讯,消息队列当中如何保证A消息准确的传递到了B消息,如何确保数据一致性? 分布式事务的实现方式?有什么RPC的手段实现? Dubbo的原理是什么,有没有使用经验,如何使用,和Spring cloud的区别是什么?
- Spring的事务传播机制级别有哪些?默认的事务传播机制是什么,如何实现B事务独立,不管抛不抛出异常都继续执行A事务
网易云音乐部门
一面电话面
2018-3-23
- Spring相关技术:我讲了IOC AOP MVC,挨个讲了一遍,Spring AOP的运用除了事务控制和日志还有哪些运用
- nginx中tomcat集群的配置,如何配置权重,以及整个过程
- Redis原理和 Memcache的区别,redis的请求竞争
- Zookeeper的原理和分布式锁
- SpringBoot的特点,和Spring的区别,如何现实 习惯优于配置,常用的注解
- 8*2如何最快的实现
- String 、StringBuilder、StringBuffer的区别
- 网络协议讲一下:我讲了TCP的三次握手 四次挥手 还有阻塞模式和滑动窗口。说完他都不敢问了。
二面、三面
- 分布式事务的具体实现(提到了RocketMQ实现了重传和幂等性)
- Tomcat的线程管理和如何控制并发,讲了一下JAVA的JUC下的线程池,构造函数,然后他问实际使用场景。
- mysql如何支持并发写的操作–>分库
- 奖金池的操作,抢票操作,如何从数据库层面实现。
- BolckQueue 如何防止服务器挂了 –> 数据库持久化–>数据库存储 Or 文本保存
- Redis 集群和持久化
- ZK的分布式锁实现原理,nginx做网关如何实现 –>业务是有新的url匹配规则 和 动态变化的NODE信息,做一个网关实现 ZK 和 Nginx的搭配
- java锁机制 和运用–> 我说了 Socket编程当中IO流的 线程池使用,还有ConcurrentHashMap中的分段锁和volatile的使用,问CHMap中size()的实现原理
- 消息队列的原理,以及如何实现事务(RocketMq里面有实现,但是实现原理是如何,具体在代码层面如何做实现)
- 测试这一块,知道哪些? 功能性测试、软件测试、压力测试(简历当中写了功能测试)
- 自己在项目中负责哪些模块?介绍下业务 和技术
- 项目的架构(我按照技术+实现的功能 大致讲了一下)
- xml解析的两种方式:一种快的,一种慢的,边度边写,和读完再写。 (延伸自我写的mybatis xml文件热加载)
杭州霖梓(互联网金融)
- String final类的实现原理。
- String.valueof的原理
- slect * from order by limit的执行顺序
- hash冲突的解决方式,不同的key的hash值一样,concurrwnthashmap如何实现读取的线程安全,java实现线程安全有几种方式,如何用空间换时间实现线程安全
- NIO的原理和使用
- 分布式锁的实现zk,还有没有其他方式实现分布式锁
- 索引的注意事项,sql优化除了索引还要注意哪些,独占锁和共享群什么时候会有
- jvm内存空间、常量池静态和运行时添加、如何设置jvm参数、线程栈叫什么?什么时候触发GC
- 事务传播性和隔离级别,提到了nest级别
- spring中mvc父子容器的原理,Applicatiincontext和beanfactory区别
- classloader如何委托子容器加载类
其它家
- mysql的索引组织表,千万级表的遍历,limit和id联合用,索引组织表。mysql的2PC。
阿里新零售部门
- 1000亿个数的问题,内存4G,如何算出最大的1000个数(分隔+最小堆)(Done)
- JVM调优:什么场景会触发FullGC,如何避免呢(我说了YGC次数过多的对象会进入老年代,装不下FLLGC),调大年轻代进入ratio,或者是提高新生代所占比例(Done)
- OutOfMemory的情况如何解决(xxm等参数配置,默认最大内存是1/4的总内存),然后命令查看哪个区爆了,最好是生成快照定位代码问题,或者是优化垃圾回收器的类型(Done)
- 秒杀框架的实现(Redis 悲观锁的实现,我是用异步的形式实现,性能高,她问了异步数据不同步的解决方案,我说一般不会存在问题,实在不行就用同步的方式解决,只有订单生成成功了,才会扣减。实际感觉异步性能高,并发支持度更好,做好tryCatch,失败则重试,重试一定次数后还失败,就记录日志,秒杀结束后再解决异常订单的问题。其实这边还没有把悲观锁的过期时间讲出来,异常的进程不会影响到整个业务的停摆,因为有超时时间,释放锁的操作)(Done)
- ACID(Atomicity,Consistency,Isolation,Durability)的特性(Done)
- TCP:IP协议的3次握手和4次挥手,还有 封装机制、消息头(这个我不会)(Done)
- Syncizaer的用法, Object.wait 和notify的使用,可不可以不再Syniczer中使用wait方法,实际不可以,会报错。以及java加锁的时候会不会出现死锁的情况,如何解决?(Done)
- 分布式事务的解决方案(2PC 和 业务层面的校验功能–消息表)(Done)
- Spring是否了解,IOC、AOP、MVC, MVC框架的核心类和流程(Done)
- MQ消息不通畅的可能的业务场景,以及防止重复消费的方法:消息里面插入唯一性的内容,消息消费者消费的时候去check是否有重复消费(幂等性,ticketID)(Done)
- SQL注入和ASS跨站攻击的解决方案(现在的框架很少SQL注入,Mybatis和JPA直接避免,她讲到存储过程的SQL注入问题,因为存储过程的参数是直接参加原生SQL的执行)(Done)
- 创建线程的几种方式,那种最佳(根据业务场景,不复用的话 内部类、复用的话 Thread重写run方法 ,Runnable接口实现),实际上还有Future等等啊(Done)
- Collection 和Collections的区别,一个是集合类接口,一个是工具类(Done)
- Set和List和Map的介绍(Done)
- Excutes的了解(Done)
- Socket编程了解哪些 我讲了 IO NIO AIO的不同的业务场景(Done)
- 项目介绍(业务介绍 到 技术架构介绍)(Done)
- 架构设计的注意事项(我聊了选择适合业务场景的框架,比如Mybatis和JPA的选择。 可扩展性,比如集群的扩展)
新零售第二轮电话面试
- 项目介绍:业务介绍和技术架构介绍(Done)
- 你做了哪些工作:日常开发、服务器维护、架构优化(JVM调优、集群配置(redis session共享、nginx配置集群、定时任务)、小插件的引入(mybatis xml热加载、PageHelper))(Done,包括重新一套实现)
- Redis如何做 消息队列服务器?(Done)
- RocketMQ如何保证消息的严格有序?
SolrCloud的主从同步原理
项目改造中
- 为什么要做集群(我回答超千人在线,线程不够,他回答不会造成线程不够,除非是长连接,或者是线程池调用不够),尴尬了
- 集群中 前端程序实现 定时任务推送的不重复?我说的是 数据库加锁的方式 select for update,具体还要看看优化下,以及加锁业务失败如何处理?
- 集群中 cms系统发送消息,如何保证网站端不重复消费消息?
- 你解决的最优挑战性的模块?
我回答业务上面的:任务调度系统
- 自定义任务调度的类型和时间
- 几种类型的任务所需要的参数不一样
- 大任务由小任务组成,大事务里面要执行进度管理,利用事件传播性, require_new 来实现,任务进度查看的功能
他的建议:
- 克隆表达式
- Quarz 支持读取表数据,来实现自定义的定时任务
- Quarz 支持分布式环境
- 是否可用线程池的方式来调度这些东西,可扩展性
待办事项:
好好的再总结一下,和写代码验证一下自己的错误,不然以后面试还要问,不要在懵逼了