经过朋友内推,终于获得了百度的面试机会, 这里主要介绍技术面试的内容
技术面试主要分为两轮面试,整体感觉百度面试的比较详细,很多细节方面的东西
第一轮面试
- 简单介绍自己
这个没什么说的,主要都是从简历上面说一下
- 想象一个场景:一个系统要同步美国(订单)和中国的数据(其余主要数据),通过太平洋海底光缆进行传输,成本非常高。现在遇到了一些问题,随着数据量增加,无法在规定时间内进行同步,现在设计一种同步方式,达到目的(提示:MQ)。
- 开多个端口,并行传输
- 通过专门的消息中间件(MQ)进行生产者消费者模式的数据推送和获取
- MQ应该部署在美国,保证下单服务的平滑和正常
- 一致性方面,考虑使用MQ的回执(Acknowledgment)来实现
- threadlocal以及其应用场景
- threadLocal是多线程的概念,主要指的是存储于线程中的对象,属于线程特有,同一个线程执行的所有方法, 都可以获取这部分数据。
- threadLocal中的数据只能有本身的线程访问,所以一般情况下, 这部分数据是线程安全的
- hibernate中的thread-bind-session就使用了threadLocal,当然还有其他实现
- 利用tomcat做过什么实现?jetty中的nio是怎么体现的?
jetty中,异步的配置主要体现在这里:
- 算法:一个数组中有多个整数, 其中有两个重复的数字,如何找出来,考虑一下时间复杂度和空间复杂度
这个算法的解释比较多
- 位图法/Hash, 空间复杂度为n, 时间复杂度为n
- 先对数组排序, 然后再进行遍历, 时间复杂度>n
- 系统优化总共分为几个部分?如何优化?
- Hash函数的概念
hash函数以及简单的应用
第二轮面试
(不按照时间顺序排列)
- 白板编写程序: 生产者消费者模型 或者 单例模型(主要考查单例的写法, 两个判空)
作者选取了单利模型的编写,单例以及其写法讨论, 参见这个博客:《Java Notes 00 - Singleton Pattern(单例总结)》
本来作者给出了内部类的答案,但是面试官还是偏向想看线程安全的写法
- spring的事务是怎么实现的,嵌套场景下的aop实现
通过aop做代理实现,但是需要强调的是:
- 一般场景下, 需要通过spring注入的方法才会代理,同一个类内部调用方法的话,是不会产生代理作用的
- 但是事务回滚的话,是通过异常去处理的?内部方法抛出异常的话,会回滚吗
- 推荐一个git:simpleApm
嵌套事务的话, 了解一下配置,会有一些概念 参见博客: <关于Spring嵌套事务>
- PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
- 前六个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊变量。
它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager)
- 描述一个项目及其架构
- ES的使用, 使用中有没有做过数据量的测试
- 数据库调优方面,有什么方法
- 主要先查看瓶颈在哪里,比如CPU,内存,磁盘
- 根据业务的数据量,确定数据库设计是否合理
- 使用工具捕获执行时间长的语句,然后调优,根据业务场景查看语句写法是否恰当
- JVM中,Minor GC、Major GC和Full GC之间的区别
推荐一个博客:<hunter129>
- JVM中,你遇到的内存溢出是什么情况的,怎么发现的,怎么调查的,怎么修改的,如何保证后续的稳定
- threadlocal的概念,线程安全的概念,synchronized的理解(这个关键字是锁方法还是锁对象)
坑爹的是, synchronized这个关键字整个是锁对象的! java同步设计败笔
顺便推荐一个公众号 微信号 iteedu 很少人知道, 但是很好
- 线程的概念,使用多线程的场景是什么样的?线程池是怎么实现的?(BlockQueue的概念)
- 遇到了一个服务,发现有性能问题,如何在现有的机器之下做最大化的优化?从哪些方面着手?
- redis中的所有数据结构,redis是怎么用的?集群策略的话,需要考虑哪些东西,redis代理用过不?
- springMVC的设计模式,都是做什么的? Controller是使用Servlet规范中哪个对象实现的?
- spring事务的回滚机制,是怎么回滚的?子方法抛出异常的话,会回滚吗?
- redis的数据类型,list和set的区别?
- 说说NIO的概念,与普通IO有什么区别?
- 数据复制,数据迁移方面是怎么做的?用什么工具?mysql的binlog是怎么应用的?有什么开源框架在使用这个特性?