最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件
1、AOP实现原理:动态代理
image.png2、对象什么情况下进入老年代
https://blog.csdn.net/xdzhouxin/article/details/81218578
image.png3、双亲委派模型,为什么这样做?
image.png双亲委派模型的概念
- 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的类请求都会传给顶层的启动类加载器(Bootstrap ClassLoader),只有当父加载器反馈自己无法完成该加载请求时,子加载器才会尝试自己去加载。
双亲委派模型的优点:
- Java类伴随其类加载器具备了带有优先级的层次关系,确保了在各种加载环境的加载顺序。
- 保证了运行的安全性,防止不可信类扮演可信任的类。
4、Java会出现内存溢出吗?什么情况下会出现
image.png什么情况下会出现
- 检查代码中是否有死循环或递归调用。
- 检查是否有大循环重复产生新对象实体。
- 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
- 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
5、常用的设计模式介绍:单例模式、装饰者模式等
6、消息中间件有哪些?他们之间的优劣势
image.png7、redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
image.png8、OOM内存泄漏,什么情况下会出现,如何排查
image.png这里强烈推荐阿里出品的Arthas
Arthas 能为你做什么?
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在预发 debug 一下,难道只能通过加日志再重新预发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现,怎么办?
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到容器和中间件的实时运行状态?
9、MySQL的索引
10、JVM-垃圾回收详解
JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。
11、栈和队列
12、线程方法中的异常如何处理
java主线程捕获子线程中的异常
JAVA 线程中的异常捕获
13、什么情况下使用Runnable和Thread创建线程,Runnable和Callable的区别
用Runnable与Callable接口的方式创建多线程的特点:
- 线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。
- 在这种方式下,多个线程可以共享一个target对象,所以非常适合多个线程来处理同一份资源情况。
- 如果需要访问当前线程,需要使用Thread.currentThread方法。
- Callable接口与Runnable接口相比,只是Callable接口可以返回值而已。
用Thread类的方式创建多线程的特点:
- 因为线程已经继承Thread类,所以不可以再继承其它类。
- 如果需要访问当前线程,直接使用this即可。
14、深入剖析Java线程池原理
线程池的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果任务数量超过了最大线程数量,需要进入队列排队等候,等其他线程执行完毕,再从队列中取出任务来执行
主要特点:
- 线程复用
- 控制最大并发数量
- 管理线程
带来的好处
- 降低了资源消耗。通过复用机制降低了线程创建和销毁的消耗。
- 提高了响应速度。当任务到达时,任务不需要等候就能立即执行。
- 提高了线程的可管理性。线程是稀缺的,如果无限制创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。
15、Spring IOC和AOP,以及各有什么优点
IOC:Inversion of Control控制反转,也叫(Dependency Injection)依赖注入。
IoC 不是一种技术,只是一种思想。它能指导我们如何设计出松耦合、更优良的程序。比如在程序中,依赖注入就是利用某种工具,将依赖注入到需要的位置。就好比:
药物注入就是利用注射器,将药物注入到需要的人体中,就是药物注入。
依赖注入还有另一层意思:就是依赖第三方工具完成注入的操作。依赖注入的核心原理是注解和反射。
优点是
内存控制:统一管理对象,避免对象乱创建导致额外的内存开销。便于内存的优化。
降低耦合度:便于项目的扩展、易于维护。如果IoC+接口情况下,删除任意实现类都不会导致程序编译出错。虽然运行到特定得代码会报错,但是其他代码在使用时不会有问题-----从侧面也反应出是松耦合。
AOP(Aspect-Oriented Programming): 面向切面编程
AOP的主要原理:动态代理。
代理模式:静态代理和动态代理(JDK动态代理、CGLib动态代理)。
静态代理:针对每个具体类分别编写代理类;针对一个接口编写一个代理类;
动态代理的原理:反射。
AOP优点是:
AOP实现日志管理:方法的开始记录入参,方法结束需要记录返回值和运行时间。
AOP比IoC更简单,直白点说就是实现调用某个方法之前或/和之后,自动执行一系列自定义的语句。
spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
16、Synchronized和锁的区别,什么情况下使用synchronized和ReentrantLock
由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
-
1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。通过lock.lockInterruptibly()来实现这个机制。
-
2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
-
3.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
推荐阅读:
参考阅读:
17、MySQL事务是什么?四大特性,四大隔离级别
事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。
四大特性
-
1:原子性。事务是一个不可分割的整体,事务开始的操作,要么全部执行,要么全部不执行。
-
2:隔离性。同一时间,只允许一个事务请求同一组数据。不同的事务彼此之间没有干扰。
-
3:一致性。事务开始前和结束后,数据库的完整性约束没有被破坏 。
-
4:稳定性。事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
隔离性的四种级别
-
1: read uncommitted。事务A对数据进行修改,但未提交。此时开启事务B,在事务B中能读到事务A中对数据库进行的未提交数据的修改。(这种方式也称为脏读)
-
2 :read committed。事务A对数据进行修改,但还未提交。此时开启事务B,在事务B中不能读到事务A中对数据库的修改。在事务B还没有关闭时,此时事务A提交对数据库的修改。这时候,我们在事务B中,可以查到事务A中对数据库的修改。这时存在一个问题,我们在同一个事务中,对数据库查询两次,但两次的结果是不一样的。(这种方式称为不可重复读。)
-
3 :repetition read。事务A对数据进行修改,但未提交,此时开启事务B,在事务B中不能读到事务A对数据库的修改。在事务A提交对数据库修改时,此时在事务B中,仍不能读到事务A对数据库的修改。(这种方式称为可重复读)但此时有一个弊端,比如我们在事务A中对数据库增加一条数据,id 为 n ,这时候我们在事务B中查询数据,此时查不到id为n的数据。但当我们在事务B中增加id为n的数据时,系统会提示id为n的数据已经存在,我们添加失败。但此时此刻,我们在事务B中仍不能查询到id为n的数据。这种方式存在一个幻读的概念。举个例子,(系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后关闭事务发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。)
-
4 :serializable。在开启事务A时,会产生锁表,此时别的事务会等待,等事务A结束时才会开启。
推荐阅读:
18、TCP为什么可靠,UDP如何实现可靠,二者区别?
TCP与UDP区别总结:
-
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
-
2、TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
-
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
-
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
-
5、TCP对系统资源要求较多,UDP对系统资源要求较少。
19、红黑树,为什么允许局部不平衡
20、HashMap实现原理,ConcurrentHashMap实现原理,ConcurrentHashMap和HashTable区别
21、JVM的对象分配在哪个区,Class对象分配在哪个区
22、算法相关
image.png23、Tomcat 类加载器
推荐一篇讲解的很到位的文章吧
24、BIO、NIO(如何实现的)、AIO
image.png25、介绍你实践的性能优化案例,以及你的优化思路
26、Redis、Memcached之间的区别,优劣势比较
27、请描述一致hash算法
https://www.cnblogs.com/lpfuture/p/5796398.html
https://blog.csdn.net/championhengyi/article/details/80820959
https://blog.csdn.net/suifeng629/article/details/81567777