互联网面试题
区长孙连城
2018-05-23 20:1121614浏览234评论
1.一面主要问基础,包括几方面:
1) collection接口下面有哪些集合,hashmap的实现原理,要把1.7和1.8的区别(红黑树)讲出来,map有哪些实现类以及使用场景,hashmap, hashtable, linkedhashmap,weakHashMap, treemap, concurrentmap,你要是讲的好这里可以说十几分钟,linkedhashmap和treemap排序的区别,concurrenthashmap如何实现线程安全,这里也要把1.7和1.8实现差异说出来(分段加锁和cas技术),说到这里以后就会问你cas实现原理( CPU Lock前缀指令),它是如何保证其他cpu core的cache失效的,然后会问你volatile的实现原理,要结合java内存模型来讲,可见性是如何实现的(内存屏障),synchronized锁和reentrantlock的区别以及内部怎么实现的:常用的gc算法及优缺点,如何判断对象的存活性
2) mysql有哪些索引,底层数据结构是什么,画一下b+树的结构以及数据的插入过程,聚集索引的特点,如何做索引优化,给你一个sql语句select a,b,c from t where a<某个值 and b>某个值 and c = 1,如何建索引(可以是c,a,b或者c,b, a的联合索引,但要分析什么场景下分别用哪个);结合Innodb的实现说下数据库的隔离级别,分别是怎么解决脏读、不可重复读和幻读取的;对mysql最新版本的同步机制有没有了解,比如一个主节点和多个备份节点,mysql怎么保证可用性和性能;
3) redis有哪些数据结构,分别用在哪些场景,对redis的pipeline有没有了解,解决什么问题,redis采用了什么方式来节省内存
4) Spring IOC的理解以及IOC容器的初始化过程,Spring里的Bean是保存在哪里的,BeanFactory和FactoryBean的区别,Spring AOP怎么实现的(需要讲出来JDK动态代理和CGLib动态代理优缺点),头条还问了如果一个类的某个方法没有在接口里定义,这两种动态代理方式是怎么实现的;
5) 线程池有哪些实现类,ThreadPoolExecutor有哪些参数,讲下它的工作原理,在使用过程中有哪些经验(比如工作队列大小的设置,ThreadFactory和ExjectExcutionHandler)
6) 线程有哪些状态以及怎么转换的
2. 二面主要结合项目来问
1). GC的常用算法以及优缺点,项目中用的什么垃圾回收算法,怎么做GC调优,对G1收集器有没有了解(要说出G1的出现主要解决了什么问题,为什么CMS算法会有内存碎片)
在介绍GC算法的时候可能会提到GC Roots,面试官会问你哪些对象可以作为GC Roots,栈里面的局部变量表里有基本数据类型和引用类型,怎么找到引用类型;有个对象引用比如Hello,hello.sayHello()调用的时候怎么找到类里的sayHello()这个方法
2). 项目里有用到限流,具体怎么做的
3). 看你对Netty有了解,能不能讲下它的工作原理,netty里ChannelInBoundHandler和ChannelOutBoundHandler的区别,netty在读写数据的时候是先调用head还是tail handler,既然你知道NIO,有没有听说
JDK epoll的BUG,Netty是怎么解决的,如何解决TCP粘包和拆包的问题,为什么会出现粘包和拆包
4). 讲下你项目里做的数据库索引优化,如何去分析一条语句的执行性能,explain语句你会关注哪些字段
5). 分别在什么场景使用synchronized和Lock,ReentrantLock内部怎么实现的,多线程通信有哪些方式(要把JUC包下的常用实现类说出来,比如CountDownLantch,信号量,栅栏)
6). 如何实现分布式锁,一开始说了redis的实现,redis可能在锁超时后还没执行完任务,这个时候要怎么做,有没有更好的方式,后面说了用zookeeper的实现
7). 项目里有用到ElasticSearch,能介绍ES的工作原理吗,什么是正向索引和反向索引,如何对ES进行优化
8). 为什么会出现大量CLOSE_WAIT连接,能不能画一下TCP挥手的流程图介绍下,后面是怎么解决句柄泄露的问题
9). 写代码实现一个EnumSet(阿里),用数组或者链表实现一个阻塞队列(美团)
10). 哪些场景下会出现内存泄露(可以讲下HashMap,ThreadLocal,WeakHashMap,finalize),会问你ThreadLocal的原理以及为什么会有内存泄露
11). 如何获取Redis里所有的keys(可以先说下keys *命令,然后再介绍可能导致系统阻塞无法对外响应,再介绍更好的scan命令)
12). Java类加载机制,为什么要双亲委派
13). Spring Bean的作用域有哪些,单例是线程安全的吗,怎么保证线程安全
14). java里的Exception信息是怎么保存的,有没有用到java8的一些特性,Lambda表达式是语法糖吗,怎么实现的,和匿名内部类有什么区别;
3. 三面,一般是技术总监或者某个部门的主管面
1). 简历里有提到有定位系统响应慢的经验,具体怎么做的
2). 如果有个节点一直在做FullGC,你要怎么快速定位并恢复环境
3). 如果要做一个秒杀系统,你会怎么设计,把能想到的点都说出来
4). 假设数据库里有100W条数据,要把他们全部加载到Redis里,你会怎么设计这个系统(这里可能是个坑,缓存一般保存的热点数据,要讲下分布式缓存、缓存击穿、雪崩、并发更新等问题)
5). ElasticSearch的分片机制,ES搜索过程是如何工作的,如果有很多网卡信息怎么做分片,如果一个Document有2个网卡呢
6). 用过哪些消息中间件,能不能说下Kafka的工作原理,如果保证分布式系统的数据的一致性,给Kafka发消息如何保证消息的幂等性
7). 如何对数据库做分库分表
4. 四面,基本上也是结合项目来问一些知识点,面试官一般会比较强势,会经常打断你说话,给你压力,这个时候千万不要慌,问的问题和上面差不多
你在项目中遇到的最难的一个问题是什么,自己对未来3-5年的一个规划
5. 五面,HR面,随便聊聊