当前位置: 首页 > news >正文

java面试

什么是程序计数器?
线程私有的,每一个线程一份,内部保存的字节码行号,用于记录正在执行字节码指令的地址

元空间?
元空间保存类信息,常量,静态变量,编译后的代码

java堆?
线程共享的区域,主要用来保存实例对象,数组等,内存不够则抛OOM
组成:年轻代+老年代(Eden+两个survivor(from,to))(保存生命周期长的对象)
jdk1.7(永久代:存储类信息,常量,静态变量,编译后的代码)
jdk1.8(移除了永久代,把数据存储到了本地内存的元空间,防止内存溢出)

什么是虚拟机栈?
每个线程会创建一个虚拟机栈,栈内存一般会用来存储局部变量和方法调用,栈内存是线程私有的

栈和堆的区别?
栈内存用来存储局部变量和方法调用的,但堆内存用来存储java对象和数组的,堆会GC垃圾回收,而栈不会
栈内存是线程私有的,堆内存是线程共享的

方法区?
存储类信息,常量,静态变量

什么是AOP?
面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合

你们项目中有没有使用到AOP?
记录操作日志,缓存,spring实现的事务
核心是:使用aop中的环绕通知+切面表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类,方法,注解等),获取这些参数,保存到数据库

spring中事务是如何实现的?
其本质是通过AOP功能,对方法前后进行拦截,在方法执行之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
spring中事务失效的场景?

1,异常捕获处理
2,非public方法事务会失效
3,非事务方法调用事务方法必须用代理对象调用
4,抛出io异常事务会失效(注解上+rollback=Exception.class)

mysql篇
如何定位慢查询?
通过慢查询日志定位执行慢的sql mysql配置文件中开启慢查询日志以及配置sql执行超过多少s的记录到慢查询日志中。
通过执行计划explain找到查询慢的原因
explain的重要的参数?
possible_key可能使用到的索引
key实际使用到的索引
key_len索引长度
extra额外优化的建议,判断有没有回表
查询多少条数据查到我们想要的数据
type sql连接的类型:
1,system系统中的表
2,const根据主键查询
3,eq_ref主键索引或唯一索引查询
4,ref索引查询
5,range范围查询
6,index索引树查询
7,all全表扫描

什么是索引?
提高数据库查询效率的数据结构(B+tree)
索引的底层数据结构?
B+tree
一个节点可以存多个索引,一个节点下有多个分支,非叶子节点存索引,叶子节点存索引和数据(叶子节点通过双向链表连接数据,避免范围查询的回旋查找)
B-tree
一个节点下可以存多个数据,一个节点下有多个分支,节点上存索引和数据,范围查询有回旋操作效率比较低
红黑树:数越多树越高
平衡二叉树:数越多树越高
二叉树:特殊情况下结构形成链表时间复杂度成o(n)效率低

JVM调优参数在哪设置
war包部署在tomcat中设置
jar包部署在启动参数设置
nohup java -Xms512m -Xmx1024m -jar xxx.jar &
在这里插入图片描述
JVM调优参数有哪些
设置堆的
-Xms:设置堆的初始化大小(最好设置成物理内存的1/46)
-Xmx:设置堆的最大大小(最好设置成物理内存的1/4)
设置栈的
-Xss (默认是1M)
设置年轻代中的(Eden和两个survivor的比例,默认是8:1:1)
年轻代晋升到老年代的阈值(默认是15,取值范围是0-15)
用的jvm调优参数有哪些?
1,设置堆空间大小
2,虚拟机栈的大小
3,年轻代中Eden区和两个Survivor区的大小比例
4,年轻代到老年代的阈值
5,设置垃圾回收收集器
JVM常用调优工具
jps:查看java进程信息
jstack:查看进程中线程的信息 (jstack )
jmap:看看堆信息(jmap -heap )
java自带的jconsole.exe工具
在这里插入图片描述
java内存泄漏怎么排查?
内存泄漏通常是指堆内存,通常是指一些大对象不被回收的情况
1,通过jmap或设置jvm参数获取堆内存快照
2,通过工具,VisualVM去分析dump文件,VisualVM可以加载离线的dump文件
3,通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
4,找到对应的代码,通过阅读上下文,进行修复即可
cpu彪高排查方案与思路?
top命令查看cpu占用高的java进程
查看进程中的线程信息
在这里插入图片描述
查看进程中线程占用高的
jstack
查看进程中所有线程的信息
在这里插入图片描述
单点登录是怎么实现?
单点登录的解决方案:使用JWT生成token
1,用户访问系统,网关会判断token是否有效
2,如果token无效则返回401(认证失败)前端跳转到登录页面
3,用户登录成功给前端返回一个token,浏览器把token保存到cookie
4,再次访问携带token,由网关验证后路由到目标服务
权限认证是如何实现的?
用户拥有角色,角色拥有权限(5张表)
springsecurity框架
上传数据安全性怎么保证
使用对称加密(非对称加密)保证数据安全
项目中遇到过哪些棘手的问题
在这里插入图片描述
分布式事务解决方案
Seata(XA,AT,TCC)
MQ

TC:事务协调器()
TM:事务管理器(开启全局事务,提交回滚全局事务)
RM:资源管理器(分支事务,注册报告给TC)

XA模式:(强一致性,分区容错)(性能差)
1,TM开启全局事务,调用RM分支事务注册到TC中
2,各个RM执行自己的业务SQL
3,各个RM报告自己执行业务sql的状态到TC
4,TM控制事务回滚或提交(去TC中检查分支事务的提交状态)
AT模式:(高可用,分区容错性)(最终一致性)
1,TM开启全局事务,调用RM分支事务注册到TC中
2,各个RM(记录更新前后的快照undolog)执行自己的业务SQL,并且提交
3,各个RM报告自己执行业务sql的状态到TC
4,TM控制事务回滚或提交(去TC中检查分支事务的提交状态)
TCC模式:
Try :资源的检查和预留
Confirm:完成资源操作业务;要求try成功Confirm一定要能成功
Cancel:预留资源释放,可以理解为try的反向操作
1,TM开启全局事务,调用RM分支事务注册到TC中
2,在各个RM中执行try操作(拿转账举例,先把100冻结)
3,TM控制事务回滚或提交(去TC中检查分支事务的提交状态)
4,成功执行Confirm(真正的转账操作),失败调Cancel回滚

MQ解决分布式事务?
在A服务写数据的时候,需要同一个事务内发送消息到另一个事务,异步,性能好

JVM垃圾回收算法有哪些?
标记整理,标记清除,复制算法

rabbitmq面试题
好处?
异步发送(验证码,短信,邮件)
分布式事务
削峰填谷
mysql和redis的数据同步
如何保证消息不丢失
1,生产者确认机制,确保生产者的消息能到达队列
2,开启持久化,确保消息未消费前在队列中不会丢失
3,开启消费者确认机制
4,开启消费者失败重试机制,多次重试将消息投递到异常交换机,交由人工处理
mysql和redis的数据双写一致性采用rabbitmq实现同步(高可用)
消息重复消费
通过业务的唯一表示,发消息前先通过唯一标识去数据库查询,如果没有,说明消息消费了,如果有说明消息没消费

消息堆积
1,增加更多的消费者
2,在消费者内开启线程池加快消费处理速度
3,扩大队列容积

延迟队列
ttl+死信交换机(超时订单)
死信队列

高可用机制

redis
使用场景?
缓存,分布式锁,计数器,保存token,消息队列,延时队列
缓存穿透怎么解决?

双写一致性?

延时双删

相关文章:

  • 雅思练习总结(十八)
  • Java的SeleniumChromeDriver的常用方法
  • 从 Dense LLM 到 MoE LLM:以 DeepSeek MoE 为例讲解 MoE 的基本原理
  • 【Linux】文件描述符1
  • 定制一款国密浏览器(2):修改包名
  • Java学习总结-Commons-io框架-配置io框架
  • AI比人脑更强,因为被植入思维模型【42】思维投影思维模型
  • linux服务器安装pyenv
  • 题解:AT_abc241_f [ABC241F] Skate
  • 代码随想录回溯算法01(递归)
  • 为什么AI需要连接真实世界?
  • 使用人车关系核验API快速核验车辆一致性
  • IPSG 功能协议
  • 【realtek sdk-3.4.14b】RTL8197FH-VG+RTL8812F WiFi 2.4G 功率异常问题分析及解决方案
  • MyBatis逆向工程|mybatis-generator:generate插件的使用教程
  • Linux动态监控进程利器:top命令详解
  • 【微服务】基础概念
  • Java常用数据结构操作方法全面总结
  • 二:python基础(黑马)
  • 国家重点研发计划申报答辩PPT设计制作美化ppt模板下载