Java后端认证答辩面试题
【Java后端认证答辩、面试题】
1、标题死锁产生的原因及四个必要条件
产生死锁的原因主要是:
- 因为系统资源不足。
- 进程进行推进的顺序不合适
- 资源分配不当等
产生死锁的四个必要条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件就必然成立,而只要上述条件之一不满足,就不会产生死锁。
死锁的解除与预防
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度方面注意如果不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占有资源。因此,对资源的分配要给予合理的规划。
2、Springboot的默认日志框架
Logback
3、Maven的生命周期
Maven 的内部有三个构建生命周期,分别是 clean, default, site。其中 default 生命周期的核心阶段如下所示
4、Mysql B+树和B树的区别
首先B树的所有节点都存储数据信息,而B+ 树的所有数据都存储在叶子节点
B+ 树是在B树的基础上的一种优化,使其更加适合外存储索引结构,InnoDB存储引擎及时B+ 树实现其索引结构
从B树结构图中可以看到每个节点中不仅包含数据的Key值,还有data值,而每一页的存储空间是有限的,如果data数据较大时会导致每一个节点(也就是每一页)能存储的key的数量很小,当存储的数据量很大时同时会导致B树的深度很深,高度很高,增大磁盘的IO次数,进而影响查询效率,在B+树中,所有数据节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储Key值信息,这样可以大大增加每个节点存储的key值数量,降低B+树的高度
5、Nginx的工作模式有哪些
- master-worker模式:nginx启动成功后,会有一个master进程和至少一个worker进程;master进程负责处理系统信号、加载配置、管理worker进程;worker进程负责处理具体的业务逻辑
- 单进程模式:nginx只有一个进程,nginx的所有工作都由这个进程负责
6、Gitflow工作流程
初始化项目为gitflow , 默认创建master分支 , 然后从master拉取第一个develop分支
develop拉取feature分支进行编码开发(多个开发人员拉取多个feature同时进行并行开发 , 互不影响)
feature分支完成后 , 合并到develop(不推送 , feature功能完成还未提测 , 推送后会影响其他功能分支的开发)
合并feature到develop , 可以选择删除当前feature , 也可以不删除 . 但当前feature就不可更改了 , 必须从release分支继续编码修改
从develop拉取release分支进行提测 , 提测过程中在release分支上修改BUG
release分支上线后 , 合并release分支到develop/master并推送
合并之后 , 可选删除当前release分支 , 若不删除 , 则当前release不可修改 . 线上有问题也必须从master拉取hotfix分支进行修改
上线之后若发现线上BUG , 从master拉取hotfix进行BUG修改
hotfix通过测试上线后 , 合并hotfix分支到develop/master并推送
合并之后 , 可选删除当前hostfix , 若不删除 , 则当前hotfix不可修改 , 若补丁未修复 , 需要从master拉取新的hotfix继续修改
当进行一个feature时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上
即合并develop到当前feature分支
当进行一个release分支时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上
即合并develop到当前release分支 (!!! 因为当前release分支通过测试后会发布到线上 , 如果不合并最新的develop分支 , 就会发生丢代码的情况)
7、nginx之压缩配置
#配置压缩的指令可以包含在http上下文中server或location配置块中
gzip on; #开启gzip压缩功能
8、Mybatis动态标签
元素 | 作用 | 场景 |
---|---|---|
foreach | 循环语句 | 批量添加或者批量查询 |
if | 判断语句 | 单条件分支判断 |
choose、when、otherwise | 相当于Java中的switch case default语句 | 多条件分支判断 |
trim、where、set | 辅助元素 | 用于处理一些条件查询 |