蚂蚁金服面试(未完全解析)

电话一面

  • 自我介绍,及为什么读研等等。

  • JVM内存结构,垃圾回收。

  • Java并发

    • Java的锁有哪些
      参考答案:公平锁/非公平锁;是否可重入;独享锁/共享锁,读写锁ReentrantReadWriteLock则可以看成是独享锁和共享锁的组合;悲观锁/乐观锁(CAS)
    • synchronized与lock的区别
  • 架构及优化

    • 总体的思路
    • mysql主从和主备的区别。mysql的主要存储引擎及其区别。事务。
    • 数据库与缓存的一致性

电话二面

  • 自我介绍等。
  • 线程池的核心参数
  • 锁升级,轻量级锁。CAS怎么解决ABA问题。volatile。
  • JVM堆区结构。怎么调优。G1的优点。线上的OOM问题怎么排查。CPU load太高怎么排查,你的第一感觉是什么问题,答:死循环等代码问题。问:GC有没有可能?1
  • NIO2, 3,4
    一些关键知识点:
    BIO的数据读写必须阻塞在一个线程内等待其完成。
    IO多路复用:可以用一个线程处理多个网络连接
    Selector选择器:不再轮询通道,而是轮询事件。基于事件驱动机制。epoll。
    NIO中可以操作直接内存,也是比BIO性能好的一个原因。
    5中把一个IO操作分成两个步骤:发起IO请求和实际的IO操作,来区分是否阻塞,和同/异步。我觉得似乎可以帮助理解。
  • Netty 6
  • 分库分表
  • 分布式事务。TCC
  • 主键索引
  • 大数据产品熟悉吗?比如流计算,像Spark,Flink。
  • zookeeper选举过程7。用zk实现分布式锁
  • kafka吞吐比较高的原因。消息顺序性。
  • 秒杀

视频三面

说我项目简单没什么好问的,就开始出各种系统设计题,节奏还快,我四五秒钟还没答上来还在思考,就“这个问题略过”了。。

  • 自我介绍与项目介绍。

  • 怎么解决微博/微信的大V发消息时的流量洪峰问题?答:消息队列销峰。问:整个流程呢?发布的流程?订阅的流程?8参考答案的要点:推拉模式即在线推,离线拉,用户关注的feed用redis的zset实现,sort为time。问:怎么解决热点问题?答:用redis。问:怎么解决缓存穿透(我感觉他说的缓存穿透,其实是我理解的缓存击穿)?缓存应该在何时加载,读时还是写时?如何提高缓存的命中率?

  • QPS突然下降,应该从哪几个方面定位问题?我:用top命令查看cpu负载过高,或者占用内存过高的进程,并借助jstack,jmap等命令。也考虑正在GC的情况。问:怎么样CPU负载才算高?才算有问题?我:。。。blala。有可能代码有问题。问:排除代码有问题的情况,还有什么可能?我:网络问题。问:如何排查网络问题?我:用netstat命令。问:用netstat可能看不出来,因为连接都还存在。我:。。。问:就是你平常定位网络问题,除了netstat,还会常用到哪些命令?我:。。。问:除了网络问题,还有哪些可能?我:负载均衡nginx。问:具体怎么排查?我:。。。我觉得容器集群有一两台挂掉导致QPS下降的可能更大。
    复盘:ELK日志系统。jstack查看线程状态,看线程是否在sleep,或等待某个资源或者锁,甚至是引发了死锁910 。 jmap、jstat看内存和GC情况11
    Arthas工具的trace命令可以跟踪统计方法耗时12:
    在这里插入图片描述
    数据库的原因。

  • 订单系统的订单号怎么生成?答:雪花算法。问:还有呢?答:redis自增。问:扣减库存这种写热点问题,怎么解决?我:用lua脚本操作redis可以保证操作的原子性,防止超卖。问:redis保证不了数据强一致,和数据容灾。应该怎么办?或者说,要把扣减库存和支付做成一个事务,怎么做?我:分布式事务,2PC等。问:事务的久悬知道吗?相关知识:蚂蚁集团-----分布式事务 Seata TCC 模式深度解析之 3.3 悬挂 。问:怎么样让分布式事务跨数据源?我心里想:分布式事务不就是跨数据源的?

  • 知道哪些负载均衡算法?

  • 最近有看哪些书?觉得自己最擅长哪一块?答:数据结构。问:LevelDB的LSM树知道吗13? 怎么实现一个入队出队都不加锁的队列,要尽量高性能?相关知识:ConcurrentLinkedDeque和ConcurrentLinkedQueue的入队出队都采用乐观锁(即volatile+CAS),但是size操作需要O(n)。为什么ConcurrentLinkedQueue内部不维护一个size变量来跟踪队列的长度呢?因为ConcurrentLinkedQueue通过cas操作来保证并发安全。而cas操作只能保证单个变量的并发安全性,无法在出入队列操作的同时,维护size变量。(后面的观点来自14

  • 你觉得自己作为一名老程序员,有哪些优点?

一些相关链接:

蚂蚁金服面试经验分享,阿里的offer真的不难
蚂蚁金服的一次面试经历(一面、二面)
蚂蚁金服社招笔试——根据需求实现一个转账接口


  1. 记一次jvm疯狂gc导致CPU飙高的问题解决 ↩︎

  2. JavaGuide之BIO,NIO,AIO总结.md ↩︎

  3. 《3.3.3 NIO网络编程》 ↩︎

  4. 我读过的最好的epoll讲解–转自”知乎“ ↩︎

  5. 关于JAVA NIO是同步非阻塞I/O的解释:
    同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO; 如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
    阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

    《专题二 单节点系统》之《第三章 应用服务器优化》之《第三节 Tomcat容器优化》:
    在这里插入图片描述
    在这里插入图片描述 ↩︎

  6. 拜托!面试请不要再问我 Netty 底层架构原理! ↩︎

  7. Zookeeper的Leader选举 ↩︎

  8. 微博和知乎中的 feed 流是如何实现的? ↩︎

  9. java命令–jstack 工具 ↩︎

  10. 记一次线上问题排查过程 ↩︎

  11. JVM性能调优监控工具jps、jmap、jstack、jstat使用详解 ↩︎

  12. Arthas - 定位处理监控工具 ↩︎

  13. LSM树详解 ↩︎

  14. ConcurrentLinkedQueue全解析 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值