作者:tony.chenjy
链接:https://www.nowcoder.com/discuss/168962
来源:牛客网
3月22日接到的电话,约到了晚上8-10点,等了一晚上没消息,以为被鸽了,结果9点半才接到电话,聊了30分钟左右,蚂蚁的员工真敬业!
Q:自我介绍
Q:最有难度的项目
Q:对线程安全的理解
A:两个线程执行同一段代码,不会出现不可预测的结果,则认为是线程安全
Q:比如有一个局部变量i=1,两个线程同时执行,是否线程安全
A:局部变量保存在虚拟机栈,为线程独享,是线程安全
Q:比如再有一个共享变量,如何保证线程安全
A:乐观锁与悲观锁保证。乐观锁,使用原子变量,比如AtomicInteger。悲观锁,使用synchronized关键字或者ReentrantLock
Q:说说ThreadLocal,底层如何实现
A:试过用ThreadLocal+SpringAOP动态切换mysql主从数据源,实现读写分离,是一种用空间换时间的办法。底层没看过
Q:hashmap实现原理
A:hashing的原理,(具体再说put和get的工作过程)
Q:volatile关键字,解决了什么问题
A:强制主内存和工作内存的变量同步,保证了内存可见性以及有序性。(线程安全三大特性:原子性、内存可见性、有序性)
Q:类加载机制
A:(有点忘记了,简单说了下)双亲委派模型,类加载器要加载一个类,会先交给父类加载器加载,等于先通过jvm底层内存类加载器加载,防止类的重复加载,以及保证类加载的安全性
Q:jvm内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?
A:jvm内存5部分:程序计数器、本地方法栈、虚拟机栈为线程私有,堆内存、方法区为线程共享。堆分为新生代和老年代,新生代分为eden区+2个大小一样的survivor区。两个survivor区用于实现垃圾收集中的复制算法,非常高效。
Q:对象在堆内存创建的生命周期
A:先在eden区创建对象,经过一次垃圾收集之后,未被收集的对象移到survivor区,每次垃圾收集survivor区里面未被收集的对象交替移动,经过一定次数的垃圾收集之后对象移到老年代。或者一些大对象直接在老年代创建。
Q:Spring的原理?AOP的实现?
A:Spring主要是IOC和AOP两部分,AOP两种实现方式:jdk动态代理和cglib(补充:区别在于,jdk动态代理通过代理接口,cglib通过实现子类进行代理)
Q:面向对象的设计原则?OCP?
A:6个,OCP、单一职责。。。OCP是对扩展开放,对修改封闭(好难记,真不记得,就算记得也不是很理解什么意思,要找个时间专门理解一下)
Q:分布式系统如何保证数据一致性
A:(这个真不了解,碰了一下运气说一致性哈希算法)被说这是负载均衡一致性,他问的是数据一致性(后来想到两阶段提交算不算?)
Q:有一个方法接收一个消息类型数据,通过if-else处理,如何优化
A:通过工厂方法模式,工厂方法模式是工厂接口创建产品接口
Q:设计一个秒杀系统?考虑哪些问题?
A:(没什么经验,随意说了一下)数据存储,不能直接交互数据库,使用redis缓存存储;处理高并发问题,负载均衡。。。(是不是也可以提到消息队列削峰,秒杀结束处理请求直接返回静态页面)
问了消息队列,但个人不是特别了解,问了工作年限,因为觉得我基础可以,但是大型项目经验比较差劲
Q:有什么问题想问
A:问了一下自己的表现
简单记录了一下并且写了一下答案,攒人品!
面试官没有问得很深入,可能因为天色已晚,就是对于线程安全高并发比较看重是真的,整个面试过程还是聊得挺愉快,收获很大,蚂蚁的面试官还是很nice,很有耐心,引导性地提问,下一次可能就要真枪实弹地撸代码了,祝自己好运!什么消息队列,分布式数据一致性,秒杀系统,回头必须补。
3月22日完成的一面电面,然后开始焦急的等待当中,第二天让同学帮忙查了面试进度,没查到,说是可能不是他推荐的原因,但是不管,继续复习,说不定有奇迹了呢,反正面试还是要继续的。
终于奇迹出现了,24日晚上接到约现场面的电话,原本约在了25日周一的晚上7点,后来由于知道我是跨市过去的,改到了26日13点,不得不说蚂蚁的员工真的nice!
提前半小时刚到了现场,刚上完洗手间就接到对方的电话,所以大家面试早到总比迟到好。然后面试提前开始了,上来两张纸两道Java程序设计题,跟我预想的差不多,果然白板编程:
1.一个10M的文件,一行一个ip,统计每个ip出现的次数,并降序排列
2.设计生产者消费者模型,生产者生产随机数,消费者在控制台打印出来
然后面试官出去了,手机什么全部不收,还好简历都忘记打印的我竟然带了草稿纸和笔,最后总算写完了。
而最喜剧性的是,这段时间一直练着两个线程轮流打印1-100的奇偶数,直到看到面试官跟着进面试地点的过程中还在临时想起并补着生产者消费者模型,毫不夸张地说,我当时手机解锁看到的就是介绍生产者消费者模型的网页。只能说,技术都是相通的,理解一个技术原理,可能就能解决100个相似问题。
面试官现场review,问了为什么没用阻塞队列,坦白说自己有了解过,但不是很熟,然后开始提出各种与code没关问题,我感觉算是第三面。
以下内容,全凭记忆:
Q:从http请求发出到响应的整个流程
A:不太确定想问什么,一边确认一边在面试官引导下说:http请求发出之后,通过dns解析域名获得ip,然后通过路由找到目标主机,通过端口交给应用层,响应。。。然后因为往自己会的扯,比如SpringMVC的运行流程。。。(提供思路,大家自己找答案,网络菜鸡面试的时候说出来自己都怀疑人生)
Q:追问如何http请求发送过来之后如何拦截,怎样配置拦截,具体怎样拦截
(只知道tomcat拦截,在web.xml中配置,感觉是在问tomcat底层)
Q:说说类加载机制,可以自定义类加载器吗,为什么要自定义类加载器
(上篇有同学提醒类加载器遗漏什么点,没有复习结果又被问到,真想现场爆炸)
Q:了解什么分布式数据一致性算法,具体说说
(答了zookeeper用的paxos,还有raft算法,有个面经也提到了:蚂蚁金服面经(3+4),只恨自己看到了没好好背)
Q:再次问了设计秒杀系统
(原地爆炸第二次,所以大家每次面完遗漏的知识点一定要及时补充,不一定要很全面,但至少能说一下,我上次面完都用来看分布式数据一致性保证(算法层面难懂没有效果),还有数据库的索引能理解结果没被问)
Q:说说同步和异步,什么时候用同步,什么时候用异步
(举了个前端的例子,地址栏请求和ajax请求,看面试官反应马上再举个后端例子,比如耗时操作,不需要马上展示给用户的操作)
接下来就很玄乎的
在linux上面用过什么调优工具,用过什么监控工具,怎样监控自己应用资源消耗情况,如果CPU占用资源很高有可能是什么问题,CPU占用资源低但是系统响应速度很慢可能是什么问题,jvm怎样调优,堆内存栈空间设置多少合适。。。
请大家自行感受我绝望的内心。。。
好了不说了,发个面经攒人品,祝自己好运!
也希望大家都能拿到心仪的offer!
与作者交流:https://www.nowcoder.com/discuss/168962
更多笔经面经:https://www.nowcoder.com/discuss?order=0&type=2