LOADING

加载过慢请开启缓存 浏览器默认开启

2024阿里后端面试(一)

自我介绍

项目介绍,鉴权的具体流程,怎么样使用非对称加密组件

介绍一下HTTPS的三个具体流程

  1. 握手阶段:在HTTPS连接的建立阶段,客户端和服务器之间进行一系列的握手操作,以确保彼此的身份和建立安全通信。包括以下几部分:
    • 客户端发送一个加密套件列表,包含了客户端支持的加密算法和秘钥长度等信息。
    • 服务器从客户端提供的加密套件列表中选择一个加密套件,然后发送一个数字证书给客户端。
    • 客户端验证数字证书的合法性,然后生成一个随机数,使用服务器的公钥加密这个随机数,然后发送给服务器。
    • 服务器使用自己的私钥解密客户端发送过来的随机数,然后使用这个随机数生成对称加密算法的秘钥,然后发送给客户端。
  2. 秘钥交换阶段:在握手阶段完成后,客户端和服务器会使用会话秘钥进行加密和解密通信数据,以确保数据的机密性和完整性。包括以下几部分:
    • 客户端使用服务器发送过来的会话秘钥对称加密算法对数据进行加密,然后发送给服务器。
    • 服务器使用会话秘钥对接收到的数据进行解密
    • 服务器使用会话秘钥对称加密算法对数据进行加密,然后发送给客户端。
    • 客户端使用会话秘钥对接收到的数据进行解密。
    • 客户端和服务器之间的通信就是使用会话秘钥进行加密和解密的。
  3. 断开连接阶段:在通信结束后,客户端和服务器会断开连接,释放资源。
    • 客户端或服务器发送一个关闭通知给对方,表示希望关闭连接
    • 接收到关闭通知的乙方确认收到通知,并发送一个关闭通知给对方
    • 客户端和服务器都收到对方发送的关闭通知后,就会断开连接,释放资源。

介绍一下HTTPS证书验证的过程

为什么不直接采用RSA,而是采用RSA+对称加密的方式

为了快和安全

线程池有哪些参数

核心线程数(corePoolSize):线程池中保持的最小线程数。
最大线程数(maximumPoolSize):线程池中允许的最大线程数。
空闲线程存活时间(keepAliveTime):当线程池中的线程数大于核心线程数时,空闲线程的存活时间。
时间单位(unit):空闲线程存活时间的单位,如秒、毫秒等。
任务队列(workQueue):用于存储等待执行的任务的队列,可以是有界队列或无界队列。
线程工厂(threadFactory):用于创建新线程的工厂。
拒绝策略(handler):当线程池无法接受新任务时,采取的策略,如抛出异常、丢弃任务等。

线程池的工作机制,拒绝策略有哪些,分别对应哪些情况

线程池是一种用于管理和复用线程的机制,可以有效地控制并发线程的数量,提高系统的性能和资源利用率,工作机制如下:

  • 创建线程池:在程序初始化时,创建一个线程池,包括线程池大小,任务队列等参数
  • 提交任务:当有任务需要执行时,将任务提交给线程池
  • 任务队列:线程池卫华一个任务队列,用于存放待执行的任务,当有任务提交时,线程池将任务添加到任务队列中
  • 空闲线程:线程吃中的线程会不断从任务队列中提取出任务进行执行,如果线程池中有空闲线程,则直接使用空闲线程执行任务
  • 线程数量控制:如果任务队列中的任务数量超过线程池的大小,线程池会创建新的线程来执行任务,如果任务队列中的任务数量较少,线程池会回收部分线程,释放资源
  • 任务执行:线程池中的线程不断从任务队列中提取任务进行执行,直到任务队列为空,线程池中的线程会等待新的任务到来
  • 线程复用:当线程执行完任务后,不会立即销毁,而是等待新的任务到来,这样可以减少创建和销毁线程的开销,提高性能
    线程池关闭:当线程池不再需要使用时,可以将线程池关闭,这时线程池会拒绝新的任务,同时等待线程池中的任务执行完毕后关闭线程池。

拒绝策略有以下几种:
线程池的拒绝策略有以下几种:

ThreadPoolExecutor.AbortPolicy(默认):当线程池已满并且工作队列也已满时,新任务将被拒绝并抛出RejectedExecutionException异常。

ThreadPoolExecutor.CallerRunsPolicy:当线程池已满并且工作队列也已满时,新任务会由调用execute方法的线程来执行。这种策略可以降低新任务的流量,但是会导致调用线程的执行速度变慢。

ThreadPoolExecutor.DiscardPolicy:当线程池已满并且工作队列也已满时,新任务将被直接丢弃,不会抛出异常。这种策略可能会丢失一些任务,但是可以保证线程池不会被阻塞。

ThreadPoolExecutor.DiscardOldestPolicy:当线程池已满并且工作队列也已满时,新任务会替换掉队列中最早的任务,然后尝试再次提交新任务。这种策略可能会丢失一些任务,但是可以保证线程池不会被阻塞。

不同的拒绝策略适用于不同的情况,选择合适的拒绝策略可以根据业务需求和系统性能来决定。
详情可见:
线程池拒绝策略应用场景

讲一下JVM三个类加载器,TomCat类加载的流程

JVM类加载:

Tomcat类加载

JVM调优的方法

JVM调优的方法有以下几种:

  1. 调整堆大小:通过调整JVM的堆大小,可以优化内存的使用,减少GC的频率。可以通过设置-Xms和-Xmx参数来调整堆的初始大小和最大大小。

  2. 调整新生代和老年代的比例:新生代和老年代的比例对于GC的效率有很大的影响。可以通过设置-XX:NewRatio参数来调整新生代和老年代的比例。

  3. 选择合适的GC算法:JVM提供了多种不同的GC算法,如Serial GC、Parallel GC、CMS GC、G1 GC等。根据应用程序的特点和需求,选择合适的GC算法可以提高GC的效率。

  4. 设置合适的GC参数:JVM提供了许多与GC相关的参数,可以根据应用程序的需求进行调整。如-XX:MaxGCPauseMillis参数可以控制最大GC停顿时间,-XX:GCTimeRatio参数可以控制GC时间占总时间的比例等。

  5. 避免内存泄漏:及时释放不再使用的对象,避免出现内存泄漏问题,可以减少GC的负担。

  6. 使用压缩指针:如果应用程序的堆大小小于32GB,可以使用压缩指针来减少内存的使用,提高性能。

  7. 使用并行处理:通过使用并行处理来提高多核处理器的利用率,可以加快GC的速度。可以通过设置-XX:+UseParallelGC参数来开启并行GC。

  8. 监控和分析:通过监控JVM的运行情况,收集GC日志和堆转储文件,进行分析和优化。可以使用工具如jstat、jmap、jstack等来进行监控和分析。

常见的排序算法,Java的sort底层实现

常见的排序算法有以下几种:
冒泡,插入,堆,快速,归并,希尔,选择,计数,桶,基数
Java的sort底层实现:

Java的sort底层实现是TimSort算法,是一种混合的排序算法,结合了归并排序和插入排序的优点,可以在最坏情况下达到O(nlogn)的时间复杂度,且具有稳定性。

Collection.sort()方法底层就是调佣Array.sort()方法。而Array.sort()方法底层使用了两种排序算法:快排和优化的归并排序。
JDK1.7之前是归并排序,JDK1.8改为了TimSort算法和legacyMergeSort算法的混合排序。

TimSort排序解析

legacyMergeSort

详细讲一下快速排序当中具体怎么比较每个元素的(左右指针)

Spring中bean的作用域

  • singleton:单例模式,一个 BeanFactory 有且仅有一个实例,Bean 默认为单例模式。
  • prototype:原型模式,每次从 BeanFactory 获取 Bean 时,都会生成一个新的 Bean 实例。
  • request:每次 HTTP 请求都会产生一个新的 Bean,该 Bean 仅在当前 HTTP request 内有效。
  • session: 在一个 HTTP Session 中,一个 Bean 对象对应一个实例,该作用域仅在基于web的Spring ApplicationContext 情形下有效。
  • global-session:全局session作用域,仅仅在基于Portlet的web应用中才有意义,Spring5已经没有了。

Springboot的启动流程

  1. 加载Spring Boot配置文件:Spring Boot会根据约定的位置加载配置文件,如application.properties或application.yml。

  2. 创建Spring应用程序上下文:Spring Boot会创建一个Spring应用程序上下文,用于管理应用程序的所有Bean。

  3. 执行自动配置:Spring Boot会根据classpath中的依赖和配置文件的内容,自动配置应用程序的各个组件,如数据库连接、Web服务器等。

  4. 执行Bean的初始化和依赖注入:Spring Boot会初始化所有的Bean,并进行依赖注入,以满足Bean之间的依赖关系。

  5. 启动内嵌的Web服务器:如果应用程序中包含Web组件,Spring Boot会启动内嵌的Web服务器,如Tomcat或Jetty。

  6. 执行应用程序的逻辑:Spring Boot会执行应用程序的逻辑,包括处理请求、响应数据等。

  7. 关闭应用程序:当应用程序关闭时,Spring Boot会执行一些清理工作,如关闭数据库连接、释放资源等。

总之,Spring Boot的启动流程包括加载配置文件、创建应用程序上下文、执行自动配置、初始化Bean和依赖注入、启动内嵌的Web服务器以及执行应用程序的逻辑。

介绍一下ApplicationContext

ApplicationContext是Spring中的核心接口和容器,允许容器通过应用程序上下文环境创建、获取、管理bean。在构建容器的时候,创建对象采用的策略是立即加载的方式,即只要一读取完配置文件就立即创建配置文件中配置的对象。BeanFactory采用的是延迟加载的方式,什么时候根据id获取对象了,什么时候才真正地创建对象。
该接口具有三个常用的实现类:
1、ClassPathXmlApplicationContext:可以加载类路径下的配置文件,要求配置文件必须在类路径之下。
2、FileSystemXmlApplicationContext:可以加载磁盘中任意路径下的配置文件,要求具有访问权限。
3、AnnotationConfigApplicationContext:用于读取注解创建容器。

本文作者:GWB
当前时间:2023-11-09 11:11:09
版权声明:本文由gwb原创,本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 国际许可协议。
转载请注明出处!