100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > JAVA后台开发常见面试题

JAVA后台开发常见面试题

时间:2019-05-18 19:58:56

相关推荐

JAVA后台开发常见面试题

一、java基础知识。

1.jvm内存划分,GC算法,排查OOM常用的命令。

答:堆、栈、方法区、程序计数器、常量池、直接内存、本地方法栈

GC算法:标记-清除;复制算法;标记-整理,排查命令:JPS查看java进程,jinfo查看jvm配置信息;jmap -heap查看堆详细信息,jstat -gc查看GC信息,jmap -dump打印dump日志

2.类加载器种类和加载过程。

答:启动类、扩展类、APP类加载器。加载过程:一个类加载器收到加载类的请求,不会自己去加载,而是委派给父类加载器去加载,父类加载器无法完成加载,才给子类去加载。

3、设计模式

设计原则:单一职责、接口隔离、开闭原则、依赖倒置原则、里氏替换原则、迪米特法则。

里氏代换原则:任何基类可以出现的地方,子类一定可以出现依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体迪米特法则:最少知道原则,一个实体应当尽量少的与其它实体发生相互作用,使得功能模块相互独立

4、线程池参数有哪些参数?同步工具类有哪些?CountDownLatch、Semaphore、CyclicBarrier

实现线程的方式:三种。拒绝策略:拒绝且抛错、拒绝不抛错、删除队列最老的线程、调用者线程自己执行

线程状态流转:

二、spring boot,spring cloud面试题。

spring事务注解失效的场景:

1.访问权限问题

2.方法用final修饰

3.方法内部调用

4.未被spring管理

5.多线程调用

6.表不支持事务

7.未开启事务

8.错误的传播特性

9.自己吞了异常

10.手动抛了别的异常,因为spring事务,默认情况下只会回滚RuntimeException(运行时异常)和Error(错误),对于普通的Exception(非运行时异常),它不会回滚。

11.自定义了回滚异常,因为如果使用默认值,一旦程序抛出了Exception,事务不会回滚,这会出现很大的bug。所以,建议一般情况下,将该参数设置成:Exception或Throwable。

12.嵌套事务回滚多了。

spring boot启动后执行方法的5种方式:

1.实现 CommandLineRunner 接口。

2.实现 ApplicationRunner 接口。

3.实现ApplicationListener 接口监听 ApplicationStartedEvent 或者 ApplicationReadyEvent事件。

4.@PostConstruct 注解

5.实现 InitializingBean 接口,重写afterPropertiesSet()方法。

spring boot启动流程分析:Spring Boot启动过程分析 - 简书

三、分布式事务解决方法

1、2PC(准备阶段、提交阶段)

2、3PC(canCommit、preCommit、doCommit)

3、TCC:Try - Confirm - Cancel

4、本地消息表(本地消息表顾名思义就是会有一张存放本地消息的表,一般都是放在数据库中,然后在执行业务的时候 将业务的执行和将消息放入消息表中的操作放在同一个事务中,这样就能保证消息放入本地表中业务肯定是执行成功的)

5、消息事务(RocketMQ )

(第一步先给 Broker 发送事务消息即半消息,半消息不是说一半消息,而是这个消息对消费者来说不可见,然后发送成功后发送方再执行本地事务。再根据本地事务的结果向 Broker 发送 Commit 或者 RollBack 命令。并且 RocketMQ 的发送方会提供一个反查事务状态接口,如果一段时间内半消息没有收到任何操作请求,那么 Broker 会通过反查接口得知发送方事务是否执行成功,然后执行 Commit 或者 RollBack 命令。)

6、最大努力通知(其实我觉得本地消息表也可以算最大努力,事务消息也可以算最大努力。)

四、rabbitMQ消息知识。

5种工作模式:简单队列(一对一)、工作模式(一对多)、订阅发布模式、路由模式(精确匹配路由key)、主题模式(使用topic,模糊查询)

怎么保证消息不丢失?

生产者丢消息:使用confirm+MQ事务

MQ丢消息:开启持久化,使用队列镜像

消费者丢消息:使用ACK机制

怎么保证不重复消费?

使用全局唯一ID

“死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况:

1、消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为false。

2、消息在队列的存活时间超过设置的TTL时间。

3、消息队列的消息数量已经超过最大队列长度。

五、分布式理论知识。

1. CAP理论

CAP理论是Eric Brewer教授在2000年提出 的,是描述分布式一致性的三个维度,分别是指:

(1)一致性(Consistency)

每次读操作都能保证返回的是最新数据;在分布式系统中,如果能针对一个数据项的更新执行成功后,所有的请求都可以读到其最新的值,这样的系统就被认为具有严格的一致性。

(2)可用性(Availablity)

任何一个没有发生故障的节点,会在合理的时间内返回一个正常的结果,也就是对于每一个请求总能够在有限时间内返回结果。

(3)分区容忍性(Partition-torlerance)

当节点间出现网络分区,照样可以提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。那么,什么是网络分区呢?分区是系统中可能发生的故障之一,可能有节点暂时无法提供服务:发生了像 长时间GC、CPU死循环、链接池耗尽或者是网络通信故障等问题。

2. BASE理论

BASE理论是eBay的架构师Dan Pritchett提出的,它的思想是:“即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性” 。

BASE理论有三项指标:

基本可用(Basically Available):是指分布式系统在出现不可预知故障的时候,允许损失部分可用性:比如响应时间、功能降级等;

软状态( Soft State):也称为弱状态,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点之间进行数据同步的过程存在延时;

最终一致性( Eventual Consistency):强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达成一致的状态。

BASE理论面向的是大型高可用、可扩展的分布式系统。BASE通过牺牲强一致性来获得可用性,并允许数据短时间内的不一致,但是最终达到一致状态。

常见的分布式算法

分布式算法 - 一致性Hash算法

一致性Hash算法是个经典算法,Hash环的引入是为解决单调性(Monotonicity)的问题;虚拟节点的引入是为了解决平衡性(Balance)问题

分布式算法 - Paxos算法

Paxos算法是Lamport宗师提出的一种基于消息传递的分布式一致性算法,使其获得图灵奖。自Paxos问世以来就持续垄断了分布式一致性算法,Paxos这个名词几乎等同于分布式一致性, 很多分布式一致性算法都由Paxos演变而来

分布式算法 - Raft算法

Paxos是出了名的难懂,而Raft正是为了探索一种更易于理解的一致性算法而产生的。它的首要设计目的就是易于理解,所以在选主的冲突处理等方式上它都选择了非常简单明了的解决方案

分布式算法 - ZAB算法

ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议), 它应该是所有一致性协议中生产环境中应用最多的了。为什么呢?因为他是为 Zookeeper 设计的分布式一致性协议!

分布式算法 - Snowflake算法

Snowflake,雪花算法是由Twitter开源的分布式ID生成算法,以划分命名空间的方式将 64-bit位分割成多个部分,每个部分代表不同的含义。这种就是将64位划分为不同的段,每段代表不同的涵义,基本就是时间戳、机器ID和序列数。为什么如此重要?因为它提供了一种ID生成及生成的思路,当然这种方案就是需要考虑时钟回拨的问题以及做一些 buffer的缓冲设计提高性能。

分享学习连接:

/hellozhxy/article/details/106381423?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106381423-blog-114505286.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106381423-blog-114505286.235%5Ev38%5Epc_relevant_anti_vip_base&utm_relevant_index=2

分布式一致性算法-Paxos、Raft、ZAB、Gossip - 知乎

六、MySQL知识。

innodb引擎的关键特性:双写、插入缓冲、异步IO、自适应哈希索引、刷新邻接叶。

B+树的数据结构是啥?插入和删除操作是怎么样子的?

索引的类型:聚簇索引、非聚簇索引、联合索引、主键索引、普通索引、覆盖索引、辅助索引

索引失效的情况:

MySQL锁:行锁的三种算法,行锁、间隙锁、next-key-lock(解决幻读问题)、不可重复读(MVCC解决)

脏读、幻读(数据新增或者被删除)、不可重复读(两个事务数据更新)问题

事务隔离级别:Read uncommitted、Read committed、Repeatable read、Serializable。

事务的四大特性:ACID

七、Redis知识。

1、基本的数据类型:string、set、zset、list、hash、geohash、hyperloglog

2.底层数据结构:SDS、压缩列表、快速列表、跳跃表、整数集合、字典、紧凑列表(listpack)、rax(基数树)字典树;

hash什么时候扩容?怎么扩容?哈希表元素等于一维数组的时候会扩容,但是不会强制(如果有BGSAVE),如果元素是一维数组的5倍,强制扩容。渐进式扩容,两个哈希表同时并存,先查找数量少的哈希表。

什么时候缩容?哈希表的元素低于一维数组的10%。

字符串怎么扩容的?最大多少?字符串小于1M是加倍扩容,大于1M是每次1M扩容,最大512MB。

Redis内存满了,怎么淘汰数据?LRU、随机删除、剩余TTL时间最短的

3.持久化方式:RBD\AOF,生产环境使用混合模式。

哨兵模式某个节点挂了怎么办?怎么选举的?

集群模式下数据如何分槽的?CRC(16) %16384,然后重定向。

Redis为什么单线程QPS却10W+? 线程模型,select\epoll。

为什么是16384个slot?消息大小考虑:尽管crc16能得到65535个值,但redis选择16384个slot,是因为16384的消息只占用了2k,而65535则需要8k,每秒都需要把本节点的心跳包同步给其他节点,8K的话心跳包太大了,浪费带宽。还有就是作者绝对不太可能超过1000节点,太多的话ping消息包可能会导致网络堵塞,因为节点越多,心跳包数据就会越多。

某个节点发生故障后,这个节点的数据怎么处理的?主从切换,然后判断是否需要副本漂移。

集群添加节点或者删除节点,如何扩容?分片迁移。

八、计算机网络。

1、网络7层和5层结构?

2、TCP三次连接和4次挥手过程?

/leezhxing/p/4524176.html

3、拥塞控制、快重传、慢启动、快恢复。TCP慢启动、拥塞避免、快速重传、快速恢复_帝壹的博客-CSDN博客

4、https工作流程

/linianhui/p/security-https-workflow.html

5、http 1.0 1.1 2.0区别

如何优雅的谈论HTTP/1.0/1.1/2.0 - 简书

九、操作系统。

1.CPU的调度算法:

链接:/xiaolincoding/p/13631224.html

3.CPU缓冲机制。

/jokerjason/p/10711022.html

十、架构

神奇的康威定律——组织决定产品形态 | 人人都是产品经理

DDD领域设计,看看这篇美团的,领域驱动设计在互联网业务开发中的实践 - 美团技术团队

每名开发人员都会遇到的8条编程法则_文化 & 方法_Adam Hughes_InfoQ精选文章

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。