
这套互联网Java工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka面试专题。需要最新面试笔记资料的小伙伴可以 点赞+转发+关注!后台小信封回复【444】即可领取。
最新蚂蚁金服4面(Java):CAP+数据强一致性+Lock锁+分布式等
蚂蚁金服Java一面
1. 自我介绍和项目
2. Java的内存分区
3. Java对象的回收方式,回收算法。
4. CMS和G1了解么,CMS解决什么问题,说一下回收的过程。
5. CMS回收停顿了几次,为什么要停顿两次。
6. Java栈什么时候会发生内存溢出,Java堆呢,说一种场景,我说集合类持有对象。
7. 那集合类如何解决这个问题呢,我说用软引用和弱引用,那你讲一下这两个引用的区别吧。
8. Java里的锁了解哪些,说了Lock和synchronized
9. 它们的使用方式和实现原理有什么区别呢?
10. synchronized锁升级的过程,说了偏向锁到轻量级锁再到重量级锁,然后问我它们分别是怎么实现的,解决的是哪些问题,什么时候会发生锁升级。
11. Tomcat了解么,说一下类加载器结构吧。
12. 说了Spring,问我Spring中如何让A和B两个bean按顺序加载?
13. 10亿个数去重,我说用hash分片做,他说可能不均匀,然后我说了bitmap,他说那数字量更多怎么办,我说那就两个bitmap把。他说下一题吧。
蚂蚁金服Java二面:技术面
- 讲一下项目
- 做的主要是Java对吧,讲一下多线程把,用到哪些写一下
- 写了thread和runnable,然后写了线程池,又问了线程池由哪些组件组成,有哪些线程池,分别怎么使用,以及拒绝策略有哪些。
- 什么时候多线程会发生死锁,写一个例子吧,然后我写了一个两个线程,两个锁,分别持有一个,请求另一个的死锁实例。
- 集合类熟悉吧,写一个题目,一个字符串集合,找出pdd并且删除。
- 然后说一下Redis吧,是单线程还是多线程,Redis的分布式怎么做?
- RPC了解么,我说了主要是协议栈+数据格式+序列化方式,然后需要有服务注册中心管理生产者和消费者。
- TCP三次握手的过程,如果没有第三次握手有什么问题。
蚂蚁金服三面:技术面
1. 自我介绍
2. cap了解么,分别指什么,base呢,强一致性和弱一致性有什么方法来做,2pc了解么,说一下大概过程。
3. 负载均衡怎么做的呢,为什么这么做?
4. 了解过集群雪崩么?
5. MySQL的主从复制怎么做的,具体原理是什么,有什么优缺点。
6. Redis有哪些集群模式,各自的区别?
7. 项目用到了多线程,如果线程数很多会怎么样?
8. 分布式了解哪些东西,消息队列了解么,用在什么场景,说了削峰,限流和异步。说了kafka,问我怎么保证数据不丢失,以及确保消息不会被重复消费。还问了消息送达确认是怎么做的。
9. 讲一下项目的主要架构,你在里面做了什么
10. 有什么比较复杂的业务逻辑讲一下。
11. 最大的难点是什么,收获是什么。
蚂蚁金服HR面:
1.工作中遇到的最大挑战是什么,你如何克服的?
2.你最大的优点和最大的缺点,各自说一个?
3.未来的职业发展,短期和长期的规划是什么?
阿里蚂蚁金服
1. 说说三种分布式锁?
1、Zookeeper:基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来自于IBM网站)。大致思想即为:每个客户端对某个功能加锁时,在zookeeper上的与该功能对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。

2、优点
锁安全性高,zk可持久化,且能实时监听获取锁的客户端状态。一旦客户端宕机,则瞬时节点随之消失,zk因而能第一时间释放锁。这也省去了用分布式缓存实现锁的过程中需要加入超时时间判断的这一逻辑。
3、缺点
性能开销比较高。因为其需要动态产生、销毁瞬时节点来实现锁功能。所以不太适合直接提供给高并发的场景使用。
4、实现
可以直接采用zookeeper第三方库curator即可方便地实现分布式锁。
5、适用场景
对可靠性要求非常高,且并发程度不高的场景下使用。如核心数据的定时全量/增量同步等。
2、memcached:memcached带有add函数,利用add函数的特性即可实现分布式锁。add和set的区别在于:如果多线程并发set,则每个set都会成功,但最后存储的值以最后的set的线程为准。而add的话则相反,add会添加第一个到达的值,并返回true,后续的添加则都会返回false。利用该点即可很轻松地实现分布式锁。
2、优点
并发高效
3、缺点
memcached采用列入LRU置换策略,所以如果内存不够,可能导致缓存中的锁信息丢失。memcached无法持久化,一旦重启,将导致信息丢失。
4、使用场景
高并发场景。需要 1)加上超时时间避免死锁; 2)提供足够支撑锁服务的内存空间; 3)稳定的集群化管理。
3、redis:redis分布式锁即可以结合zk分布式锁锁高度安全和memcached并发场景下效率很好的优点,其实现方式和memcached类似,采用setnx即可实现。需要注意的是,这里的redis也需要设置超时时间。以避免死锁。可以利用jedis客户端实现。
1ICacheKey cacheKey = new ConcurrentCacheKey(key, type);
2return RedisDao.setnx(cacheKey, "1");
阿里巴巴-蚂蚁金服
1.说说三种分布式锁?
Zookeeper:基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来⾃于IBM⽹站)。⼤致思想即为:每个客户端对某个功能加锁时,在zookeeper上的与该功能对应的指定节点的⽬录下,⽣成⼀个唯⼀的瞬时有序节点。判断是否获取锁的⽅式很简单,只需要判断有序节点中序号最⼩的⼀个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁⽆法释放,⽽产⽣的死锁问题。

1、优点锁安全性⾼,zk可持久化,且能实时监听获取锁的客户端状态。⼀旦客户端宕机,则瞬时节点随之消失,zk因⽽能第⼀时间释放锁。这也省去了⽤分布式缓存实现锁的过程中需要加⼊超时时间判断的这⼀逻辑。
2、缺点性能开销⽐较⾼。因为其需要动态产⽣、销毁瞬时节点来实现锁功能。所以不太适合直接提供给⾼并发的场景使⽤。
3、实现可以直接采⽤zookeeper第三⽅库curator即可⽅便地实现分布式锁。
4、适⽤场景对可靠性要求⾮常⾼,且并发程度不⾼的场景下使⽤。如核⼼数据的定时全量/增量同步等。
5、memcached:memcached带有add函数,利⽤add函数的特性即可实现分布式锁。
add和set的区别在于:如果多线程并发set,则每个set都会成功,但最后存储的值以最后的set的线程为准。⽽add的话则相反,add会添加第⼀个到达的值,并返回true,后续的添加则都会返回false。利⽤该点即可很轻松地实现分布式锁。
6、优点并发⾼效3、缺点memcached采⽤列⼊LRU置换策略,所以如果内存不够,可能导致缓存中的锁信息丢失。memcached⽆法持久化,⼀旦重启,将导致信息丢失。
7、使⽤场景⾼并发场景。需要1)加上超时时间避免死锁;2)提供⾜够⽀撑锁服务的内存空间;3)稳定的集群化管理。
8、redis:redis分布式锁即可以结合zk分布式锁锁⾼度安全和memcached并发场景下效率很好的优点,其实现⽅式和memcached类似,采⽤setnx即可实现。需要注意的是,这⾥的redis也需要设置超时时间。以避免死锁。可以利⽤jedis客户端实现。
ICacheKey cacheKey =
new
ConcurrentCacheKey(key, type);
return RedisDao.setnx(cacheKey,
1.面向对象和面向过程的区别
面向过程
优点:
性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:
没有面向对象易维护、易复用、易扩展面向对象优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护缺点:性能比面向过程低
2.Java语言有哪些特点
1.简单易学;
2.面向对象(封装,继承,多态);
3.平台无关性(Java虚拟机实现平台无关性);
4.可靠性;
5.安全性;
6.支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持);
7.支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的,因此Java语言不仅支持网络编程而且很方便);
8.编译与解释并存;
3.关于JVMJDK和JRE最详细通俗的解答
JVM
Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在Java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
Java程序从源代码到运行一般有下面3步:
我们需要格外注意的是.class->机器码这一步。在这一步jvm类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的,也就是所谓的热点代码,所以后面引进了JIT编译器,JIT属于运行时编译。当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于Java解释器的。这也解释了我们为什么经常会说Java是编译与解释共存的语言。
HotSpot采用了惰性评估(LazyEvaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK9引入了一种新的编译模式AOT(AheadofTimeCompilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是,AOT编译器的编译质量是肯定比不上JIT编译器的。总结:Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译,随处可以运行”的关键所在。
JDK和JRE
JDK是JavaDevelopmentKit,它是功能齐全的JavaSDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。JRE是Java运行时环境。它是运行已编译Java程序所需的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。
如果你只是为了运行一下Java程序的话,那么你只需要安装JRE就可以了。如果你需要进行一些Java编程方面的工作,那么你就需要安装JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务器中运行Java程序。那你为什么需要JDK呢?因为应用程序服务器会将JSP转换为Javaservlet,并且需要使用JDK来编译servlet。
OracleJDK和OpenJDK的对比
可能在看这个问题之前很多人和我一样并没有接触和使用过OpenJDK。那么Oracle和OpenJDK之间是否存在重大差异?下面通过我通过我收集到一些资料对你解答这个被很多人忽视的问题。
对于Java7,没什么关键的地方。OpenJDK项目主要基于Sun捐赠的HotSpot源代码。此外,OpenJDK被选为Java7的参考实现,由Oracle工程师维护。关于JVM,JDK,JRE和OpenJDK之间的区别,Oracle博客帖子在2012年有一个更详细的答案:
问:OpenJDK存储库中的源代码与用于构建OracleJDK的代码之间有什么区别?
答:非常接近-我们的OracleJDK版本构建过程基于OpenJDK7构建,只添加了几个部分,例如部署代码,其中包括Oracle的Java插件和JavaWebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源OracleJDK的所有部分,除了我们考虑商业功能的部分。
总结:
1.OracleJDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
2.OpenJDK是一个参考模型并且是完全开源的,而OracleJDK是OpenJDK的一个实现,并不是完全开源的;
3.OracleJDK比OpenJDK更稳定。OpenJDK和OracleJDK的代码几乎相同,但OracleJDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择OracleJDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK可能会遇到了许多应用程序崩溃的问题,但是,只需切换到OracleJDK就可以解决问题;
4.顶级公司正在使用OracleJDK,例如AndroidStudio,Minecraft和IntelliJIDEA开发工具,其中OpenJDK不太受欢迎;
5.在响应性和JVM性能方面,OracleJDK与OpenJDK相比提供了更好的性能;
6.OracleJDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
7.OracleJDK根据二进制代码许可协议获得许可,而OpenJDK根据GPLv2许可获得许可。


本文详述了蚂蚁金服的Java面试经历,涵盖了一面到三面的技术问题,包括Java内存模型、JVM、锁机制、分布式、Redis、MySQL、面试策略等关键知识点。面试过程中涉及了CAP理论、线程池、死锁、Redis集群、数据一致性等问题,以及HR面的职业规划和优缺点分析。内容深入浅出,适合准备Java面试的开发者参考。
附答案&spm=1001.2101.3001.5002&articleId=123742956&d=1&t=3&u=4b82e90795b44d5aa66af1a822249d53)

被折叠的 条评论
为什么被折叠?



