2023最新Java面试题--黑马

说一下,项目中那些场景使用了redis

缓存穿透,击穿,雪崩

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
缓存击穿
添加一个分布式锁,只能有一个线程拿到锁
和钱相关必须强一致选互斥锁
逻辑过期重要是高可用,不保证数据的一致性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双写一致

Mysql的数据如何与redis进行同步(双写一致)
两种方案要根据项目来选
第一种延时双删
在这里插入图片描述

先删除缓存,还没有更新数据库20这个时候有另外一个数据进来,查询缓存没有查到,就去数据库里查到之前的数据10
先操作数据,线程2还没有更新数据库20,这个时候线程1查询数据10,写入缓存10,线程2更新数据20,导致数据不一致出现脏数据
两种 情况都会导致脏数据
所以数据修改之后再删除一次缓存,为什么要延时,数据库可能是主从节点,需要延时一会让数据从主节点复制到从节点
延时双删的时间不好控制还是可能会导致脏数据
第二种方案 使用读写锁
读的时候使用共享锁可以读不能写
写的时候使用排他锁,会阻塞其他线程读和写的操作
相比分布式锁性能高一点
可以保证强一致,但是性能低
在这里插入图片描述

在这里插入图片描述
异步通知保证数据的最终一致性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

redis的持久化

第一种方式 RDB
推荐使用子进程,这样不会影响其他命令
在这里插入图片描述
在linux中所有的主进程都无法直接操作物理内存,由操作系统给每个主进程分配一个虚拟内存,操作系统会维护一下虚拟内存和物理内存中间的映射关系表(页表),主进程通过页表对物理内存进行读操作
fork是克隆,fork子进程就是把主进程的页面复制过去,这样就和主进程有了相同的映射关系,这样就实现了主进程和子进程内存空间的共享这样就无需拷贝内存中的数据了,直接实现内存共享,这样子进程就可以写新的RDB文件。
怎么避免在写文件的时候有新的写操作导致数据不一致,fork采用copy-on-write技术,有写操作,就把数据拷贝,把数据写进去,读的数据对应的映射也会改变
在这里插入图片描述
第二种 AOF
在这里插入图片描述

在这里插入图片描述
会把无效的命令重写,最大的节省命令行数
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

reids的过期策略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

reids数据淘汰策略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
redis内存使用完之后会报错out of memory,中止服务,读操作可以,写操作不行

分布式锁

在这里插入图片描述
给锁续期:一开始给锁设置了过期时间然后再开另外一个线程来看业务到底执行了多久,如果执行时间长就增加持有锁的时长
这种就需要使用到redisson
在这里插入图片描述
使用redisson,watchdog会续期
抢不到锁的线程会尝试等待
加锁和设置过期时间等操作都是基于lua脚本的,lua脚本可以调用linux命令来保证多条命令执行的原子性
当设置了过期时间30之后watchdog就没有了,redisson认为你可以自己控制时间就不给你续期了
10是while循环的时间
在这里插入图片描述
redis实现的分布式锁不能重入
redisson实现的分布式锁可重入(同一个线程内,不同线程就是互斥了)

在这里插入图片描述
没有使用红锁的话,当一个服务挂了之后,同一个锁,可能就被不同的线程拿到了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Redis是单线程为什么还这么快

在这里插入图片描述

在这里插入图片描述

IO多路复用就是用来监听多个客户端的连接
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

Mysql

sql优化

Mysql中如何定位慢查询
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
表数据量大,可以添加索引,怎么看索引是否失效呢可以通过EXPLAIN
PRIMARY是主键
在这里插入图片描述
如果Extra 是using index condition 表示索引还有优化的空间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

索引

1.写sql创建

sql范本:create index 索引名称 on 表名(字段名);

sql示例:create index index_user_name on PROMULGATE_CERT(user_name);
没有索引的时候,查找age是45的人,sql执行会从第一行一个一个找,找到最后一行
在这里插入图片描述

B+树特点,非叶子节点不存储数据只存储指针,这些指针是为了方便找到数据,只在叶子节点保存数据
在这里插入图片描述

在这里插入图片描述
主键索引是聚族索引
在这里插入图片描述
1 是主键索引也是聚族索引,可以从索引中一次查询出所有的数据
在这里插入图片描述

索引创建的原则

在这里插入图片描述

索引失效

在这里插入图片描述
name status address 是有顺序的查询要从最左边开始

在这里插入图片描述
key 和key_len 是null 索引已经失效了
最下面的这个key_len是303跟只查询name时候的key_len是一样都是303
表示只命中了name的索引,查询的时候后面的address是跳过status的,没有命中

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Sql的优化经验

在这里插入图片描述
选择合适的数值可以减少存储的成本提高查询的效率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Mysql 事务

加钱和减钱的操作要么成功要么失败

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
并发事务带来的问题
在这里插入图片描述

在这里插入图片描述
串行话效率很低一般是不会用的
在这里插入图片描述
在这里插入图片描述
主库负责写数据,从库负责读数据,主库写数据之后要把数据同步到从库
在这里插入图片描述
在这里插入图片描述

Spring

spring 单例bean是线程安全的吗

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

AOP

事务就是使用的aop

在这里插入图片描述
项目中使用AOP,记录日志,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

spring 中事务失效的场景

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

spring 的bean的生命周期

在这里插入图片描述
在这里插入图片描述

spring中的循环依赖

在这里插入图片描述

在这里插入图片描述

SpringMVC的执行流程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

springboot自动配置原理

在这里插入图片描述
在这里插入图片描述

spring中常见的注解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
mybatis执行流程
在这里插入图片描述
在这里插入图片描述
Mybatis的一级二级缓存
在这里插入图片描述
在这里插入图片描述
二级缓存默认是关的,开启之后,同一个线程内两个sqlSessionFactory查一个sql,只会连接数据库查询一次
在这里插入图片描述
在这里插入图片描述

Spring Cloud

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
服务降级针对的是某个接口,服务熔断针对的是整个服务
在这里插入图片描述
微服务是怎么监控的
一般shywalking来监控
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目中怎么做限流的

tomcat在单体项目中可以,微服务就不行了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
公司压测之后业务的qps是1200
在这里插入图片描述

CAP和BASE

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
比如提交订单,提交多次也只能有一个订单
在这里插入图片描述
在这里插入图片描述
使用token和redids,在点击购买的时候去获取token,然后返回一个token,有了token之后请求业务接口提交订单的页面,验证token存在之后删除token,其他请求进来没有token就打不开提交订单的页面
在这里插入图片描述
使用分布式锁保证只有一个线程可以拿到锁进行业务的操作
在这里插入图片描述
在这里插入图片描述
项目中使用的分布式任务调度
在这里插入图片描述

在这里插入图片描述

消息中间件

生产者发生消息到交换机,交换机把消息路由到队列,然后消费者消费消息
在这里插入图片描述

消息未到达交换机怎么解决

在这里插入图片描述
消息未到达对列怎么解决
在这里插入图片描述
消费者未收到消息
在这里插入图片描述
在这里插入图片描述

RabbitMq消息重复消费的问题如何解决

当消费者消费完消息,这个时候消费挂了,确认的消息还没有回给生产者,因为有超时重试机制,消费者会再次消费消息,导致重复消费的问题。
每个消息设置一个唯一id,我们消费的时候去数据库看如果没有这个id就正常消费,如果有了就不再消费这个消息了
在这里插入图片描述
在这里插入图片描述

消息堆积怎么解决

在这里插入图片描述
在这里插入图片描述

集合

在这里插入图片描述

算法复杂度分析

来评估代码的执行耗时的
3n+3 前一个三是系数,第二个三是常量,这两个三都不能反映变化趋势所以可以省略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不管底数是2还是10复杂度都是logn
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

List相关

多线程

线程的基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线程中并发安全

加锁之后使用monitorenter上锁
把这段代码锁住,等解锁之后其他代码才能执行这段代码,第二次解锁是怕出现异常之后也能解锁
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

JMM

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AQS

在这里插入图片描述

RentrantLock

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

导致并发程序出现问题的根本原因

原子性保证一段代码要么全部执行完成,要么全部执行失败
在这里插入图片描述
内存可见性可以使用三种方案解决,但是volatile的方法效率高
在这里插入图片描述
在这里插入图片描述

线程池的核心参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线程池的种类有哪些

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
异步线程:打印平台,请求进来保存json请求报文使用异步线程
在这里插入图片描述
在这里插入图片描述
常常用于限流
在这里插入图片描述

ThreadLocal

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JVM

在这里插入图片描述
在这里插入图片描述

什么是程序计数器

在这里插入图片描述
在这里插入图片描述

JAVA堆

元空间就是方法区
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

在这里插入图片描述
Java1.8把方法区和永久代放到了本地内存的元空间,因为元空间中保存类信息和静态变量,随着代码加载这些类信息不可控,放在堆空间中容易内存溢出,为了避免OOM所以优化之后放在了本地内存
在这里插入图片描述

虚拟机栈

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法区

1.7以前是在堆中的永久代保存类的信息
1.8以后移到了本地内存中的方法区(元空间)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类加载器

在这里插入图片描述

bootstrap classloader 启动类加载器
在这里插入图片描述
string一直委派到启动类加载器,启动类加载器可以加载这个类,则由启动类加载器加载
stutdent类 委派到启动类加载器也没有被加载那么应用类加载器就会加载这个类
在这里插入图片描述
在这里插入图片描述

类装载的执行过程

在这里插入图片描述
在这里插入图片描述

垃圾回收

对象什么时候可以被垃圾回收器回收

demo指向一个对象,ref就是1,表面被引用了一次
如果 string demo = null; 那么ref就是0,表示可以被回收
在这里插入图片描述

在这里插入图片描述

垃圾回收算法有哪些

先标记存活的对象,然后清除其他的对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jvm中的分代回收

在这里插入图片描述
在这里插入图片描述
当新生代和老年代内存严重不足的时候才会产生FullGC
在这里插入图片描述

JVM有哪些垃圾回收器

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GC root是可达性算法标记哪些对象是存活的
软引用GC root先能找到softReference对象(软引用对象),user对象是一个软引用,进行垃圾回收之后如果内存不足再次触发垃圾回收就会回收user对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JVM实践

JVM调优的参数在哪里设置参数

在这里插入图片描述
在这里插入图片描述

JVM调优的参数有哪些

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

JVM 调优工具

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Java内存泄漏的排查思路

一些大的对象一直存活,垃圾回收器一直没有回收就会导致堆空间内存泄漏
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CPU飙高排查方案和思路


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设计模式

冒号后面是方法的返回值
在这里插入图片描述
这样实现耦合比较严重,更换对象的时候new的对象也都要更换
要实现开闭原则:扩展开放,对修改关闭
在这里插入图片描述

简单工厂模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工厂方法模式

在这里插入图片描述

简单工厂又产生了新的耦合后期如果有新的产品还是要修改simplecoffefactory类
在这里插入图片描述
具体产品

在这里插入图片描述
抽象工厂
在这里插入图片描述
具体工厂
在这里插入图片描述
在这里插入图片描述

抽象工厂模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

策略模式

在这里插入图片描述
登录案例 工厂加策略模式
在这里插入图片描述

原来的登录方式不符合开闭原则
在这里插入图片描述
使用工厂和策略模式
在这里插入图片描述

让spring管理这些策略对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在工厂类中
拿到配置文件中的值,放到map中
继承的applicationcontexAware接口,就会实现setApplicationContext方法,拿到applicationcontext对象,拿到配置文件
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

前面的account不能随便写,要和前端写的type对应,后面的accountGranter也不能随便写,要根据这个在spring中找到对应spring管理的类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

责任链设计模式

在这里插入图片描述
setNext是设置下一条执行的顺序
在client中设置链条执行的顺序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这是责任链中的最后一个方法不用调用下一个执行的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
复杂的流程审批会使用工作流来实现

在这里插入图片描述

常见的技术场景

单点登录

在这里插入图片描述

权限认证

在这里插入图片描述

在这里插入图片描述

上传数据的时候安全性怎么考虑?

在这里插入图片描述

在这里插入图片描述

项目中遇到的问题

一开始写的代码没有使用设计模式,后来需要经常更改代码,很不方便,后来我使用工厂模式和策略模式重构代码解决了这个问题
线上bug,线下测试不方便复现,项目上线一个月之后
在这里插入图片描述
日志的采集
在这里插入图片描述

怎么在linux中查看日志

在这里插入图片描述
在这里插入图片描述
QPS是每秒查询率
在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网上流传的一个叫做《Java面试题大全》的东西中,很多题目是重复且没有价值的,而且还有不少的参考答案是错误的。在修订的过程中,可以参考当时JDK最新版本(Java 7)给出的题目答案来进行修改。 另外,在操作系统面试中,可能会遇到关于缓存的问题。在Mybatis中,一级缓存和二级缓存是其中的两个重要概念。一级缓存是指在同一个SqlSession中,同一个查询语句的结果会被缓存起来,以提高查询性能。而二级缓存是指在多个SqlSession中,同一个查询语句的结果会被缓存起来,以提高整体的查询性能。 此外,如果需要查看当前线程中的进程信息,可以使用命令“ps H -eo pid,tid,%cpu | grep 40940”。这个命令会列出当前线程中所有进程的信息,并通过grep命令过滤出包含40940的进程信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java面试大全-黑马](https://download.csdn.net/download/jerrydzan/10908207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [2023黑马框架篇面试题](https://blog.csdn.net/weixin_46121635/article/details/130537568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [2023黑马JVM相关面试题](https://blog.csdn.net/weixin_46121635/article/details/130771015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值