百度面试经历

经过朋友内推,终于获得了百度的面试机会, 这里主要介绍技术面试的内容

技术面试主要分为两轮面试,整体感觉百度面试的比较详细,很多细节方面的东西

第一轮面试

  1. 简单介绍自己

这个没什么说的,主要都是从简历上面说一下

  1. 想象一个场景:一个系统要同步美国(订单)和中国的数据(其余主要数据),通过太平洋海底光缆进行传输,成本非常高。现在遇到了一些问题,随着数据量增加,无法在规定时间内进行同步,现在设计一种同步方式,达到目的(提示:MQ)。
  1. 开多个端口,并行传输
  2. 通过专门的消息中间件(MQ)进行生产者消费者模式的数据推送和获取
  3. MQ应该部署在美国,保证下单服务的平滑和正常
  4. 一致性方面,考虑使用MQ的回执(Acknowledgment)来实现
  1. threadlocal以及其应用场景
  • threadLocal是多线程的概念,主要指的是存储于线程中的对象,属于线程特有,同一个线程执行的所有方法, 都可以获取这部分数据。
  • threadLocal中的数据只能有本身的线程访问,所以一般情况下, 这部分数据是线程安全的
  • hibernate中的thread-bind-session就使用了threadLocal,当然还有其他实现
  1. 利用tomcat做过什么实现?jetty中的nio是怎么体现的?

jetty中,异步的配置主要体现在这里:

30000 2 8443 > ``` > nio在异步请求模型中的作用主要是将模型的三大部分都通过异步的方式处理 > 1. 侦听链接线程 > 2. 侦听请求线程 > 3. 数据处理线程 > > 参见博客原文: <[从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模型][3]> > > 主要应用到的nio包结构如下: > 参见博客:<[仿照jetty的nio原理写了个例子][4]> >```java import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; // 起到阻塞的作用, selector.select() import java.nio.channels.ServerSocketChannel; // 通过channel绑定到一个端口, import java.nio.channels.SocketChannel; // import java.util.concurrent.ConcurrentLinkedQueue; //两个实例, 主要存放接收到的 链接 和 请求 > ``` > 主要监听方法, 每个步骤都是一个线程去处理的, 主线程不会阻塞 >```java public void listen() throws IOException { // 服务器开始监听端口,提供服务 channel.socket().bind(new InetSocketAddress(port)); // 将scoket榜定在制定的端口上 channel.configureBlocking(true); new Thread(new ConnectionHander()).start(); new Thread(new RequestExecutor()).start(); new Thread(new RequestHander()).start(); } > ``` > > 对于nio相关的类的解释, 参见这个博客:<[Java NIO API详解][5]>
  1. 算法:一个数组中有多个整数, 其中有两个重复的数字,如何找出来,考虑一下时间复杂度和空间复杂度

这个算法的解释比较多

  1. 位图法/Hash, 空间复杂度为n, 时间复杂度为n
  2. 先对数组排序, 然后再进行遍历, 时间复杂度>n
  1. 系统优化总共分为几个部分?如何优化?
  1. Hash函数的概念

hash函数以及简单的应用

第二轮面试

(不按照时间顺序排列)
  1. 白板编写程序: 生产者消费者模型 或者 单例模型(主要考查单例的写法, 两个判空)

作者选取了单利模型的编写,单例以及其写法讨论, 参见这个博客:《Java Notes 00 - Singleton Pattern(单例总结)》
本来作者给出了内部类的答案,但是面试官还是偏向想看线程安全的写法

  1. spring的事务是怎么实现的,嵌套场景下的aop实现

通过aop做代理实现,但是需要强调的是:

  1. 一般场景下, 需要通过spring注入的方法才会代理,同一个类内部调用方法的话,是不会产生代理作用的
  • 但是事务回滚的话,是通过异常去处理的?内部方法抛出异常的话,会回滚吗
  1. 对于需要全部进行代理的,需要了解一下 LTW 的概念 ,或者了解一下Javassist的包

嵌套事务的话, 了解一下配置,会有一些概念 参见博客: <关于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)
  1. 描述一个项目及其架构
  2. ES的使用, 使用中有没有做过数据量的测试
  3. 数据库调优方面,有什么方法
  1. 主要先查看瓶颈在哪里,比如CPU,内存,磁盘
  2. 根据业务的数据量,确定数据库设计是否合理
  3. 使用工具捕获执行时间长的语句,然后调优,根据业务场景查看语句写法是否恰当
  1. JVM中,Minor GC、Major GC和Full GC之间的区别

推荐一个博客:<hunter129>

  1. JVM中,你遇到的内存溢出是什么情况的,怎么发现的,怎么调查的,怎么修改的,如何保证后续的稳定
  2. threadlocal的概念,线程安全的概念,synchronized的理解(这个关键字是锁方法还是锁对象)

坑爹的是, synchronized这个关键字整个是锁对象的! java同步设计败笔
顺便推荐一个公众号 微信号 iteedu 很少人知道, 但是很好

  1. 线程的概念,使用多线程的场景是什么样的?线程池是怎么实现的?(BlockQueue的概念)
  2. 遇到了一个服务,发现有性能问题,如何在现有的机器之下做最大化的优化?从哪些方面着手?
  3. redis中的所有数据结构,redis是怎么用的?集群策略的话,需要考虑哪些东西,redis代理用过不?
  4. springMVC的设计模式,都是做什么的? Controller是使用Servlet规范中哪个对象实现的?
  5. spring事务的回滚机制,是怎么回滚的?子方法抛出异常的话,会回滚吗?
  6. redis的数据类型,list和set的区别?
  7. 说说NIO的概念,与普通IO有什么区别?
  8. 数据复制,数据迁移方面是怎么做的?用什么工具?mysql的binlog是怎么应用的?有什么开源框架在使用这个特性?
原文地址:https://www.cnblogs.com/driftsky/p/5348764.html