最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件

1、AOP实现原理:动态代理

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第1张图片
image.png

2、对象什么情况下进入老年代

https://blog.csdn.net/xdzhouxin/article/details/81218578

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第2张图片
image.png

3、双亲委派模型,为什么这样做?

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第3张图片
image.png

双亲委派模型的概念

  • 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的类请求都会传给顶层的启动类加载器(Bootstrap ClassLoader),只有当父加载器反馈自己无法完成该加载请求时,子加载器才会尝试自己去加载。

双亲委派模型的优点:

  • Java类伴随其类加载器具备了带有优先级的层次关系,确保了在各种加载环境的加载顺序。
  • 保证了运行的安全性,防止不可信类扮演可信任的类。

4、Java会出现内存溢出吗?什么情况下会出现

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第4张图片
image.png

什么情况下会出现

  • 检查代码中是否有死循环或递归调用。
  • 检查是否有大循环重复产生新对象实体。
  • 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
  • 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

5、常用的设计模式介绍:单例模式、装饰者模式等

设计模式看了又忘,忘了又看?

6、消息中间件有哪些?他们之间的优劣势

image.png

7、redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第5张图片
image.png

8、OOM内存泄漏,什么情况下会出现,如何排查

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第6张图片
image.png

一次由过量线程引发的OOM排查

一次线上OOM过程的排查

这里强烈推荐阿里出品的Arthas

Arthas 能为你做什么?

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在预发 debug 一下,难道只能通过加日志再重新预发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现,怎么办?
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到容器和中间件的实时运行状态?

1、Arthas官方指南

2、Arthas实战

3、arthas源码分析

4、Arthas源码分析

9、MySQL的索引

图解MySQL索引--B-Tree(B+Tree)

nnoDB一棵B+树可以存放多少行数据?

深入理解MYSQL索引之B+TREE

真的,MySQL 索引优化看这篇文章就够了

10、JVM-垃圾回收详解

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即可。
最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第7张图片

14、深入剖析Java线程池原理

线程池的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果任务数量超过了最大线程数量,需要进入队列排队等候,等其他线程执行完毕,再从队列中取出任务来执行

主要特点:

  • 线程复用
  • 控制最大并发数量
  • 管理线程

带来的好处

  • 降低了资源消耗。通过复用机制降低了线程创建和销毁的消耗。
  • 提高了响应速度。当任务到达时,任务不需要等候就能立即执行。
  • 提高了线程的可管理性。线程是稀缺的,如果无限制创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。

深入剖析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要么随机唤醒一个线程要么唤醒全部线程。

推荐阅读:

深入理解Java中的锁

参考阅读:

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第8张图片

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结束时才会开启。

推荐阅读:

Spring事务传播行为详解

18、TCP为什么可靠,UDP如何实现可靠,二者区别?

TCP与UDP区别总结:

  • 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。

  • 2、TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

  • 3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

  • 4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

  • 5、TCP对系统资源要求较多,UDP对系统资源要求较少。

TCP为什么可靠,UDP如何实现可靠,二者区别?

19、红黑树,为什么允许局部不平衡

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第9张图片

20、HashMap实现原理,ConcurrentHashMap实现原理,ConcurrentHashMap和HashTable区别

21、JVM的对象分配在哪个区,Class对象分配在哪个区

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第10张图片

22、算法相关

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第11张图片
image.png

https://t.zsxq.com/iIYVb2v

23、Tomcat 类加载器

推荐一篇讲解的很到位的文章吧

图解Tomcat类加载机制(阿里面试题)

24、BIO、NIO(如何实现的)、AIO

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第12张图片
image.png

25、介绍你实践的性能优化案例,以及你的优化思路

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

28、分布式session的共享方案有哪些,有什么优劣势

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第13张图片
image.png

分布式Session解决方案

29、MySQL与MongoDB的区别,海量数据的存储

最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件_第14张图片
image.png

30、SQL慢查询的优化方案,索引和表的优化方案

真的,MySQL 索引优化看这篇文章就够了

31、高并发情况,系统的优化方案有哪些,以及优先级排序

高并发系统 优化总结

32、微服务和SOA的区别,优劣势

SOA 与 微服务的区别

33、介绍你实践的性能优化案例,以及你的优化思路

性能优化的思路和步骤

你可能感兴趣的:(最新天猫面试题(含答案):线程池+并发编程+分布式设计+中间件)