关于Java后端相关面试

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

晨考题汇总

一. Java Web

1. 什么是bom,什么是dom,两者有什么关系,尝试画一下两者的关系图

bom:BOM简称浏览器对象模型。是用来获取或设置浏览器的属性、行为,例如:新建窗口、获取屏幕分辨率、浏览器版本号等。 比如 alert();弹出一个窗口,这属于BOM

dom:DOM简称文档对象模型。是用来获取或设置文档中标签的属性,例如获取或者设置input表单的value值。document.getElementById("").value;

2.javascript 中== 和=== 的区别

==:仅比较两边的值。对于不同类型的对象,会先做类型转换再进行比较

===:会先比较两个对象的类型,类型相同才比较值。

3. 乱码问题怎么解决

post request。setC utf-8

get tomcat8以上不用管 以下 配置URIEn

4. 如何找到所有 HTML select 标签的选中项?

$(’[name=selectname]:selected’)

5. $(document).ready()是个什么函数?为什么要用它?

是一个页面载入函数,可以极大的提高Web应用程序的响应速度

6. 使用CDN加载 jQuery 库的主要优势是什么 ?

CDN:静态资源加速服务器

  • 可以节省服务器带宽

  • 可以更快地下载jquery文件

  • 如果浏览器已经从同一个cdn上下载了jquery文件,再次打开页面时,不会再次下载

7. 跨域问题如何解决

跨域问题:不允许js跨服务器获取数据

解决方案:

  1. cross:同源策略

    后端通过response的头设置可以获得数据的域

  2. jsonp = json+packpage

    原理:走规则的空子,把json包装返回来,包装成一个javascript的函数

    后端:把json包装成jsonp

    前端:解开json

  3. 代理服务器

    通过代理服务器访问数据

8. jsp的工作原理是什么

  1. 客户端通过浏览器向服务器发出请求,在该请求中包含了请求的资源的路径,这样当服务器接收到该请求后就可以知道被请求的内容。

  2. 服务器根据接收到的客户端的请求来加载相应的JSP文件。

  3. Web服务器中的JSP引擎会将被加载的JSP文件转化为Servlet文件(.java)。

  4. JSP引擎将生成的Servlet代码编译成Class文件。

  5. 服务器执行这个Class文件。

9. request.getParameter()和request.getAttribute() 的区别

request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据;

request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。

10. servlet 的生命周期是什么

servlet的生命周期顾名思义就是从servlet出现到消亡(销毁)的全过程。

主要分为以下几个阶段: 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁

11. session 和 cookie 的区别

session 存储在服务器中,安全

cookie 存储在客户浏览器中,不安全

都是用来保存状态信息

12.重定向和转发的区别

转发:

  1. 转发速度快,不需要跨越服务器,在自己项目的页面之间跳转

  2. 转发是同一次请求

  3. 转发地址栏是没有变化的

  4. 转发可以带参数

image-20221214202552297

重定向:

  1. 重定向的速度比较慢,可以跨越服务器

  2. 重定向是两次不同的请求

  3. 地址栏的地址是会发生变化的

  4. 重定向不能带参数

image-20221214202612883

13. session 的 钝化和 活化

钝化:当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化

活化:当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。

14. session 和 cookie 的关系又是什么

我们的session 都有一个唯一的sessionid,我们通过sessionid 就能获得session 对象,我们web就是把session id 存在cookie中,每一次发请求的时候都会把cookie中的sessionid 放在请求头中,我们可以通过sessionid 找到自己的session 对象

15. 什么是过滤器,过滤器的作用是

过滤器是处于客户端与服务器资源文件之间的一道过滤网,

作用:在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应,也就是公共增强

16. 什么是web组件,说一下常见的web组件【servlet filter listener】的生命周期

filter和listener都随容器的启动而启动

servlet随请求的发起而创建

17. 列举使用了过滤器的场景

  • 字符过滤器(解决post请求中的乱码问题)

  • 同源策略解决跨域问题

18. 什么叫做过滤器链,过滤器链中 过滤器起作用的先后顺序取决于什么

过滤器链是由所有的过滤器组成的一个链

xml配置的过滤器:在我们定义了多个Filter过滤器之后,Servlet容器默认会按照web.xml文件中Filter的声明顺序依次执行谁在前面,谁先执行

19. 什么是js 的event 对象

20. 怎样获得event 对象

21. 获得event 对象之后可以帮助我们干什么

22. jquery 中 remove 和 detach 方法的区别

remove()与detach()方法都是从dom中删除所有的元素

不同之处在于用remove()删除的元素,除了元素被删除,其他的在这个元素上的绑定事件等都会被移除,但是detach()方法不会移除这个元素上的方法或者是附加数据

23. innerHTML 和 innerText 的区别

innerHTML:设置或获取元素内的所有子节点(包括标签、注释和文本节点)

innerText:获取元素的文本,会过滤掉所以标签,将文档树中的所有文本拼接起来

24. 什么是json 起什么作用

json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。存放的是的类似键值对,本质上来说是javascript的数据类型,是一种轻量级的数据交互格式

25. 什么是ajax ajax的原理是什么

AJAX:“异步的Javascript和XML”。即使用javascript语言与服务器进行异步交互。

异步请求:异步请求就是当发出请求的同时,浏览器可以继续做任何事,Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。一般默认值为true,异步。异步请求可以完全不影响用户的体验效果,无论请求的时间长或者短,用户都在专心的操作页面的其他内容,并不会有等待的感觉。

局部刷新:不重新加载整个页面就能实现数据的动态变化

26. 什么是javascript 的跨域问题

浏览器 不允许javascript跨域访问数据,协议,域名,端口都要相同,其中有一个不同都会产生跨域问题

27. 什么是bio 什么是nio 用在什么场景

bio: 同步阻塞型io 会让线程阻塞 用在tomcat

nio 同步非阻塞io 不会阻塞线程 用在nginx 游戏服务器

28. 描述一下nio 的核心3要素

Channel(通道),Buffer(缓冲区), Selector(选择器)

Channel:客户端通过管道往服务器端 传输

Buffer:东西写在缓冲区中 如果buffer中有内容了 就可以理解为 有客户端给我们请求了

Selector:多路复用模型 让一个线程能够对应多个请求

29. nio选择器的3种模型

  select poll epoll (jdk1.5及以上)
操作方式 遍历 遍历 回调
底层实现 数组 链表 hash表
IO效率

每次调用都进行线性遍历

时间复杂度为O(n)

每次调用都进行线性遍历

时间复杂度为O(n)

事件通知方式,每当有I/O事件就绪

系统注册的回调函数就会被调用

时间复杂度为O(1)

最大连接 无上限 无上限 无上限

 

30. nginx做为企业应用的入口如果nginx 挂了怎么办 【换句话说:怎样保证nginx的高可用】

通过Nginx+keepalived配置双机主从模式或双主模式

主从模式:

双主模式:

31. nginx是什么 特征是什么

Nginx(“engine x”)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强

nginx的三大特点:1. 反向代理 2. 负载均衡 3. 动静分离

反向代理

负载均衡:负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。

动静分离:nginx动静分离简单来说就是把动态跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面

32. 公司中用nginx 的使用场景

  • 轻量级的web容器【静态资源】

  • 反向代理

  • 负载均衡

33. 什么是正向代理 什么是反向代理(重点)

正向代理:正向代理隐藏真实客户端

当用户想访问某一网址时,用户先访问代理服务器,然后由代理服务器向目标网址发送请求最终将数据返回代理服务器,最后代理服务器将数据返回给用户这一过程我们称之为正向代理。

比如我们要去访问某个网站,我们直接访问不通,那么我们就可以找一个代理服务器为我们服务,我们通过代理服务器请求到这个网站。对于这个网站而言他只知道有一个服务器访问了自己,并不知道你访问了他

在这里插入图片描述

 

反向代理:反向代理隐藏真实服务端

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。

我们平时访问百度时,直接访问www.baidu.com。它背后可能有成千上万的服务器为我们服务,但具体是哪一台为我们服务,我们并不知道,也没必要知道。我们只需要知道反向代理服务器是谁就可以(只要达到目的就可以了)。

在这里插入图片描述

来源:(43条消息) 什么是正向代理和反向代理_Kaiser king的博客-CSDN博客

34、nginx的 负载均衡算法或者说【负载均衡的方式】有哪些

  1. 轮询:nginx负载默认的方式,它的本意是将海量请求按照时间的顺序分配到不同的服务器上;如果某个服务器down掉,nginx可以将其自动踢出集群

  2. 权重:指定每个服务器的权重比例,由于有的服务器性能比较好,所以通过设置不同服务器间权重的比例可以发挥服务器的最大性能

  3. ip_hash:根据ip经过hash后的结果进行分配,这样每个ip只能固定访问一个服务器

  4. url_hash:根据url经过hash后的结果进行分配,这样每个url只能固定访问一个服务器

  5. fair:根据后端服务器的响应时间 来分配请求,响应时间短的优先分配,响应时间越短说明服务器负载压力越小,所以优先分配

35、请描述一下 企业开发中 异常是怎样处理的

数据持久层(dao)和业务层(service)不处理异常,抛到控制层(controller)调用自定义异常进行统一处理

36、$(this) 和 this 关键字在 jQuery 中有何不同?

表示对象不同:this表示的是javascript提供的当前对象,$(this)表示的是用jquery封装后的当前对象。

过程不同:this对象可以直接用this.style修改样式,$(this)可以使用jquery提供的方法访问样式。

37、怎样理解无状态协议

38、TCP和UDP的区别

39、servlet是懒加载还是及时加载

懒加载

40、什么是jsp的内存对象

二. 线程

1. 线程池的原理是什么

原理:在应用程序启动之后,就马上创建一定数量的线程,放入空闲的队列中。这些线程都是处于阻塞状态,这些线程只占一点内存,不占用CPU。当任务到来后,线程池将选择一个空闲的线程,将任务传入此线程中运行。当所有的线程都处在处理任务的时候,线程池将自动创建一定的数量的新线程,用于处理更多的任务。执行任务完成之后线程并不退出,而是继续在线程池中等待下一次任务。当大部分线程处于阻塞状态时,线程池将自动销毁一部分的线程,回收系统资源。

工作流程(口述):

1、线程在有任务的时候会创建核心的线程数corePoolSize

2、当线程满了(有任务但是线程被使用完)不会立即扩容,而是放到阻塞队列中,当阻塞队列满了之后才会继续创建线程。

3、如果队列满了,线程数达到最大线程数则会执行拒绝策略。

4、当线程数大于核心线程数事,超过KeepAliveTime(闲置时间),线程会被回收,最终会保持corePoolSize个线程。

2. Executors创建的线程池种类有哪些

  1. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程。

  2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数。超出的线程会在队列中等待

  3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

  4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。

3. 为什么阿里巴巴开发规约不让我们使用Executors创建线程池

说明:Executors 返回的线程池对象的弊端如下:

  1. FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

  2. CachedThreadPool 和ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

4. 你们用什么创建线程池

ThreadPoolExecutor

5. 线程池的7个核心参数分别是什么意思

corePoolSize: 线程池核心线程个数

workQueue:用于保存等待执行任务的阻塞队列

maximunPoolSize: 线程池最大线程数量

ThreadFactory: 创建线程的工厂

RejectedExecutionHandler: 队列满,并且线程达到最大线程数量的时候,对新任务的处理策略

keeyAliveTime: 空闲线程存活时间

TimeUnit: 存活时间单位

6. 什么叫做线程池的拒绝策略,一共有几种拒绝策略(重要)

当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略,一共有四种,第十题

7. 线程池的好处(重要)

  • 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

  • 提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行。

  • 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,监控和调优。

8. 线程池的种类 以及各种种类的特点(了解)

Executors.newFixedThreadPool(nThreads):固定容量的线程池。corePoolSize为nThreads,maximumPoolsize为nThreads,keepAliveTime为0ms,采用了无界队列。缺点在于容易造成大量内存占用,可能会导致OOM。 Executors.newSingleThreadExecutor():单个线程的线程池。corePoolSize为1,maximumPoolsize为1,keepAliveTime为0ms,采用了无界队列。缺点在于当请求堆积的时候,可能会占用大量的内存。 Executors.newCachedThreadPool():可缓存线程池,特点是具有自动回收多余线程的功能。corePoolSize为0,maximumPoolsize为Integer.MAX_VALUE,keepAliveTime为60s,采用了直接交换。缺点在于maximumPoolsize为Integer.MAX_VALUE,这可能会创建数量非常多的线程,甚至导致OOM。 Executors.newScheduledThreadPool(corePoolSize):支持定时及周期性任务执行的线程池。corePoolSize为corePoolSize,maximumPoolsize为Integer.MAX_VALUE,keepAliveTime为0ns,采用了优先队列。采用schedule()方法可以设置要执行的任务,以及执行的时间间隔,采用scheduleAtFixedRate()方法可以设置任务,第一次的延迟时间,以及执行的时间间隔。 Executors.newWorkStealingPool():JDK1.8后加入的线程池,与前面的线程池有很大的不同。通常来说,当这个任务可以产生子任务(如树的遍历、处理矩阵)的时候,才适合这种场景。这种线程池拥有一定的窃取能力,每一个线程之间会合作,任务会放在线程独有的队列中,而不是公共的队列,线程之间会有互相帮助的现象。注意点:1. 为了提高效率,任务最好不要加锁,因为任务可能被不同的线程执行;2. 不保证执行顺序。

9. 怎样创建线程池

  • 通过 ThreadPoolExecutor 创建线程池;

  • 通过 Executors 创建线程池。

10. 线程池的4个拒绝策略(重点)

1、AbortPolicy(被拒绝了抛出异常)

2、CallerRunsPolicy(使用调用者所在线程执行,就是哪里来的回哪里去)

3、DiscardOldestPolicy(尝试去竞争第一个,失败了也不抛异常)

4、DiscardPolicy(默默丢弃新任务、不抛异常)

11. ThreadLocal 是什么,特点是什么

概念:线程局部变量

特点:每个线程都能往其中存东西 ,但是每个线程取出来的东西都是自己放进去的,别的线程放进去的东西他娶不到,线程和线程之间是隔离的

12. ThreadLocal 的原理是什么?

在每一个线程对象里面都有一个ThreadLocalMap,我们的值其实是放在每个线程的 ThreadLocalMap中,而map的key 是ThreadLocal 对象,这样就能做到每个线程的局部变量是隔离的

13. 我们3层中,DBFactory 中ThreadLocal 是用来干什么的?

为了保证 同一个事务用的连接是同一连接

1670402195558

14. 我们的项目中,除了DBFactory 中使用ThreadLocal,其他地方还用到没有,请说明情况。

乐观锁重试,用ThreadLocal 保存每个线程(业务)重试的次数

15. 使用ThreadLocal什么场景下 可能发生OOM(OUT OF MEMORY)内存溢出,请说明理由。

线程结束之后 不把ThreadLocal 清空会产生OOM

16、线程从运行态进入阻塞态的原因

  1. 线程的cpu时间片用完了

  2. 执行了IO/网络操作

  3. sleep 休眠

17、多线程如何提升工作效率

多个线程抢占cup时间,让cpu一直保持高速工作的状态

比如,如果一个任务是单线程执行的话,如果进行了io操作(向数据库插入数据)或网络操作(发起请求),则当前线程会进入阻塞状态,又没有其他cpu抢占资源,则会知道阻塞状态结束即io操作完成后,才会继续执行任务,多线程一旦进入阻塞状态,就会有其他线程抢占cpu资源,大大提升工作效率

18、并行和并发的区别

并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于阻塞状态。这种方式我们称之为并发

特点:对单处理器而言,多个程序在同一时间段内发生

并行:当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行

特点:对多处理器而言,多个程序在同一时刻发生

19、线程的状态有哪些

线程的状态通常有五种:创建、就绪、运行、阻塞、死亡

  • 新建状态(New):新创建了一个线程对象,该线程的生命周期开始。

  • 就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的start方法,该状态的线程会位于可运行的线程池中,变得可运行,等待cpu的使用权。

  • 运行状态(Running):就绪状态的线程获取到了cpu的时间片,执行程序代码。

  • 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃cpu的使用权,暂停或停止运行,直到线程进入就绪状态,才有机会获得cpu的使用权从而转入运行状态。

  • 死亡状态(Dead):线程执行完了或者因为异常而退出的run方法,该线程生命周期结束。

20、线程和进程的关系

  1. 进程是资源分配的基本单位,线程是CPU调度和分派的基本单位

  2. 线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程

21、线程并发会带来什么问题

  • 可见性

  • 原子性

  • 有序性

22、什么是原子性问题,产生的原因是什么?怎么解决

原子性:两个线程并发操作的结果和一个一个线程的执行结果不一样,就会产生原子性问题

产生原因:线程阻塞时,会被枪占cpu资源

解决方式:加锁

23、什么是可见性问题

共享对象的可见性是指如果两个或多个线程共享一个对象,但没有正确使用 volatile 声明或 Synchronized 同步机制,那么当一个线程更新了共享变量值后,该过程对于其他线程来讲是不可见的,例如,线程 A、B 要同时进行修改变量 c,线程 A 和 B 在各自的 Thread Stack 中维护了一份局部变量 c 的副本,线程 A 修改了线程 A 中 Thread Stack 中的局部变量 c A c_Ac A ,但是还没有还没将修改的数据刷新到 Heap Memory 中,而线程 B 获取的值依然是 c 的旧值,就出现了可见性问题

我们的jmm java内存模型中,每个线程都会有它单独的高速缓冲区,对于多个线程使用同一个共享变量的情况,如果这个共享变量不是经常被改变,那么我们的jit优化器就会让线程从自己的高速缓冲区中拿取数据,如果这个时候共享变量的值被某个线程改变了,而其他变量不知道,就会导致可见性问题

24、什么是JMM,可见性问题产生的原因是什么

jmm: 为了能够支持多线程程序,又设计了 JMM(Java Memory Model,即 Java 的内存模型),是 JVM 使用的一种内存模型,是 JVM 的另一种抽象表现形式,它将线程堆栈和堆之间的内存分开;

原因: 我们jdk中有一个jit优化器,这个优化器的其中一个优化是: 在每个线程的高校缓存中去使用变化不是很频繁的共享变量

25、可见性问题怎么解决

加volate关键字,加了volentier关键字的线程

禁用jit优化器

26、有序性问题怎样解决

加vol或者加锁

27、对象都是分配在堆中吗?有没有可能分配在栈中?

不是,有可能分配在栈中

好处:不需要垃圾回收,提升jvm的性能

jit经过逃逸分析,有些对象是有可能在栈中的,jdk1.6后就自带逃逸分析;

28、阻塞队列的概念和好处

概念:

  • 是一种线程安全的数据结构;

  • 带有阻塞功能:

  • 支持两个附加操作

概念:当阻塞队列为空时,读取的线程会等它非空,当阻塞队列满时,写入的线程会等待队列的可用

好处:不需要关心什么时候阻塞线程,也不需要关心什么时候唤醒线程,保证了线程安全

29、阻塞队列中add offer put 3个方法的区别

add 方法

add 方法是往队列里添加一个元素,如果队列满了,就会抛出异常来提示队列已满。

offer 方法

offer 方法用来插入一个元素,并用返回值来提示插入是否成功。如果添加成功会返回 true,而如果队列已经满了,此时继续调用 offer 方法的话,它不会抛出异常,只会返回一个错误提示:false。

put 方法

put 方法的作用是插入元素。通常在队列没满的时候是正常的插入,但是如果队列已满就无法继续插入,这时它既不会立刻返回 false 也不会抛出异常,而是让插入的线程陷入阻塞状态,直到队列里有了空闲空间,此时队列就会让之前的线程解除阻塞状态,并把刚才那个元素添加进去。

30、常见阻塞队列的种类

线程池的阻塞队列

ArrayBlockingQueue

基于数组实现的有界阻塞队列

LinkedBlockingDeque

LinkedBlockingDeque是一个有链表组成的双向阻塞队列,与前面的阻塞队列相比它支持从两端插入和移出元素。以first结尾的表示从对头操作,以last结尾的表示从对尾操作。

阻塞队列分为有界和无界

31、start和run的区别

32、runable和callable的区别

三. 锁

1. synchronized 和 lock 的区别

img

synchronized是关键字,lock是类,synchronized会自动释放锁,lock必须手动释放锁

2. 什么是公平锁 什么是非公平锁

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁,这种方式会造成性能低下,大量的时间花费在线程调度上。 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

3. lock 公平锁和非公平锁实现的原理

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁,这种方式会造成性能低下,大量的时间花费在线程调度上。

非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

4. 什么是可重入锁 什么是不可重入锁,可重入锁的好处是什么

可重入锁又名递归锁,指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。与可重入锁相反,不可重入锁不可递归调用,递归调用就发生死锁

5. 独占锁,共享锁 互斥锁 排他锁 读写锁

读锁 :共享锁

写锁:独占锁 排他锁 互斥锁

6. synchronized的原理

synchronized是一种对象锁,是可重入的,但是不可中断的,非公平的锁。

和moniter对象有关,moniter对象是锁的要钥匙,如何实现的,是通过对象的对象头来实现,对象头是64位编码,如果我们对所有代码,一上来就使用锁,容易造成资源浪费,所以就有了锁升级概念,是自动调整的,根据实际情况,有无锁,偏向锁,轻量级锁,重量级锁

7. synchronized 锁升级

synchronized锁本质是一个对象锁,即在对象中锁的一个过程。

在JVM中,每个对象都有一个对象头,synchronized用的锁是存在对象头中的,对象头里Mark Word的存储结构是64位

在运行期间,Mark Word中的数据会随着锁标志位的变化而变化,Mark Word可能会变成以下四种状态:

无锁,偏向锁,轻量级锁,重量级锁

8. 悲观锁 和 乐观锁

乐观锁的原理:cas

乐观锁:对于并发间产生的线程安全问题持乐观态度,乐观锁认为竞争总是不会发生,因此他不需要持有锁,将比较和替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,应有相应的重试逻辑

悲观锁:对于并发间产生的线程安全问题持悲观态度,悲观锁认为竞争总是会发生,因此每次对于资源进行操作时,都会持有一个独占的锁,就像synchronized,直接上锁操作资源

9. 乐观锁的缺点

缺点一:不可重试

缺点二:ABA问题

如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的 "ABA"问题。

解决方式:添加版本号

缺点三:循环时间长开销大

自旋CAS(也就是不成功就一直循环执行直到成功)如果长时间不成功,会给CPU带来非常大的执行开销

10. 怎样无锁也能保证原子性

即乐观锁的原理,使用比较和替代实现原子操作

11. 写生产者和消费者

12. a-b-c-d 4个线程同时就绪 请按照a-b-c-d的顺讯执行线程

13.什么是自旋锁

如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗

14、详细描述一下锁升级的过程

无锁:首先是一个无锁的状态,代表着里面不涉及到锁,什么时候是无锁的状态呢,就是写了一个synchronized将一个对象锁住(写了一个对象),此时没有任何线程去访问这个对象,此时这个对象就是无锁状态,此时没有线程访问它

偏向锁:顾名思义它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁

轻量级锁:是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁

重量级锁:如果轻量级锁自旋到达阈值后,没有获取到锁,就会升级为重量级锁

锁升级不可逆,只能往上升,不能往下降

15、wait和sleep的区别

sleep,wait方法调用后都会阻塞当前线程并让出cpu的执行时间,但不同的是sleep方法不会释放当前持有的对象的锁资源,阻塞结束后会继续执行,而wait方法会放弃所有锁,并需要通过notify/notifyAll唤醒后重新获取到对象锁资源后才能继续执行

16、如何检查死锁

  1. jstack

  2. jconsole

  3. jvisualvm

  4. jmc

17、读写锁的原理

18、怎样让一个线程有序执行

19、死锁产生的条件

  • 不可剥夺

  • 循环等待

  • 互斥

  • 请求与保持

四、数据库

1、数据库并发会带来什么问题

脏读、不可重复读、幻读

2、请详细解释什么叫做 脏读 不可重复读 幻读

  • 脏读:读到了其他事务未提交的数据

    比如:事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中

  • 不可重复读:不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况

    比如:事务 A 多次读取同一数据,但事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致

  • 幻读:事务 A 多次读取一个范围内的数据集的过程中,事务 B 对数据进行了新增操作或者删除操作,导致事务 A 多次读取的数据集不一致

    比如:目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读

3、数据库的隔离级别有哪些

  • 读未提交

  • 读以提交

  • 可重复读

  • 串行化

4、mysql 和 oracle的默认隔离级别分别是什么

mysql:可重复读

oracle:读已提交

5、数据库中性别用什么数据类型 钱用什么数据类型

性别:

  1. 枚举类型 优点:节省空间,提高查询效率

  2. TinyINT

  3. cha(1)

  4. bit 1

钱:浮点类型统一用decimal

6、内连接 外连接 的区别

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件

外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。

7、请说出数据库连接池的好处 ,以及常见的配置

好处:

  1. 资源重用 由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。

  2. 更快的系统响应速度

    数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间

  3. 统一的管理连接,避免数据库连接泄漏

    在较为完备的数据库连接池实现中,可根据预先设定的连接占用超时时间,强制收回被超时占用的连接。从而避免了常规数据库连接操作中可能出现的资源泄漏(当程序存在缺陷时,申请的连接忘记关闭,这时候,就存在连接泄漏了)

  4. 保护数据库

常见配置(druid):

  • maxActive:连接池支持的最大连接数

  • maxIdle:连接池中最多可空闲maxIdle个连接

  • minIdle:连接池中最小空闲连接数

  • initialSize:初始化连接数目

  • maxWait:连接池中连接用完时,新的请求等待时间

  • removeAbandonedTimeout:活动连接的最大空闲时间

  • minEvictableIdleTimeMillis:连接池中连接可空闲的时间

老师测c3p0版本:

  • initialPoolSize 初始化连接数

  • maxIdleTime 最大空闲时间

  • idleConnectionTestPeriod 多长时间检查一次是否有空闲连接

  • minPoolSize 最小连接数

  • acquireIncrement 一次增长几个

  • maxPoolSize 最大连接数

  • checkoutTimeout 最大等待时间

  • maxStatements 缓存PrependStatement

  • validation-query :SELECT 1 FROM DUAL(mysql特有的,因为mysql每过8个小时就会自动挂起,连接池不知道)

8、事务的四个特性(ACID)

  • 原子性

  • 一致性

  • 隔离性

  • 持久性

9、char、varchar的区别是什么?

char:定长字符串

varchar:可变长字符串

能选定长,绝不选变长

原因:1. 不容易产生碎片

  1. 同样长度 varchar在实际内存中,会多占两位

10、TRUNCATE和DELETE的区别是什么

  • 二者都能删除表中的数据

  • delete:属于 DML(数据操作语言) 范畴

  • truncate:属于 DDL(数据定义语言) 范畴

  • delete:能删除表中或基于真实表创建的视图中的数据 truncate:只能删除表中的数据,无法应用在视图上

  • delete:删除表中数据时,可以通过 where 关键字,进行选择性s删除 truncate:不能使用 where 关键字进行选择性删除

  • delete:删除表中数据时,涉及到事务处理:回退(缓存)、提交、撤退 truncate:删除缓存时,不涉及缓存事务处理

  • delete:由于 delete 删除数据时要考虑事务管理(缓存、回退机制、日志记录),所以当删除大批量数据时,速度慢,效率低,甚至达不到删除的目的 truncate:删除大批量数据时,速度快、效率高、但无法撤销

  • delete:可以运用 SQL 语句、按照业务逻辑、按照一定的先后顺序可以删除相关表中的数据 truncate:不能删除对于由 foreign key 约束引用的表,不能删除该表中的数据


  • trunca删除速度比 delete快

  • truncate 不涉及事务的提交和回滚

11、varchar(50)中50的含义

varchar(50)50的涵义为最多存放50个字符,varchar(50)varchar(200)存储hello字符串所占空间一样,但后者在排序时会消耗更多内存

若列值的尾部含有空格,则CHAR列会删除其尾部的空格,而VARCHAR则会保留空格

12、int(20)中20的含义

int(10)的意思是假设有一个变量名为id,它的能显示的宽度能显示10位。在使用id时,假如我给id输入10,那么mysql会默认给你存储0000000010。当你输入的数据不足10位时,会自动帮你补全位数。假如我设计的id字段是int(20),那么我在给id输入10时,mysql会自动补全18个0,补到20位为止。

但是内存占用还是4个字节

13、钱用什么数据类型,性别用什么数据类型

性别:

  1. 枚举类型 优点:节省空间,提高查询效率

  2. TinyINT

  3. cha(1)

  4. bit 1

钱:浮点类型统一用decimal

14、内连接和外连接的区别 什么是全连接

内连接:也称为等值连接,返回两张表都满足条件的部分

左连接,取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null

右连接:取右边的表的全部,左边的表按条件,符合的显示,不符合则显示null

全外连接:返回左右表中所有的记录和左右表中连接字段相等的记录。

15、Blob 和 clob

BLOB和CLOB都是大字段类型, 1、BLOB是按二进制来存储的,通常像图片、文件、音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去。

2、CLOB是可以直接存储文字的,像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新存储等操作都提供很大的方便。

16、事务并发会带来的问题

17、什么是隔离级别,每种隔离级别可以解决什么问题

基于事务的隔离性,对并发操作带来的问题有不同的解决方案

18、一条sql 语句执行的过程

连接器

如果要操作 MySQL 数据库,我们必须使用 MySQL 客户端来连接 MySQL 服务器

查询缓存

MySQL 拿到第一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

分析器

判断你输入的这个 SQL 语句是否满足 MySQL 语法

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

执行优化之后的执行计划,在开始执行之前,先判断一下用户对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误;如果有权限,就打开表继续执行。

19、mysql 怎样防止长连接产生的oom 问题

在使用数据库的过程中定时的去断开连接;

20、连接池配置中 validation-query: SELECT 1 FROM DUAL 配置是什么意思

mysql数据库每过8个小时,就会进入挂起状态

使用SELECT 1 FROM DUAL来检查数据库是否有效。

连接池每隔一段时间 用连接发一个最简单的请求给mysql 看这个连接有没有被挂起

21、口述 mysql的架构体系

  • 连接层

    • 客户端连接器:提供与MySQL服务器建立连接的能力

  • 服务层

    • 连接池:主要是负责存储和管理客户端与数据库的链接,一个线程负责管理一个连接

    • 系统管理和控制工具:提供数据库系统的管理和控制功能

    • SQL接口:主要负责接收客户端发送过来的各种SQL命令,并将SQL命令发送到其他部分,并接收其他部分返回的结果数据,将结果数据返回给客户端。

    • 解析树:主要负责对请求的SQL解析成一棵“解析树”,然后根据MySQL中的一些规则对“解析树”做进一步的语法验证,确认其是否合法

    • 查询优化器:在MySQL中,如果“解析树”通过了解析器的语法检查,此时就会由优化器将其转化为执行计划,然后与存储引擎进行交互,通过存储引擎与底层的数据文件进行交互

    • 缓存:MySQL的缓存是由一系列的小缓存组成的

  • 存储引擎层

    • MySQL中的存储引擎层主要负责数据的写入和读取,与底层的文件进行交互

  • 系统文件层

    • 日志文件

    • 数据文件

    • 配置文件

    • pid文件

    • socket文件

22、cahr,varchar的区别

char:定长

varchar:不定长

23、索引的数据结构有哪些

线性: 数组 链表 队列 栈

树: 二叉树 搜索二叉树 平衡搜索二叉树(红黑树) b树(排序 多叉) b+树

图: n比n

hash: 查询性能最强 0(1),查询性能最强的是hash

24、b树为什么比二叉搜索树和hash更加适合做索引

b树比搜索二叉树好,因为b树多叉,索引b树更矮胖,查询的时间复杂度变少

b树比hash这种数据结构更加适合范围查找

25、b+树和b树的区别

b+树非叶子节点只存索引 只有在叶子节点才存数据 这样b+树比b树更加矮胖

26、一个树的节点是64k,请大致估算一下 以下表1000万条数据 ,分别用b树和b+树做索引 需要多少层

image-20230217085913083

27、描述一下复合索引的数据结构

b+数,符合索引的左边层级更高

28、什么叫做最左原则

使用联合索引的时候,索引左边的条件不能丢,否则索引失效

29、mysql 的存储引擎指的是什么?

表的类型 数据存储的方式

30、比较一下常见存储引擎的优缺点

InnoDBMyisammemory维度
是否支持事务/性能
最差 硬盘中性能比 InnoDb要好 最好,数据存在内存中 性能
no yes no 全文索引
安全 不安全因为不支持事务 最不安全(内存,也不支持事务) 安全
yes no no 外键

31、说一下什么是临时表 ,什么是内存表 什么是视图

临时表:临时表不是程序员主动创建的,而是在执行操作的时候 在内存中生成的临时表 join , order by group by

临时表的生命周期 事务级别 完事了就从内存中销毁了

内存表 生命周期: 在一次进程(应用程序 开启 到 关闭的过程)中

引擎是memory 的表 生命周期是进程 只丢失数据 不丢失结构

视图: 视图只是一条预编译的SQL语句,并不保存实际数据

32、使用视图能提升查询的性能吗

不能

为了保证数据的安全

33、什么是索引

为了提升数据库查询效率的一种数据结构

34、怎样创建索引

create index 索引名 on 表名(字段)

35、索引的种类

主键索引: 建表的时候 主键自然形成主键索引

普通索引:CREATE index idx_bd1_name on big_data_1(name);

唯一索引:CREATE UNIQUE index idx_bd1_name on big_data_1(name);

组合索引: create index idx_bd1_name_age on big_data_1(name,age)

全文索引: 给你一篇文章 去查文章中的关键字

36、主键索引和唯一索引的区别:

主键不能为null 唯一索引可以为null

为了优化 一般都有设计为not null 能够设计为not null 一定要设计成not null

37、常见创建索引的原则

经常被查的

唯一

组合唯一

外键的表的关联字段

order by 字段

group by 字段

distanct 去重

49、索引的优缺点

优点:提升查询性能

缺点:占用内存空间

影响增删改性能,修改了任何数据还要修改索引树

39、索引和约束的区别

40、什么是外键约束

一个表的一个字段的取值 必须参考另外一张表

好处:数据的安全的合理

但是: 他大大影响数据库的性能

所以 以后在企业中 两张表之间不建立外键约束

41、哪些字段不用加索引:

数据重复且分布平均的表字段没有必要创建索引

42、聚簇索引 和 非聚簇索引

聚簇索引:主键索引

非聚簇索引:非主键索引

43、什么叫做回表

通过普通索引只是通过找到这个数据的主键

我们还要通过主键,去主键的b+树上找其他的数据,这就叫回表查询

44、覆盖索引:

避免回表查询,这个过程就叫覆盖索引

怎么做:复合索引

45、索引下推:

46、为什么主键索引比其他索引查询要快

因为非聚簇索引有个回表的过程,所以主键索引查询比其他的索引要快

47、为什么InnoDB 的表必须要有主键索引

因为innoDB是聚簇索引,数据和索引要在一个文件上

48、为什么InnoDB的主键索引 最好是自增长的

innodb的主键索引是聚簇索引,索引和数据在一起,这样添加的时候可以优化性能

49、什么是长连接,什么是短连接?

短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接 →数据传输 →关闭连接。

长连接是指程序之间的连接在建立之后,就一直打开,被后续程序重用。使用长连接的初衷是减少连接的开销,尽管MySQL的连接比其他数据库要快得多。

50、什么是慢sql 怎样查询慢sql

执行的慢的sql语句

查询:

  • mysql 本身的慢sql 日志文件

  • 监控程序

51、查询到慢sql 怎样分析

explian 执行计划分析sql语句为什么执行的慢

52、 什么叫做mysql的执行计划 怎样执行执行计划

优化器创建mysql的执行计划

53、执行计划一般看什么?

54、explain extra 中出现以下信息代表什么意思

55、出现了using where using filesort usingtemporary using join buffer 该如何优化

56、sql的having和where的区别

57、mysql大偏移量的时候怎么优化sql语句

58、怎么查看索引是否失效

59、什么情况下,索引会失效

  • like '%%'

  • or brtween 等带有范围的查询可能会让索引失效

    • 只要查询范围的累加,超过总数的一定比例这个时候使用全文检索和索引没有太大区别了,这个时候索引就失效了

  • where牵涉到了数据转型

    • 字符创不加引号

  • where牵涉到数据计算的时候

  • 最左原则,左边条件丢失,会索引失效

60、说出常见的mysql优化手段

在应用程序结构上对mysql进行优化

  • 加连接池

  • 加缓存

  • 加分表分库

  • 读写分离

  • 主从复制

  • mq削峰

在库表结构上对mysql进行优化

  • 创建索引

  • 禁用外键约束

  • 适当设计冗余字段,减少join

  • 能够not null 就不要null 至少也给个默认值

  • 能够char就不要varchar

  • 调整临时表的size,减少和硬盘交互

  • 时间 datetime 和timestamp 选后者

  • 浮点数使用bigdcimal

  • boolean可以使用枚举

  • 关闭查询缓存

sql语句优化

  • 活用索引,不让索引失效

  • 排序字段使用索引,避免using filesort

  • 使用覆盖索引,也是是复合索引避免回表查询

  • 分组和distinct字段使用索引,避免Using temporary

  • 从表字段添加索引,即外键添加索引,避免using join buffer

  • 使用limit分页时,偏移量太大,会太耗时,所以先通过子查询查询id,再通过id进行join查询

  • count(*)=count(1)=count(0)>count(主键id)>count(字段)

五、java核心基础

一、类加载

1、类加载器的作用

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口

2、什么是双亲委派模型

如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。当父加载器无法加载时,才会尝试自己加载

3、为什么需要双亲委派模型?

防止内存中出现多份同样的字节码文件

3、为什么要打破双亲委派模型,要怎样打破

为什么:由于加载范围的限制,顶层的ClassLoader无法访问底层的ClassLoader所加载的类。所以此时需要破坏双亲委派模型

打破:自定义类加载器继承 ClassLoader ,然后重写 ClassLoader 中的 loadClass 方法,并采用自己定义的类机制对类进行加载实现。

4、列举打破双亲委派模型的例子

实现类的动态加载

5、自己能不能开发一个java.lang.String

不能

Java的核心API都是通过启动类加载器进行加载的,如果别人通过定义同样路径的类比如java.lang.String,类加载器通过向上委托进行加载,那么最终被加载的应该是jdk的String类,而并非我们自定义的,这样就避免了我们恶意篡改核心包的风险

6、什么是机器码 什么是字节码

机器码:被硬件执行的代码

字节码:java代码被javac编译后生成字节码

7、类加载器有哪些,各有什么用

8、获得类的三种方式

二、JVM

1、JVM模型

image-20220918172054029

jvm内存模型中有程序计数器、堆、虚拟机栈、方法区、和本地方法栈五个部分

2、jdk1.7和1.8中jvm内存模型的区别

1.7中的方法区实现叫做永久代

1.8中方法区的实现叫做元空间

3、方法区中放的是什么

常量池、class文件、static、方法信息

4、哪些东西对于线程是共享的,哪些是独享的

线程私有:程序计数器、本地方法栈、虚拟机栈

线程共享:堆、方法区

5、程序计数器是用来干什么的

记录每一个线程执行到哪一行了

6、栈是不是越大越好,堆是不是越大越好

堆越大越好

栈不是越大越好,因为一个线程就分配一个栈,我们的物理内存是一定的,栈内存越大,可执行的线程数就会越少

7、Jvm的类加载机制

  1. 加载(Loading):将类的.class文件加载到内存中,并创建一个对应的Class对象。

  2. 验证(Verification):验证.class文件的正确性和安全性,包括文件格式、语义、字节码验证等。

  3. 准备(Preparation):为类的静态变量分配内存,并设置默认值。

  4. 解析(Resolution):将符号引用转换为直接引用,包括类、方法、字段等。

  5. 初始化(Initialization):执行类的初始化代码,包括静态变量赋值、静态代码块等。

三、面向对象

1、抽象类和接口的区别

抽象类:is a 代表这是一个什么

接口:has a 代表一种规范

2、什么是原子类?原子类的原理?原子的类的优点?原子类的缺点

原子类:java.util.concurrent.atomic包下的类

优点:在高并发下不用考虑并发带来的问题

拓展:为什么原子类会导致自旋?

底层有一个while循环,当对原子类进行高并发操作时,每一个需要改变原子类的线程都必须改变原子类的值之后,才能结束循环,否则就会一直循环,也就是自旋

缺点:自旋影响性能,会产生ABA问题

原理:CAS(比较和替换) + 自旋

3、aba是什么问题 怎样解决

ABA问题:也就是经过两次比较和替换,导致原本已经被改变的值,又回到了初始值,当后边的线程进行操作时,会认为没有被替换过,然后继续进行操作

原子类解决ABA问题的方法:使用原子引用类,原子引用类里面包含初始值和版本号,这样,当我们改变引用类里的初始值时,版本号也会随之改变

4、equals详解

当我们的子类没有重写equals 时,我们调用的时Object 的equals方法,只有判断两个引用类型的地址是否相同; 当我们的子类重写equals 时,如同String和 Integer 一样,判断的是内容是否相等,这里我们自己写,需要判断来对象地址是否相同,对象一致,内容自然也就是一样的,如果不是,我们就要判断传入的对象编译类型是不是同一个,若是直接调用属性判断两者是否一样,若不是,则通过向下转型,转为同一个编译类型(前提是在创建对象的时候,对象引用指向目标转换的类型),再进行比较

5、一个字符占几个字节?

一:在ASCII码编码方案中,一个英文字符占用一个字节,一个汉字字符占用两个字节的空间;

二:在Unicode编码方案中,一个英文字符或一个汉字字符都占用两个字节的空间;

三:在UTF-8编码方案中,一个英文字符占用一个字节,一个汉字字符占用三个字节的空间。

一个字节占8位

6、什么是字符流,什么是字节流

7、最有效计算2X8的方式

8、throw和throws的区别

四、集合

1、ArrayList的扩容机制

六、maven

1、你们公司使用的maven 版本

3.5.4

2、使用maven 经常遇到的问题有哪些 怎么解决的

  1. 因网络波动导致依赖文件下载失败,但开发工具却误以为下载成功,这时候项目运行就会报错,得去本地仓库删除未下载成功的文件,并重新下载

  2. 引入多个依赖导致jar包重复问题,由于重复jar包版本不一致,于是去掉低版本,保留高版本

3、什么是maven 的3大坐标

groupId :定义当前Maven项目隶属的实际项目

artifactId : 该元素定义当前实际项目中的一个Maven项目(模块)

version : 该元素定义了使用构件的版本

4、maven 中打包类型(项目类型)有哪些 请说出每一种打包类型的使用场景

类型场景
pom 聚合项目,管理其他项目的项目【整个工程的jar 以及 插件的版本】
war 在web容器中发布的项目(如tomacat下)
jar 提供jar 共别人使用【长期被认为 是提供给别人使用的一些包和类 现在也可以做成启动项目】

5、使用过哪些maven的插件

tomcat

6、请写出5条mvn 命令

  • mvn clean

  • mvn package

  • mvn install

  • mvn deploy

  • mvn -v

7、操作系统环境变量中,配置path的作用

操作系统配置path 的作用 ,就是让path下的可执行的命令 可以在任何路径下被使用

8、maven 依赖的的jar 有哪些scope 的取值 分别代表什么意思

scope周期
compile 默认值,适用于所有阶段(开发、测试、部署、运行)
provided 只在编译,测试,运行阶段使用,部署上线的时候,不需将依赖的jar包打包到项目工程里,因为上线的服务器中会提供这个jar
runtime 只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test 只在测试时使用,用于编译和运行测试代码。例如junit.jar。
system Maven不会在仓库中中查找对应依赖,在本地磁盘目录中查找。适用编译、运行和测试阶段,它与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath指定本地jar文件路径,所以该scope是不推荐的。

9、maven 中依赖传递指的是什么 具体说出每一种scope依赖能否传递

依赖传递:A项目依赖B,B项目依赖了C,则A项目对C项目的依赖就是通过依赖B项目传递的,也就是依赖传递

  • 当B对C的依赖的scope是test或者provided,则A不依赖C。

  • 当B对C的依赖是scope是runtime、system或者compile,则A依赖C。且传递依赖的scope的规则:如果A对B的依赖是compile,那么A对C的依赖和B对C的依赖相同,否则和A对B的依赖保持一致。

10、你们公司使用maven私服吗 使用什么产品 什么版本

nexus

11、maven 私服的仓库类型

hosted proxy ground

12、什么是MAVEN

maven项目管理工具

13、display,pagckage,install

package: 打包不发布

install:打包并发布到本地仓库

display:打包并发布到企业仓库

七、git

1、什么是git

Git 是一个开源的分布式版本控制系统

2、git常用指令

  • git init

    新项目执行Git初始化,并进行第一次提交

  • git add .

    添加指定目录到暂存区,包括子目录

  • git commit -m "提交内容备注"

    将暂存区内容添加到本地仓库中

  • git status

    查看当前分支状态

  • git reflog

    查看所有分支的版本和所有操作记录

  • git reset --hard 要回退的版本号

    回退到某个版本

  • git branch [***]

    新建的分支名 新建分支

    -a 查看所有分支信息

    -d 本地分支名 删除本地分支

  • git checkout 分支名

    切换分支

3、你们公司里面使用什么版本管理工具

git

4、git 和 svn的区别

git:分布式的

svn:非分式 没有本地仓库

5、使用git 的时候什么时候会可能产生冲突 产生冲突了怎么办

合并时,如果多条分支修改了同一文件的同一行,则会产生冲突

解决办法:与分支负责人进行商量,最后通过项目经理修改提交一个可用版本

6、你们使用git在哪个分支上开发

在自己的分支上开发,开发完成进行合并

7、描述一下平时怎样使用git 工作

  1. 每天从远程仓库中拉取最新主分支

  2. 通过主分支创建自己的分支

  3. 在自己的分支上进行开发操作

  4. 开发完成进行上传提交到本地仓库

  5. 上传到远程仓库前拉取最新主分支进行合并操作

  6. 合并完成不产生冲突,就上传到远程仓库

  7. 组员删除本地分支,组长合并项目后,删除远程仓库其他分支

8、什么是深拷贝什么是浅拷贝

深拷贝:可以拷贝基本类型,也可拷贝引用类型

浅拷贝:只能拷贝基本类型

八、Mybatis

1、${} 和 #{}的区别

Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值

Mybatis在处理${}的时候就是把 ${}替换成变量的值,调用Statement来赋值

简单来说:#{}是PreparedStatement ${}是Statement

2、什么是sql注入攻击

SQL注入攻击是利用是指利用设计上的漏洞,欺骗服务器执行恶意的sql语句

3、为什么PreparedStatement可以防止sql注入攻击

因为sql语句是预编译的,而且语句中使用了占位符,规定了sql语句的结构。 用户可以设置"?"的值,但是无法改变sql语句的结构

4、什么是orm

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据

5、mybatis 是一个什么样的框架

MyBatis 是一个开源、轻量级的数据持久化框架

MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身

MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现

6、mybatis 和 hibermate的区别

  • hibernate:全自动映射 ORM框架,扩展性强,不需要自己手动去写SQL语句 但是sql都是自动生成的,无法直接维护sql

  • mybatis:半自动ORM框架,需要自己手动去写SQL语句 可以优化sql语句,灵活性更高

7、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?

原理:动态代理

Dao接口,就是maven中的Mapper接口,每个mapper接口都会有一个mapper.xml文件与之对应,xml文件中mapper标签中的namespace的值就是mapper接口的全类名,xml文件中每一个sql语句的实现,都会有一个MappedStatement与之相对应(也就是select和update标签),标签的id就是mapper接口中的方法名,接口方法内的参数,就是传递给sql语句的参数

Mapper接口是没有实现类的,当调用接口方法时,通过xml文件中的namespace的接口全限类名+id中的接口方法名拼接字符串作为key值,可唯一定位一个MappedStatement

Mapper接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理proxy对象,代理对象proxy会拦 截接口方法,转而执行xml文件中MappedStatement所代表的sql,然后将sql执行结果返回

8、Dao 接口里的方法参数不同时,方法能重载吗?

不能

因为Mapper接口中的每一个方法都有唯一的MappedStatement与之对应,方法名唯一,所以不能重载

9、什么是mybatis的接口绑定,接口绑定的几种方式

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 当我们需要执行sql语句时我们直接调用接口方法就可以了

注解绑定:就是在接口的方法上面加上@Select、@Update等注解,里面包含Sql语句来绑定

xml配置文件绑定:在xml映射文件里面写SQL语句来绑定,在这种情况下,要指定xml 映射文件里面的namespace必须为接口的全路径名,每个sql语句的id要与Mapper接口中的方法名对应。

10、分析一下 mybatis xml配置和注解配置

当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

11、mybatis 在mapper中如何传递多个参数

方法1:顺序传参法

public User selectUser(String name, int deptId);

<select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{0} and dept_id = #{1}
</select>

#{}里面的数字代表你传入参数的顺序。

方法2:@Param注解传参法

public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);

<select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}里面的名称对应的是注解 @Param括号里面修饰的名称。

方法3:Map传参法

public User selectUser(Map<String, Object> params);

<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}里面的名称对应的是 Map里面的key名称。

12、什么是数据持久化

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作

13、说一下什么是resultmap 什么是resulttype

resultmap:结果集映射

resulttype:结果集类型

作用:数据库列名和实体类名对不上号的时候使用

14、列名和实体类的变量名不一样的时候怎么办

  • 通过mapper.xml中的resultmap统一定义对应关系

  • 配置驼峰和下划线的映射

  • 在sql语句中起别名,与类的属性名一一对应

  • 通过参数标签@Param直接返回map

15、mybatis有几种分页方式

  1. 自己写分页逻辑

  2. rowbounds 一次性把结果都查到内存中,再在内存中分页

  3. 分页插件

16、mybatis 分页插件的原理

实际上是一个拦截器,拦截器的原理是面向切面AOP

拦截器的底层原理是动态代理

17、动态代理的原理

proxy

18、缓存作用

  • 提升性能

  • 提升速度

  • 保护数据库

19、什么是动态sql

动态SQL就是根据传入的变量值进行逻辑操作,并动态拼接,方便实现多条件下的数据库操作

20、什么是缓存 缓存的作用是什么 你们项目中使用到缓存的场景

概念:缓存是存在于内存中的临时数据。

缓存是数据交互的缓冲区域,简称cache,当某一个硬件想要读取数据时,会首选从缓存中获取数据,有则直接执行,或者返回,如果没有,去内存中获取。如果内存中也没有,就会去数据库进行查询

作用:缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能

21、什么是mybatis的一级缓存 什么是二级缓存

一级缓存:作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取

二级缓存:缓存在硬盘中

22、什么是嵌套查询

查对象的时候 查出相关联的对象

23、什么是懒加载 什么是及时加载

懒加载:嵌套查询的时候,一开始只查询自己,在使用的时候才会二次查询跟他相关联的对象

及时加载: 嵌套查询的时候,把自己和相关联的对象一股脑全查出来

24、mybatis 和 hibernate的区别

hibnate:利于移植 扩展 全orm

mybatis:不利于移植,但是可以灵活的操作sql[调优]

25、为什么有了一级缓存,还要二级缓存

因为一级缓存的生命周期太短,他是事务级别的缓存,随着事务的结束而关闭,无法起到保护数据库的作用

二级缓存是进程级别的缓存,只要程序不结束,缓存就会存在

26、二级缓存的内存淘汰策略

fifo:先进先出

LRU:时间热度

LFU:次数热度

九、设计模式

1、单例模式的特点

保证这个对象在jvm中只有一份

2、单例模式的分类及区别

饿汉式:程序一启动就会生成这个唯一对象(static 代码块生成)线程安全

懒汉式:使用类的静态方法时生成唯一对象(静态方法生成)线程不安全

3、静态代理的缺点

会造成代理类过多,不好管理

静态代理种类:

  1. 接口方式:target和代理类实现同一接口

  2. 继承方式:代理类是target的子类

4、动态代理实现方案

  1. jdk自带代理工厂:target和代理类实现同一接口

  2. cglib第三方代理工厂:代理类是target的子类

5、什么是代理模式

6、设计模式六大基本原则

单一原则

开闭原则

里氏替换原则

依赖倒置原则

迪米特原则

接口隔离原则

十、数据结构

一、Hash

1.什么是hash算法

散列算法

作用:快速存取

2. 一个对象默认用什么作为hashcode

用在内存中的地址作为hashcode

3. 以下哪些话是对的,为什么

  1. 两个对象如果用equals 比较相等,那么这两个对象必须有相同的hashcode 对的

  2. 如果两个对象用equals比较不想等,那么hashcode 也要不想等 错的

    如果两个对象用equals比较不想等,那么hashcode可以相等,可以不相等

  3. 如果两个对象Hashcode 相等,equals可以不想等 对的

4. HashSet 或者 HashMap 是怎样判断两个对象是否是同一对象的

首先比较hashcode 然后再用equals比较链表上的对象,如果产生hashcode碰撞,equals比较也相等,那么hsahmap就会认为这两个对象是同一对象,不会放进去

5. 一个对象放到HashMap 中的过程

首先,用hashcode来计算数组的下标,如果数组中已经有值了,相当于产生了hash碰撞,那么在再用equals比较对象是否相等,如果不同,则放入当前坐标下的链表中,如果equals比较也相等,那么hsahmap就会认为这两个对象是同一对象,不会放进去

6. HashMap 和 hashSet的数据结构

hashmap:数组 + 链表

hashSet:是hashmap的key部分

7. 什么叫做Hash碰撞

hashcode计算出相同数组下标

8. 怎样优化HashMap

增加数组的长度,减少hash碰撞

9.什么是HashMap的扩展因子,为什么扩展因子是0.75

正好找到hash碰撞和内存占用的折中值

10. HashTable,HashMap,和concurrenthashmap的原理和数据结构和区别

HsshTable:线程安全

Hashmap:线程不安全

11. HashMap 1.7 和 1.8的区别

12. 使用HashSet 或者 HashMap 什么情况下可能照成内存泄漏

如果我们重写了hashcode和equals 把这个对象放入hsahmap或hashset之后,再改变了这个类的某个成员的值,导致hashcode值变化,hashmap找不到该对象,就会造成内存泄漏

13. 什么是内存泄漏,什么是内存溢出

内存泄漏:用完的对象已经变成垃圾了,但是回收不到

内存溢出:直到我们以后要分配新的对象内存,但是又没有内存分配了,就叫内存溢出

14、为什么我们重写了equals就必须重写hashcode

1.提高效率。hash类型的存储结构,添加元素重复性校验的标准就是先取hashCode值,后判断equals()。重写后,使用hashcode方法提前校验,可以避免每一次比对都调用equals方法。

2.保证是同一个对象。如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

15、ConcurentHashMap的原理

分段锁,把底层数组分成16段,在其中一段中操作时,只在这一段枷锁,其他部分可以继续操作

16、ConcurentHashMap 1.7 和 1.8 的 区别

1.7 分段后是链表 时间复杂度是O(n)

1,8 分段后是平衡搜索二叉树 时间复杂度 log2n 原理是cas+sync

17、verctor ArrayList CopyOnWriteArrayList 的区别

verctor:在读写操作中加了锁,线程安全但是性能低

ArrayList:不安全但是性能好

CopyOnWriteArrayList 性能可以 保证安全 写加锁,读不加锁

18、说说可能会发生java.util.ConcurrentModificationException的场景

并发修改异常 多线程操作线程不安全的集合时产生

19、说一下hashset和hashmap的数据结构

20、ArrayList的初始化容量

ArrayList是Java中一个动态数组类,它的初始化容量默认为10

可以使用带有参数的构造函数来指定初始容量

ArrayList<String> list = new ArrayList<>(20);

21、ArrayList的扩容机制

当向ArrayList添加新元素时,如果当前ArrayList的大小已经达到了其容量限制,ArrayList会自动进行扩容,将容量增加50%。

ArrayList会创建一个新的数组,将原有数组中的元素复制到新数组中,并将新元素添加到新数组的末尾。新数组的容量为原有数组容量的1.5倍。

22、HashMap可以存放建值都为null的元素吗

HashMap可以存放key和value都为null的元素。

HashMap中每个键值对都是由一个键对象和一个值对象组成的,这两个对象都可以为null。如果将一个键映射到null值,则在HashMap中就会存储一个键为null,值为null的键值对。

需要注意的是,在HashMap中只能有一个键为null的键值对,因为键必须唯一。

十一、Spring

1、spring是什么框架

管理框架[容器]:管理bean 的 生命周期(创建 初始化 形态【单例和多例】 销毁)

核心特点:ioc、AOP

2、spring 是什么 使用它的优点是什么

优点:像胶水一样 把符合java 规范的产品 融合在一起

低耦合,高复用,代码污染低

3、什么是ioc 什么是di

ioc:控制反转,把创建对象的权利交给spring容器来实现

di:依赖注入,在Spring创建对象的同时,为其属性赋值

4、常见的di 方式有哪些

  1. 构造方法注入

  2. 属性注入

  3. 接口注入(用于注入复杂引用类型,如自定义对象等)

5、什么叫做循环依赖

A的Bean有B成员属性,B的Bean有A的成员属性

解决循环依赖:三级缓存

6、怎样给bean 注入一个集合类型的值

注入list 和 set

<property name="testList">
   <list>
       <value>1</value>
       <value>3</value>
   </list>
</property>

注入map

<property name="testMap">
   <map>
       <entry key="k1" value="v1"/>
       <entry key="k2" value="v2"/>
   </map>
</property>

7、spring bean 的作用域

单例bean

多里bean

8、spring bean 的生命周期

创建、set方法注入、初始化、销毁

9、BeanFactory 和 ApplicationContext 和 ClassPathXmlApplicationContext 和 AnnotationConfigApplicationContext 和 webapplicationcontext 的关系

BeanFactory 最上层 接口

**ApplicationContext** 子接口

区别:

  1. BeanFactory 是 ApplicationContext 的父接口

  2. BeanFactory 产生的bean默认是懒加载的,ac 的bean 是及时加载

  3. ac 的bean 支持aop

  4. ac 的bean 支持国际化

ClassPathXmlApplicationContext: 通过xml配置的spring容器

AnnotationConfigApplicationContext:通过注解配置的spring容器

webapplicationcontext:bean容器 依赖web存在

10、BeanFactory 和 FactoryBean 的区别

BeanFactory:创建规范的bean,有构造方法

FactoryBean:创建一些复杂的bean,有自己的初始化方法

例子:mybatis中的mapperbean

11、@Component、@Controller、@Repository、@Service的区别

@Component:注解方法配置普通bean

@Controller:注解方法配置控制层bean

@Repository:注解方法配置持久层bean

@Service:注解方法配置业务层bean

12、@autowired和@resource的区别

都是依赖注入

@autowired:通过类型注入

@resource:通过名字注入

13、@postconstruct注解 的作用是

配置init-method

调用构造方法创建bean之后,调用init方法

14、spring ioc 实现的原理(实现机制)

工厂方法 + 反射

15、什么是springAOP,什么时候用它?

AOP:面向切面,spring两大特点之一

作用:进行公共增强操作

16、springAOP的底层原理

动态代理,springAOP默认的动态代理用的是jdk的代理工厂

17、spring整合mybatis的四个步骤

  1. 把数据源配置成bean

  2. 把spring自带的session工厂配置成bean

  3. 配置mapper扫描bean,扫描mapper接口

  4. 把事务切面配置成bean

18、target,aspect joinpoint pointcut weaving advice proxy 分别指的是什么

target:目标

aspect:切面

joinpoint:特指具体进入的切入点

pointcut:泛指满足条件的就是切入点

weaving:织入

advice:增强

proxy:代理

19、aop 中 advice 的 5种类型

  • 前置

  • 后置

  • 环绕

  • 异常

  • 正常

20、spring 的 aop 的原理是默认用什么方式实现的

springAOP默认的动态代理用的是jdk的代理工厂实现

21、怎么实现spring 动态代理的切换方式

spring4.0在xml文件中配置代理自动切换,5.0不用配置,自动切换

22、你们的项目中 使用到aop 了没有,说一说使用的场景

  • 自定义事务注解,加上这个注解的方法,就会进行事物的增强

  • 权限验证

  • 重试

23、事务的传播行为

image-20230104113219274

24、什么叫做指令重排序

java编译器和处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是他会保证执行结果和原本的执行结果一致

25、指令重排序会带来什么问题

在java内存模型中,允许编译器和处理器对指令进行重排序,重排序过程不会影响单线程程序的执行,但会影响多线程并发执行的正确性,也就是我们常说的有序性问题

26、请说说volatile变量的作用

  • 能够保证可见性

  • 保证有序性

  • 禁止指令重排序

  • 不能保证原子性

voliatile 标明这个变量不稳定 不要去优化他

27、spring 中事务管理的类型和优缺点

  • 编程式事务 自己开链接 关连接 回滚 commit

  • 声明式事务: (xml 注解)aop

28、spring 事务注解 @Transactional 中以下几个属性分别代表什么意思

  • readOnly:该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false

    例如:@Transactional(readOnly=true)

  • rollbackFor:该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

    例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

    指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

  • timeout:该属性用于设置事务的超时秒数,默认值为-1表示永不超时

29、spring用到了哪些设计模式

代理模式

适配器模式

策略模式

模版模式

工厂模式

单例模式

十二、SpringMVC

1、springmvc工作原理

  1. 所有请求都发给DispathcherServlet

  2. 通过HandlerMapping 找到handler 这个handler就是controller中的方法

  3. 通过HandlerAdapter 适配器执行 handler 因为每个handler的返回值和参数都不一样

  4. 返回modelandview

  5. 通过视图解析器解析modelandview

2、mvc指导思想

页面和逻辑分离

m:model数据

v:view jsp视图

c:controller:逻辑

3、springmvc是什么?

实现了mvc模式的控制层框架

4、说出spring的7大核心模块

core、context、web、mvc、aop、orm、dao

5、springmvc 和 struts的区别

最大区别:controller 是 单例还是多例

springmvc:controller是单例的

struts:controller多例,性能比较低

7、servlet struts2 springmvc 谁是线程安全的

springmvc线程不安全

struts线程安全

8、请说出@ResponseBody 注解的原理

将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。

原理:AOP

9、什么是javascript 的跨域问题

跨域问题:不允许js跨服务器获取数据

10、请说出常见的3种解决跨域问题的方案 以及每个方案的原理是什么

解决方案:

  1. cross:同源策略

    后端通过response的头设置可以获得数据的域

  2. jsonp = json+packpage

    原理:走规则的空子,把json包装返回来,包装成一个javascript的函数

    后端:把json包装成jsonp

    前端:解开json

  3. 代理服务器

    通过代理服务器访问数据

11、springmvc 拦截器和过滤器的区别

拦截器,类似于Servlet开发中的过滤器Filter,都是用于对处理器进行预处理和后处理。

过滤器和拦截器区别 过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

拦截器:是一个spring组件,由spring容器管理,不依赖于tomcat,可以单独调用,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。

12、mybatis 分页插件的原理

拦截器

13、MySQL分页在大数据量下如何优化

14、@ControllerAdvice 与 @ExceptionHandler 的注解的意思是

@ControllerAdvice:标注在类上,对controller层的增强,用于异常统一处理

@ExceptionHandler:标注在方法上,声明会被捕获的异常类型

15、springmvc 统一异常处理的原理是什么

dao层异常,不处理,抛给service,不处理,抛给controller层,还是不处理,交给同一的异常处理类

16、说出springmvc 中创建拦截器的过程

十三、Springboot

1、springboot 的 优点是?特点是?

优点:快速开发

特点:大量自动化配置,简化开发工程

内嵌tomcat整合docker简化部署

大量的监控程序,简化运维

2、你们公司使用springboot 的版本

2.1 2.2 2.3

3、springboot 的3种启动方式

  • 使用主程序启动

  • 作为mvn启动

  • 打成jar包后在cmd命令行中启动

4、解释以下注解的作用

  • @ConfigurationProperties:整体读取自定义配置

  • @PropertySource:导入外部properties配置文件

  • @ImportResource:导入外部bean.xml配置文件

  • @Import:导入外部bean.class 配置类文件

5、你们公司中都有些什么样的环境

dev

test

prod

预生产环境

6、springboot 怎样配置环境

每一个环境都有一个配置文件,通过spring.profiles.active激活

7、springboot 怎樣整合過去的項目

使用@import({xxxx.class})导入配置类

使用@ImportResource("classpath:beans.xml")

8、請説出@SpringbootApplication 注解的作用

@SpringbootApplication注解包含:

@ComponentScan 扫苗主包下的@bean 如果bean不再主包下 通过@Import导入

@EnableAutoConfiguration 把工程中导入spring-boot-stater-** 下 mete-inf/spring-factorys中描述所有的需要自动配置的类 做自动配置

@SpringBootConfiguration 代表主类是一个配置类 我们可以在主类中配置bean

9、swagger 的作用是什麽

制作接口文档、自测方法

10、什麽是日志系統 ,他的作用是什麽

运维时候 找问题

大数据: 收集用户信息

11、請説出一下幾個東西的關係 slf4j log4j logback

slf4j是java的一个日志门面,是一种接口,实现了日志框架一些通用的api

log4j:是已经实现得日志框架

logback:也是一个日志框架,springboot默认

12、日志的級別有(从低到高)

级别越低,显示日志越多

ALL:最低等级的,用于打开所有日志记录

TRACE:追踪级,用于展现程序执行的轨迹

DEBUG:调试级,用于开发过程当中打印一些运行信息

INFO:普通级,突出强调应用程序的运行过程。打印一些重要的信息,这个能够用于生产环境中输出程序运行的一些重要信息。

WARN:警告级,表明会出现潜在错误的情形

ERROR:错误,表明出现了系统错误和异常

FATAL:严重错误,指出严重的错误事件将会导致应用程序的退出

OFF:最高等级的,用于关闭所有日志记录

13、什么是springboot自动配置,自动配置的原理是什么

自动装配就是spring容器启动后,一些自动配置类就自动装配的IOC容器中,不需要我们手动去注入

SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。

老师版本:

作用:自动配置bean 通过 @EnableAutoConfigation 声明该类可以被自动配置

在依赖的包下的 meta-inf清单下的spring.factoiies 文件下 声明要自动配置的bean ,spring启动时就会自动配置这些bean

14、简述手写stater的过程

  • 创建start,写好被外部使用的类

  • 写配置类,配置bean

  • 在resources/META-INF/下创建spring.factories文件,描述哪些类会被自动装配

15、Springboot的注解

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean) @ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean),该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类; @ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean) @ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean), 该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如@ConditionOnMissingBean(name = “example”),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。 @ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean) @ConditionalOnNotWebApplication(不是web应用) @ConditionalOnProperty是指在application.yml里配置的属性是否为true,其他的几个都是对class的判断

16、描述一下springboot项目启动的过程

十四、Vue

1、什么是nodejs 起什么作用

javascript引擎,跳出浏览器框架,自己执行

2、什么是npm 说出3个npm 常见的命令

npm install init uninstall

3、npm install 命令中 -g -s -D 的意思是什么

  1. npm install module_name -g (全局安装)

  2. npm install module_name -D (开发时要用)

  3. npm install module_name -S (发布生产时要用)

5、ecmascript 和 javascript 的关系是什么

ecmascript:规范

javascript:实现

6、babel 插件的作用是什么

转码

7、es6中 模块化编程是什么意思 简述一下使用的过程

import:导入

export:导出

代码重用

8、jquery 中的常见选择器

  • ID选择器 $("#id")

  • 全选选择器 $("*")

  • 类选择器 $(".class")

  • 标签选择器 $(“div”)

9、解释比较mvvm mvc orm

m:数据

v:视图

特征:双向绑定,影响视图就会影响数据,影响数据也会影响视图

10、常见的mvvm 框架有哪些

vue,react、avalon、angular.js

11、v-if v-show 指令的区别是

v-if:控制是否创建

v-show:控制是否显示

12、v-model v-bind 指令的区别是

v-model:双向绑定 只能修改value属性的值

v-bind:单向绑定 可以省略成:且可以改变其他属性的值

13、什么是事件对象 怎样获得事件对象 事件对象可以干什么

每一次触发的事件,都会封装成事件对象

事件绑定的函数的第一个参数可以获得事件对象

event可以结合函数一起使用,函数不会在事件发生前执行

14、vue 中 计算属性 和 方法的区别是什么

计算属性,开销小

计算属性,加载过一次后,就会放入缓存,如果值没有变化的话,就不会再次加载,

15、jquery 中 $(document).ready() 是个什么函数?为什么要用它?

是页面加载函数,等到页面加载完了再回调的函数

16、JavaScript window.onload 事件和 jQuery ready 函数有何不同?

image-20230203092507329

17、jquery 中 如何找到所有 HTML select 标签的选中项? [选择器]

18、jquery 中 $(this) 和 this 关键字在 jQuery 中有何不同?

19、使用 CDN 加载 jQuery 库的主要优势是什么 ?

静态资源加速

20、jQuery.post() jQuery.get() 和 jQuery.ajax() 方法之间的区别是什么?

21、说出10个jquery 的 选择器

  • 标签选择器 例:div{}

  • 类选择器 例:.classname{}

  • id选择器 例:#idname{}

  • 全选择器 例:*{}

  • 后代选择器 例:div span 后代所有的span

  • 子选择器 例:

22、哪种方式更高效:document.getElementbyId("myId") 还是 $("#myId")

document.getElementbyId("myId") 更高效

doc直接调用javascript引擎

jquery方式底层就是doc,不过还包装了一层

23、说一下 vue中父传子的过程

自定义属性 父传子

24、说一下vue中子传父的过程

自定义事件 子传父

  1. 在父组件中引入子组件(父组件内)

  2. 自定义一个方法,用于触发传值事件(子组件内)

  3. 在方法中自定义传值事件this.$emit("第一个参数为自定义方法名",第二个参数为需要传递的值)

  4. 在父组件定义一个自定义方法接收子组件传递过来的事件(父组件内)

25、axios的特点有哪些

  • 是一个异步请求框架

  • promise api

  • 拦截请求和响应

  • 防止 XSRF 攻击

  • 转换json格式

26、put delete post 请求 往后端传json对象的时候要怎么处理

json对象 后端 @RequestBody 参数类型body

27、vue中路由起什么作用

路由:根据请求的路径按照一定的路由规则进行请求的转发从而帮助我们实现统一请求的管理

用来在vue中实现组件之间的动态切换

设定全局路由守卫

28、@RequestBody,@RequestParamter,@RequestHeader ,@RequestArribute到作用域中取这4个注解的区别和作用

描述从哪里获得参数

  • RequestBody 从请求体

  • RequestParamter 网页路径

  • RequestHeader 从请求头中

29、request.getParamter 和 request.getArribute 的区别

  • request.getParamter用于前后端分离的跨服务器数据交互

  • request.getArribute用于在站内进行数据交互

30、说出10个request 中常见的方法

31、你们公司中使用什么技术 上传 下载 处理 excel

  • apache poi

  • alibaba easyexcel

32、如果不使用 第7题说的技术 使用原生的response 怎样下载excel

  • 使用response 该变响应格式

  • response.setContenType() 改变响应的内容的类型

33、Vue的路由实现:hash模式 和 history模式

hash 路由模式是这样的:http://xxx.abc.com/#/xx。 有带#号,后面就是 hash 值的变化。改变后面的 hash 值,它不会向服务器发出请求,因此也就不会刷新页面。

  • 优点:hash模式兼容性很强,刷新浏览器,页面还会存在

  • 缺点:地址栏不优雅,有#存在,不利于seo,记忆困难

history模式它是一个浏览器(bom)的一个接口,在window对象中提供了onpopstate事件来监听历史栈的改变,只要历史栈有信息发生改变的话,就会触发该事件

  • 缺点:history模式,兼容性较差,刷新页面,页面会404,需要服务器端配置支持

  • 优点:地址栏更优雅,方便记忆,有利于有seo

34、Vuex是什么?怎么使用?那种功能场景使用它

状态组件

使用:为了保存组件的状态

作用:做缓存使用,保存用户登录信息

35、Vuex中actions和mutations的区别

同步和异步

mutations:同步

actions:异步

36、vue的8个钩子函数(生命周期)

十五、安全性问题

1、请说一下常见的加密算法 和 使用场景

不可逆加密:md5

对称加密算法:私钥加密,私钥解密

非对称加密算法:私钥加密,公钥解密

jwt是令牌,不是加密算法,而是需要使用加密算法进行加密

2、https 与 http 的区别

https:安全,因为请求加了密,使用了非对称加密算法

http:不安全

3、什么是jwt,jwt由哪三部分组成

  • 头:加密算法

  • 载体:信息

  • 脚:签名

4、什么是单点登录系统,单点登录系统怎样实现

在一个系统登录了之后,就能访问其他受信任的系统

实现方式:邓丽成功之后 把当前用户的信息 加密成jwt 放在前端 前端以后每次请求都会携带jwt 在其他系统中能够解密 就说明。。。。。。

用户的登录的信息 保存在缓存种 (redis)

5、分布式情况下 你们项目怎样实现session 共享

  • 基于Nginx的ip_hash负载均衡

  • 基于tomcat的session复制

  • 使用Redis做缓存session的同一缓存

  • 结合cookie,把session放到cookie中去

6、前后端分离的情况下 你们项目怎样实现session 共享

  • 使用ajax

  • 使用同源策略

7、怎样防止sql注入攻击

使用预处理

8、什么是rbac,请说出rbac的表设计

权限控制

9、你们公司怎样做权限控制的

权限码,aop,aop+filter,shiro

10、什么是aop 用aop干什么?原理是什么? 项目中哪些地方使用到了aop

aop是面向切面编程

我们用aop来实现对事务的公共增强

原理是动态代理

springboot默认的代理模式是jdk1.8自带的代理工厂

我们的权限校验,以及对事务的读写操作添加提交和回滚,@Responsebody

11、什么是xss攻击 怎样防止

javascript : 跨站脚本攻击 前端插件

12、什么是csxf攻击 怎么防止

跨站请求伪造: token 前端保存令牌

十六、Linux

1、云服务的特征是什么

按需收费,隔离

2、虚拟机和 容器化的区别是什么

3、docker 中 容器 镜像 仓库的概念 分别是什么

4、写出至少10个docker 命令

5、如何查看镜像支持的环境变量,怎样设置环境变量

6、什么是虚悬镜像,如何批量清理临时镜像文件?

docker image prune 命令可以清理所有虚悬镜像

 

7、如何停止所有正在运行的容器?

8、如何清理批量后台停止的容器?

9、可以在一个容器中同时运行多个应用进程吗?

10、Dockerfile 中 Add 与 copy的区别是什么

copy 把宿主机的文件copy容器中

add 可以指定网络上的某个文件到容器中

11、Dockerfile 中 CMD 与 ENTRYPOINT 的区别是什么

12、你怎么理解springboot 和 云服务天然集成这句话的

13、docker的工作原理

15、linux 的优点

稳定 安全

16、什么是linux的内核版本 什么是发行版 有哪些常见的发行版

centos

17、mkdir -p 和不带 p 的区别

是否递归创建多级子目录

18、有 wasup 和 oracle 用户属于 users组

19、查出占用了11111端口的进程 并且杀死用什么命令

netstat -naop |grep 11111

kill -9 进程id

20、请写出至少5个maven 常见命令

maven:package install deploy test clean

21、使用maven 中常见的问题有哪些 怎么解决的

网络波动导致下载失败,删除本地仓库的依赖

依赖传递导致版本冲突,删除低版本,留下高版本

22、请写出至少5个git 命令

git add commit remote branch clone push

23、使用git 中 2个人产生冲突的原因是什么 怎么解决的

24、你们公司中是怎样使用git 管理代码的

25、说出以下命令的作用

ls:

cd:

cp:

mv:

mkdir:

vi:

find:在当前文件夹下,找指定名字的文件或文件夹

tar:

chkconfig:

service:

cat:

less:

tail:

十七、redis

1、redis 是什么

key-value 的nosql

nosql:非关系型数据库

2、redis的优点

性能强悍,用内存存储数据,且是nio epoll的多路复用模型

让一个线程可以处理多个请求

4、为什么redis是单线程的 可是效率那么高

nio的多路复用模型,数据写在内存里

5、你们项目中哪些地方用到了redis

做高速缓存 计数器 实时排行榜 分布式锁 单点登录系统

6、redis 的5种基本类型是..请说说5种基本类型的使用场景

7、spring data redis 的常见序列化方案 和 默认的序列化方案是

string jdk json 默认:jdk

8、怎样保证缓存和 数据库中的数据一致【 怎样保证 缓存和数据库的双写一致】

redis和mysql不是同一个数据库,不可能强一致

适合经常读,不经常写的数据

延时双删

  • 方案一:由缓存的调用者在更新数据库的时候同时更新缓存

  • 方案二:将缓存和数据库整合为一个服务,由该服务来维护一致性。对外提供接口,调用者调用该服务提供的接口,无需关心缓存一致性问题

  • 方案三:调用者只操作缓存,由其他线程异步将缓存数据持久化到数据库,保证最终一致性。

9、redis 的持久化策略有哪些 项目中怎样选择

rdb:二进制数据 没那么重要的数据,用rdb持久化 缓存

aof:文本数据 重要的数据,用aof持久化 实时排行

项目中rdb aof一起使用

10、redis 的过期key 删除策略是什么

及时删除:每个一段时间,线程会去扫描部分key 看是否过时,过时的话就删掉

惰性删除:使用key之前,先看这个key是否过期,过期了就删除

11、为什么明明所有的key 已经过期,但是还占着内存

12、redis的缓存淘汰策略是什么,有哪些常见的淘汰策略

一般电脑32g内存 给10g给redis

默认:拒绝抛出异常

lfu:allkey(所用key中,使用次数最少的被淘汰)ttl(只在设置了过期时间的key中,选择使用次数最少的淘汰)

lru:allkey(在所有keyall中,选择最久没有使用过的淘汰) ttl(在设置了倒计时的key中,选择离现在最久的淘汰)

random:allkey ttl

ttl:生存时间最短的淘汰

13、lru 和 lfu 指的是什么,描述一下 怎样实现lru 和 lfu 算法

14、什么是缓存击穿 怎样防止

特征:数据库中有,但是缓存中没有,不凑巧,正好大量的并发操作来访问这个数据

防止:问题:一出来就是高峰,解决:缓存预热

问题:原来有,后面过期了 解决:设置数据永不过期 互斥锁

15、什么是缓存穿透怎么防止

数据库中没有这条数据,缓存中也没有这条数据

解决方案:1、就算数据库中没有,也在缓存中创建一个这样的key

2、过虑:把所有可能存在缓存中的集合里占的空间要最小

查询要够快

布隆过滤器:bit集合 + hash算法 占用内存少 高速查询算法

16、什么是缓存雪崩 怎样防止

大量的key同时过期

防止:1、设置key永不过期

2、设置key的过期时间错开

3、互斥锁

17、什么是缓存倾斜

缓存中存在这个key,但是由于这个key突然成为高热点key,(比如明星出轨),这样导致大量的用户突然高并发的访问这个高热点key所在的那台缓存服务器,最终导致那台缓存服务器崩掉,继而请求又到达下一个缓存服务器,下一个缓存服务器又承受不住而崩掉,最终导致整个缓存模块崩掉。

使用hash 一致算法,把缓存平均分配到不同的节点

bigkey带来的缓存倾斜:用string存文章

list超过1万 把集合平均分配

如何解决bigkey问题:key:文章 问题,不用redis,使用文档型的nosql(mongoDB)

hash槽:

18、redis 的部署架构有哪些 方便用在什么样的场景

单机:开发

主从:高并发 读写分离

哨兵:高可用

集群:海量数据

19、为什么redis的集群架构中 主节点的数量要是单数

20、简单说一下redis-cluster里面选举投票机制

21、redis的哨兵机制指的是什么 起了什么作用

监控节点的健康状况

通知

故障迁移

22、说一下 redis 主从复制的过程

准备从机

 

23、redis 怎样实现原子操作

setnx

lua脚本

INCR,DECR单原子性指令,类似于Java里面的AtomicInteger(底层依赖操作系统的原子性操作),但只能适用于对数据的简单增减i++,i–; Lua脚本复合指令,将一段复杂的数据修改操作写到Lua脚本文件中,然后以一个Lua脚本文件为单位,原子性执行,执行脚本文件时不会有其他并发操作;

24、什么是持久化策略

redis默认保存在内存里,不安全,容易丢失

持久化策略,就是把数据从内存中保存在硬盘中

25、使用setnx对redis操作加锁时,如果出现了异常怎么办?

26、Redis集群的哨兵模式

Redis哨兵模式包括以下几个主要组成部分:

  1. 哨兵进程:哨兵进程运行在单独的服务器上,负责监控Redis集群中的主节点和从节点状态,并在发现故障时执行相应的故障转移操作。

  2. 主节点:Redis集群中的主节点负责处理所有写请求,并将数据同步到从节点。

  3. 从节点:Redis集群中的从节点负责复制主节点的数据,并在主节点故障时接替其角色,成为新的主节点。

  4. 客户端:客户端连接Redis集群,向主节点发送写请求,向从节点发送读请求。

当一个哨兵进程发现主节点不可用时,它会根据预先定义的选举策略选择一个从节点作为新的主节点,并将其他从节点切换到新的主节点上。然后,哨兵进程会通知其他哨兵进程和客户端,使它们重新连接到新的主节点,从而实现自动故障转移。

 

十八、MQ

1、什么是mq mq的优缺点分别是什么

消息队列

优点:解耦、异步、削峰

缺点:项目复杂

解决两个进程之前的通信问题,使用一部通信

2、项目中哪些地方用到mq 请分别说明场景

3、市面上常见mq 产品的比较

 activemqrabbitmqrocketmqkafka
吞吐量 万级 万级 十万级 十万级
底层协议 jms amqp jms jms+
可用性 主从 高 主从 高 分布式集群 更高 更高
消息可靠性 有可能丢 理论0丢 保证0丢 理论0丢
时效性 毫秒级 微秒级 毫秒级 毫秒级
功能完整度   完整 完整 功能简单

4、javaee 是什么 他的13个开发规范分别是什么

  • jsp/servlet

  • jdbc

  • xml

  • jms

  • ejb

5、amqp 和 jms的比较

amqp:注重交换的工作格式

jms :注重接口

6、rabbitmq 中的5种工作模式是什么

7、mq的消息堆积了该怎么办

紧急情况下,治标的方法,增加消费者把消息先导出

以后找出消费慢的原因,然后优化

8、使用过云服务产品没有 请说一下使用的场景

9、什么叫做死信,rabbitmq一般什么情况下会产生死信,死信去了哪里?

10、rabbitmq 延时队列怎样实现的 一般用在什么场景

11、描述一下秒杀的实现过程 以及技术难点

  • redis预热 把每一场的秒杀商品预热到redis中

  • xxl-job 预热 分布式任务

  • cdn 静态资源加速

  • redis 分布式锁 防止一货多卖

  • mq延时队列 延时反查 订单的状态

  • mq削峰

  • 限流 限流组件

  • jvm优化

12、锁解决什么样问题的,描述一下线程锁 悲观锁 乐观锁 分布式锁

线程锁:

悲观锁:

乐观锁:

分布式锁:多个应用锁不住了,所以用分布式锁

13、什么是可重入锁 不可重入锁 自旋锁 可中断锁 公平锁 独享锁/共享锁 互斥锁/读写锁 分段锁

14、死锁怎样产生的, 怎样解决死锁问题

15、Arralist和LinkedList哪个是线程安全的?那线程安全的是什么?如果没有vertor 怎么保证ArrayList和LinkedList线程安全?用什么插件

16、并发测试使用什么工具

jmeter

17、redis 做分布式锁 和 zookeeper 做分布式锁的区别和各自的优势【背诵】

18、rabbitmq 延时队列怎样实现的 一般用在什么场景

队列设置了过期时间

19、怎样保证 两个人不能用同一个账户同时登录系统

在数据库设计一个字段记录登录状态

20、怎样保证两个人不能在 同一时间 用同一个账户登录

数据库设置登录状态字段

21、秒杀系统的JVM参数设置

22、如果用户拿到了秒杀商品的URL路由地址,怎么防止他提前下单?

前后端都加上判断

23、秒杀系统是否和商城系统分离

24、redis怎么实现的秒杀方案,什么时候手动删除设置的锁资源

25、用redis的setnx作锁会出现哪三个问题

  • 不可重试

  • 设置时间不科学

  • 加锁和加时间不是原子性操作

26、redission的原理

  • aop的异常增强,如果发现锁不住,抛出异常,会重试

  • 底层有线程,只要购物线程没有结束,就会把锁的时间一直填满

  • 底层使用lua脚本,让加锁和设置时间是一个原子操作

27、需要快速散货的无锁秒杀场景

28、描述支付服务的具体流程

确认订单

把商户订单信息发给支付宝服务器生成支付宝订单

把支付宝订单生成二维码 发给前端

扫描支付

如果支付成功 支付宝服务器 会通知商家的接口

商家接到通知 修改订单状态

29、支付宝是怎样防止 用户付款成功,但是支付宝没有通知商家的

手动应答+重试 如果支付宝服务器在发出消息后,没有得到success应答 会一天之内发出10次重试

30、支付宝怎样防止 给商户发送消息 但是商户消费消息失败的

手动应答+重试 如果支付宝服务器在发出消息后,没有得到success应答 会一天之内发出10次重试

31、支付回调中 怎样防止 消息重复消费

在消费信息之前,判断订单状态是否被改变,如果订单被改变就直接返回成功

32、原始HttpServletResponse 怎样 返回json

setContentType

33、用原生的HttpServletResponse 怎样返回一个excel 文档给客户端

34、你们公司用什么工具处理excel 的上传和下载

35、处理excel 的上传和下载遇到个难忘的bug 没

36、rabbitmq 怎样保证消息的可靠性

  • 保证消息发给交换机 确认机制

  • 保证发给队列 返回机制

  • 保证消息能够被消费者正确消费 重试机制

37、rabbitmq 重复消费【幂等性】问题 怎样 产生的 怎样解决

一个消息被消费一次和被重复消费多次导致的结果不一致

消费成功,但是应答的时候失败(网络抖动),那么会重新发消息回来,再消费一次,这个时候就有可能产生消息消费幂等性问题

解决:加锁 setnx

38、分布式事务问题怎样产生的

数据库的分开部署

比如redis和mysql分开部署 会导致一致性问题

39、怎样使用rabbitmq 解决弱一致性的分布式事务问题

强一致:数据库的两边几乎同时一致

弱一致:没有必要同时一致

最终一致:

  1. 确认生产者一定要将数据投递到MQ服务器中,采用本地事务消息、定时任务、消息确认机制。

  2. MQ消费者消息能够正确消费消息,采用手动ACK模式、方法幂等性、重试机制。

  3. 始终不能消费的消息进行人工通知处理

40、描述一下消费失败的消息补充系统的作用和设计

  • 需求:补偿的是一定要消费成功的消息

  • 开发之前的状况:通过重试保证消息一定消费成功,可是有些消息经过重试之后,还是失败,当时的处理是把消息作为死信扔掉,记录日志,让工作人员干预,达到最终一致性

  • 为了减轻工作人员干预的负担,设计补偿系统,把重试之后还没有消费成功的消息,记录到数据库中,方便人工干预

十九、websocket

1、websocket是什么

基于tcp的长连接双向通信协议,是对http协议的补充

二十、微服务

1、rpc 和 http 的区别

rpc:远程方法调用 二进制数据 性能高不能跨平台

http:远程接口调用 json格式数据 性能稍差 但可以跨平台

2、dubbo 和 springcloud feign区别

都是同步的远程调用

dubbo:rpc协议 二进制数据 性能高不能跨平台

feign:默认是http协议 json格式数据 性能稍差 但可以跨平台

3、什么是springcloud springcloud 和 springboot的关系是什么

springcloud:开发微服务组件的集合

常见组件:nacos rabbin feign sentinel gateway

springcloud基于springboot开发

4、微服务的优缺点

优点:

  • 部署简单

  • 易于扩张

  • 技术异构性

  • 降低耦合度

缺点:

  • 系统复杂度增加

5、你们公司里面使用的springboot springcloud springcloudalibaba 的版本是什么

6、什么叫做服务治理,用什么组件实现服务治理的

把所有服务都到服务中心进行注册

组件:zookeeper eureka nacos

7、请说一下注册中心的工作原理

各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。 微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。

image-20230310093207842

8、解释一下什么叫做cap定律 他指导了什么

CAP:指导分布式系统的设计原则

  • c 一致性:任何时候访问任何一个结点,得到的数据应该是一致的

    • 强一致:同时保持一致 可用性低

    • 弱一致:最终保持一致 可用性高

  • a 可用性:任何时候访问任何结点 不管数据是否一致 但是要能很快访问

  • p 分区容错性:网络原因导致各分区失联 出现分区问题,出现之后保证可用性和一致性就是分区容错性

  • 当出现的分区,就只能选择c 或者 a,当没有出现分区,觉大多数系统都可以保证ca的

分布式系统下只能 cp 或者 ap ca

9、zookeeper 和 eureka 作为注册中心的区别

zookeeper:偏向一致性

eureka:偏向可用性

10、zookeeper 和 eureka 和nacos作为注册中心的区别

nacos:尽量保证一致性,实在保证不了就会保证可用性

11、什么是ribbon,ribbon 内置的负载均衡规则有哪些,我们怎样自定义一个ribbon的负载均衡规则

Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具

  • 随机,通过随机选择服务进行执行,一般这种方式使用较少;

  • 轮训,负载均衡默认实现方式,请求来之后排队处理;

  • 加权轮训,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;

  • 地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。 ip —>hash

  • 最小链接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。 最小活跃数

12、说出ribbon 配置中 以下配置的意思?

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 负载均衡策略

ConnectTimeout: 3000 连接超时时间

ReadTimeout: 3000 处理超时时间

MaxAutoRetries: 1 最大重试次数

MaxAutoRetriesNextServer: 1 其他服务实例的总重试次数

OkToRetryOnAllOperations: true 设置是否只有get请求才会重试

13、使用ribbon 调用远程服务的接口 怎样防止接口被重复调用

设置OkToRetryOnAllOperations: false 只有在get请求时,才会进行重试

14、怎样保证接口的幂等性

只有get请求会重试

15、ribbon 的工作原理是什么

拦截器增强,把路径中的服务名通过负载均衡策略替换为ip地址

如果在没有使用Feign调用接口的时候,我们肯定会选择RestTemplate来调用,Ribbon给提供了一个负载均衡的一个标注@LoadBalanced,可以加在RestTemplate上,这个就是我们接下来要看Ribbon的入口了。

@LoadBalanced底层其实就是个拦截器,拦截了所有的RestTemplate调用的接口,在通过调用的是哪个服务来判断对应的ip,拼接好正确的url之后,在通过HTTP请求再去请求对应的接口就可以了。

16、sentinel 中 抛出和容错相关的异常 怎么处理的

  • 个性化异常处理

  • 全局异常处理

17、tcp 和udp的比较

img

18、应用层协议

  • http

  • dubbo

  • jdbc

19、hystrix 中断路器的3个状态是什么

关闭(closed)

关闭状态(断路器关闭):默认情况是此状态,所有请求都正常访问

开启(open)

开启状态(断路器打开):所有请求都会被降级。

半开(half open)

半开状态,open状态不是永久的,打开后会进入休眠时间(默认时5s),随后断路器会进入半开状态,此时会释放1次请求通过,若这个请求时健康的,则会关闭断路器,否则继续保持打开状态,再次进行5秒休眠计时

20、http2和http3的区别

http2基于tcp

http3基于udp

21、什么是feign feign 的工作原理是

是一个伪http客户端,让调用远程服务和调用本地服务一样简单,集成了rabbon+resttemplete(urlconnection)

  • 给请求发给代理对象

  • 代理对象通过Contract把springmvc的注解转成feign的注解找到具体方法

  • feign中有拦截器(编码,解码),内置rabbin负载均衡,调用远程http服务

22、两个进程远程调用 接口调用失败,参数没收到等问题 我们怎样解决问题

  • 配置feign日志

    • 日志级别:

      • NONE:性能好,适用于生产,不记录日志

      • BASIC

      • HEADERS

      • FULL

23、feign的拦截器配置

  • 自定义拦截器类实现requestInterceptor接口,重写apply方法

  • 写拦截器配置类

  • 配置拦截器

24、客户端组件的配置

feign中默认使用jdk原生的urlconnection 发送http请求,但我们可以集成别的组件来替换掉urlconnection 比如Apache HttpClient,OKHttp

25、微服务解决的问题

  • 进程和进程间的通信

  • 服务间的治理

  • 容灾

  • 链路追踪

  • 统一网关

  • 分布式事务

  • 分布式锁

26、什么是客户端负载均衡 什么是 服务器端负载均衡

服务器端的负载均衡:客户端发送请求,由Nginx服务器接收,根据使用的负载均衡算法,再将请求发送给相应的应用服务器。

客户端的负载均衡:服务消费方(客户端)先从服务注册中心获取服务列表,再通过ribbon的负载均衡算法,分发请求到不同的服务提供方

27、如果注册中心挂了,服务之间还能相互调用吗

可以的,项目启动时,服务调用者会从注册中心拉取注册的服务提供者的接口等数据,缓存到本地。每次调用时,按照本地存储的地址进行调用。

29、什么是base?

base:专门指导分布式事务

Base 理论 在cap 的基础上 完全指导分布式事务

30、feign如何提升网络传输效率

传输数据时可以使用gzip压缩,但只有使用OKHttp时才可以做到

31、什么叫做服务雪崩

即由于一个服务影响到其他服务,从而这一整条服务链都处无法未响应的状态的情况

比如下单业务,首先在订单服务保存订单,其次仓库服务减少库存,当库存服务减少库存时,仓库服务发生bug或阻塞或宕机,由于服务于服务调用之间使用http完成,则订单服务会一直阻塞状态下等待仓库服务的响应,由于tomcat线程池中线程数量有限,当线程池中线程全被占用,并且都处于阻塞状态时,其他的访问无法正常连接至服务器

如何解决:

  • 服务降级

  • 服务熔断

32、常见的容错策略有哪些

  • 隔离

  • 超时

  • 限流

  • 熔断

  • 降级

33、什么叫做 QPS RT

都是服务器性能指标

QPS:每秒钟的查询次数

TPS:每秒钟完成的事务个数

RT:响应时间

34、什么叫做峰值qps,峰值qps的计算公式是什么,横向扩展需要多少台机器的计算公式是

峰值qps:刚上线高峰期的时候的每秒查询率

峰值qps:一天的总流量*0.8/3600*24*0.2 能够估算出每天大致的峰值qps

一台机器虽大的qps=300

35、常见服务器性能指标有哪些

36、springcloud中hystrix的熔断和降级的区别及作用

熔断:一次连接抛出异常或超时了,会调用备用逻辑

降级:在n次请求中的超时比例

37、sentinel中抛出和容错相关的异常该怎么处理

BlockException:该异常表示触发了Sentinel的限流或者熔断规则,此时可以通过编写BlockException处理函数来实现对异常的处理。

fallback:该异常表示业务方法执行出现异常,此时可以通过编写fallback函数来实现对异常的处理。

38、hystrix 中断路器的3个状态是什么

39、什么是api 网关 主要起什么作用

后台程序的入口

作用:路由,限流,认证,鉴权

40、你们项目的入口是什么。。。

整个项目入口:nginx

后台程序的入口:网关

41、springcloud gateway 中以下配置的意义是什么

id:路由id

uri:nacos服务器上的名称

predicate:断言

filters:过滤器

42、什么是springcloud gateway 的断言 怎样自定义一个断言

43、springcloud gateway 中 的过滤器有几种类型

局部 全局

44、怎样自定义一个 springcloud gateway 的全局过滤器

45、zuul 的过滤器有几种类型

  • pre

  • routing

  • post

  • error

oedered:过滤器中的配置,数字越小越先执行

46、什么是单点登录 ,你们公司的单点登录是怎么做的

1;专门单点登录服务 2: 登陆成功 把jwt放在前端保存 ,前端以后发出任何请求都会在header中 携带jwt 3: 在网关中解析jwt

47、你们公司的权限验证是怎么做的

权限验证 放在网关

48、zuul 过滤器执行的顺序

  1. 前置过滤器(Pre Filters):在路由之前执行,用于处理身份验证、参数验证等操作。

  2. 路由过滤器(Route Filters):用于将请求发送到服务实例中,执行路由操作。

  3. 后置过滤器(Post Filters):在路由之后执行,用于处理响应结果,如添加响应头、记录日志等。

  4. 错误过滤器(Error Filters):在发生错误时执行,用于处理错误情况,如记录错误日志、返回错误信息等。

49、xxl-job

xxl-job是一个分布式任务调度平台

  1. 高可靠性:支持多种任务执行器和任务路由策略,保证任务的高可用和稳定性。

  2. 高可扩展性:支持动态扩容和缩容,根据任务流量自动调整任务调度集群的规模,满足不同任务的需求。

  3. 分布式任务调度:支持分布式任务调度,可以将任务分配到多个执行器上执行,提高任务执行效率。

50、怎样让客户没感觉到就升级了

蓝绿部署 滚动部署 灰度部署

51、什么叫做增量部署 什么叫做全量部署

增量部署(Incremental Deployment):金丝雀部署,灰度部署

指在更新软件时,只更新发生变化的部分,而不是全部更新。例如,当更新一个Web应用程序时,只需要更新修改的代码文件和配置文件,而不需要重新安装整个应用程序。增量部署可以减少部署时间和成本,同时减少风险和影响。

全量部署(Full Deployment):蓝绿部署

指在更新软件时,需要更新全部内容,包括代码、配置文件、库文件等。例如,当更新一个桌面应用程序时,需要卸载旧版本,重新安装新版本。全量部署通常需要更多的时间和资源,并且可能会影响到服务的可用性和稳定性。

52、常见限流算法

  • 计数限流:系统能同时处理100个请求,保存一个计数器,处理了一个请求,计数器加一,一个请求处理完毕之后计数器减一。每次请求来的时候看看计数器的值,如果超过阈值要么拒绝

  • 固定窗口限流:

    • 假设单位时间是1秒,限流阀值为3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值3,后续的请求全部拒绝。等到1s结束后,计数器清0,重新开始计数

    • 缺点:假设限流阀值为5个请求,单位时间窗口是1s,如果我们在单位时间内的前0.8-1s和1-1.2s,分别并发5个请求。虽然都没有超过阀值,但是如果算0.8-1.2s,则并发数高达10,已经超过单位时间1s不超过5阀值的定义啦,通过的请求达到了阈值的两倍。

  • 滑动窗口限流:

    • 记录每次请求的时间

    • 统计每次请求的时间 至 往前推1秒这个时间窗口内请求数,并且 1 秒前的数据可以删除。

    • 统计的请求数小于阈值就记录这个请求的时间,并允许通过,反之拒绝。

    • 缺点:对于固定窗口,滑动窗口除了需要引入计数器之外还需要记录时间窗口内每个请求到达的时间点,因此对内存的占用会比较多。

  • 令牌桶算法:将请求看作一个令牌,在桶中存储一定数量的令牌,每个请求需要消耗一个令牌,如果桶中没有足够的令牌,则拒绝请求。可以通过调整令牌的生成速率和桶的大小来控制请求流量

  • 漏桶算法:将请求看作一个固定大小的漏桶,当请求进入漏桶时,会以固定速率流出,如果漏桶中没有足够的空间存储请求,则拒绝请求。可以通过调整漏桶的大小和流出速率来控制请求流量。

53、什么是ci cd ,好处是什么

ci:持续集成

cd:持续交互

好处:大大降低项目风险

54、简述一下你们公司的项目开发流程 多长时间上一次线

1-2个礼拜

55、你们公司加班多吗 一般什么时候加班

上线的那天加班

56、有什么好办法能在用户感觉不到的情况下把咱的WEB系统升级了呢?

蓝绿部署

金丝雀部署

灰度部署

57、项目组多少人 组成结构是

58、前端后端怎么合作

59、开发人员和测试怎么合作

60、什么是单元测试 什么是结合测试 测试案例谁写的 给你写你会写吗

二十一、JVM调优

1、jvm jre jdk的区别

  1. JVM:Java 虚拟机,是 Java 程序运行的基础。它负责解释 Java 代码并将其转化为计算机能够理解的指令,使得 Java 程序能够在不同的平台上运行。

  2. JRE:Java 运行环境,包含了运行 Java 程序所必需的所有组件,包括 JVM、Java 类库和其他支持文件。如果只需要运行 Java 程序而无需进行开发,则只需要安装 JRE 即可。

  3. JDK:Java 开发工具包,包含了开发、编译和调试 Java 程序所需的所有组件。除了包含 JRE 的所有组件外,还包括了编译器、调试器、工具库等,用于开发和构建 Java 应用程序。

因此,简单来说,JDK 包含了 JRE 和一些开发工具,而 JRE 则包含了 JVM 和 Java 类库,而 JVM 是 Java 运行的基础。

2、jvm 的内存划分

  1. 堆(Heap):用于存储对象实例以及数组等数据。堆是 Java 程序中最大的一块内存区域,也是垃圾回收机制的主要工作区域。

  2. 方法区(Method Area):用于存储已加载的类的信息、常量池、静态变量、即时编译器编译后的代码等。方法区属于堆的一部分,但是它具有独立的特性,因为它不是用于存储对象实例的。

  3. 虚拟机栈(Java Virtual Machine Stacks):用于存储程序在执行过程中的方法调用和局部变量等信息。每个线程都有一个虚拟机栈,它们的生命周期与线程相同。

  4. 本地方法栈(Native Method Stack):用于存储 Java 虚拟机使用的本地方法(Native Method)的信息。

  5. 程序计数器(Program Counter Register):记录当前线程正在执行的字节码指令地址,也就是下一条指令的位置。

3、堆是不是越大越好,栈是不是越大越好

4、程序计数器干什么用的

记录代码运行到哪一行了

5、对象一定分配在堆中吗

栈中也有可能

经过逃逸分析有些对象可以放在栈中(jdk1.6优化)

放入栈中的好处 对象生命周期结束时,不需要经过垃圾回收

6、jvm1.7 和 1.8 的区别

方法区:常量、静态变量、字节码对象

jvm1.7的方法区叫做永久代 在堆中

jvm1.8的方法区叫做元空间 在物理内存中

7、串池的数据结构是什么? 怎样优化串词

串池:字符串常量池:HashMap

优化:增加数组长度,减少hash碰撞

8、怎样查找死锁问题 线程死锁

jps查看当前操作系统中的所有java进程

jstack看指定线程的栈的情况

9、堆的内存划分

  • 新生代

    • 伊甸区

    • 幸存区:

      • from

      • to

      • from:to = 1:1

    • 伊甸区:幸存区 = 8:2

  • 老生代

新生代和老生代的默认比例是1:2

调优:修改老生代和新生代的比例

10、一次垃圾回收的过程

  • 如果是超大对象,新生代直接就放不下了,就会放入老生代,如果老生代也放不下,就直接变成垃圾

  • 如果是普通对象:

    • 首先进入新生代

    • 在经历过一次YungGC后依然存活,就会放入幸存区from,然后每次经历YungGC都会在from和to中来回传递,直到经历过15次YungGC,如果还是存活就会放入老生代

    • 进入老生代后进行OldGC,如果变成垃圾,就被回收

  • 一次完整的YongGC+OldGC就叫做FullGC

  • FullGC是面向整个堆空间的

11、oom之前一定会产生一次fullgc 这句话对不对

对的

产生oom一定经历过YungGC和OldGC

12、怎样判断一个对象是垃圾

  • 引用计数法

  • gcroot可达性分析算法

13、引用计数法的缺点是什么 或者 为什么jvm 不是通用引用计数法

引用计数法技术在循环依赖的时候没有办法起作用

所以jvm使用gcroot可达性分析算法来判断对象是否为垃圾

14、哪些东西可以作为gcroot

栈中变量 线程

常量

元空间中的字节码对象和静态变量

15、常见的垃圾回收算法 以及特征

标记清除法

特点:会产生大量的碎片

image-20230316203541451

标记整理算法

垃圾回收之后,会对存活对象进行整理

image-20230316203630884

复制算法

幸存区的from到to使用的就是复制算法

image-20230316203519964

分代收集算法

新生代:用复制算法

老生代:使用标记清除或者用标记整理算法

image-20230316204102582

16、常见的垃圾回收器的组合 以及这些组合的特征

image-20230316212131639

 

17、请描述cms一次回收的过程

初始标记、并发标记、重新标记、并发清理、重置线程

18、cms的优点 和 缺点

优点:低时延、适合高并发场景

缺点:标记清除算法,会产生大量碎片、低吞吐量、并发模式失败

cms可能会产生浮动垃圾,也就是在进行并发清理的过程中可能产生新的垃圾,这就是浮动垃圾,所以如果老生代使用cms做垃圾回收器,都会预留8%的空间给浮动垃圾

如果产生的浮动垃圾大于预留的空间,就会产生并发模式失败异常,此时老生代的垃圾回收器就会回退到串行回收期

19、cms垃圾回收器使用的算法是什么?

标记清除算法

20、xss xms xmx xmn 分别代表什么?

  1. -Xms:指定 Java 虚拟机堆的初始大小,即在启动时分配给 Java 堆的内存大小。例如:-Xms512m 表示初始分配 512MB 的内存空间。

  2. -Xmx:指定 Java 虚拟机堆的最大可用内存大小,即 Java 堆能够使用的最大内存大小。例如:-Xmx1g 表示最大可以使用 1GB 的内存空间。

  3. -Xss:指定每个线程的堆栈大小,即一个线程的最大可用内存大小。例如:-Xss256k 表示每个线程栈的大小为 256KB。

  4. -Xmn:指定年轻代堆的内存大小,一般情况下建议将其设置为整个堆内存的 1/3 或者 1/4。例如:-Xmn256m 表示设置年轻代堆为 256MB。

21、以下参数是啥意思

  • -XX:-PrintGCDetails

  • -XX:+PrintGCDetails

  • -XX:MetaspaceSize=512m

  • -XX:NewRatio=n

  • -XX:ParallelGCThreads=n

  • -XX:MaxGCPauseMillis=n

  • -XX:+PrintCommandLineFlags

22、什么是 Thread dump

Thread dump 中包含了每个线程的堆栈信息,即线程正在执行的方法调用链和当前线程所持有的锁信息等,以及一些统计信息,如线程数、CPU 占用率等。通过分析这些信息,可以确定应用程序中存在的性能瓶颈和异常情况,并进行相应的优化和修复。

23、怎样获得Thread dump

在 Java 应用程序中,可以使用 jstack 命令来生成 Thread dump。jstack 可以输出当前 Java 虚拟机上所有线程的状态信息,并将其打印到控制台或者输出到文件中,方便进行后续的分析和处理。

24、什么是 heap dump

Heap dump(堆转储)指的是将 Java 应用程序中当前的内存快照保存到一个文件中,以便进行分析和调试。它可以记录当前应用程序中所有对象的状态信息,包括每个对象的类型、大小、引用关系等,以及统计信息,如内存使用情况、对象数量等。

25、怎样获得heap dump

在 Java 应用程序中,可以使用 jmap 命令生成 Heap dump。

26、调优的目的

让fullGC的时间变短

让fullGC的频度更大

27、导致Full GC的原因

堆空间不足

元空间不足

28、请描述企业中jvm 调优的步骤

  • 监控(jvisualVM)

    • cpu占用

    • 频繁GC

    • 堆空间的大小

  • 生成堆快照(二进制文件)和栈快照(文本文件)

  • 使用工具打开堆快照(jvisual VM)

  • 分析结果

    • fullGC的次数越来越频繁

    • fullGC的时间由0.5秒到四五秒

  • 常见的优化手段

    • 初始化堆空间和最大堆空间设置一样大

    • 选择合适的垃圾回收器

      • 高并发的情况下选择cms或者G1,这两个是主打低时延的垃圾回收期

    • 如果是高并发的情况,一般会把新生代和老生代的比例调整为2:1,目的是把大量生成的对象在新生代就变成垃圾销毁

29、什么是sharing-jdbc 或者 mycat

30、什么是mycat的分片策略,常见的分片策略有哪些 你用过哪些分片策略

31、mycat的自增长主键生成策略?

32、使用mycat的缺点

33、mysql主从复制的原理和过程

34、主从复制的好处,读写分离的好处,分表分库的好处?

35、读写分离怎么配置的

36、常见的sql优化手段

37、常见的数据库优化手段

38、描述一下数据库业务的需求

39、优惠券业务的数据结构

40、优惠券业务的亮点

 
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java