Java题库自整理

1.Spring、SpringMVC和SpringBoot

Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。

SpringMVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等。SpringMVC是一个MVC的开源框架,SpringMVC=struts2+spring,springMVC就相当于是Struts2加上Spring的整合。

SpringBoot是一个微服务框架,延续了spring框架的核心思想IOC和AOP,简化了应用的开发和部署。Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题—>习惯大于约定。


区别与总结:Spring包含了SpringMVC,而SpringBoot又包含了Spring或者说是在Spring的基础上做得一个扩展。

关系:spring mvc < spring < springboot

结论:Spring Boot只是Spring本身的扩展,使开发,测试和部署更加方便。

Spring Boot 对比Spring的一些优点包括:

  1. 提供嵌入式容器支持
  2. 使用命令java -jar独立运行jar
  3. 在外部容器中部署时,可以选择排除依赖关系以避免潜在的jar冲突
  4. 部署时灵活指定配置文件的选项
  5. 用于集成测试的随机端口生成

2.kafka 中如何保证数据消息不丢失

kafka 中消息传输的整个过程:

1、kafka 在producer 端产生消息,调用kafka producer client send方法发送消息

2、kafka producer client 使用一个单独的线程,异步的将消息发送给kafka server

3、kafka server收到消息以后,保存数据,并同步至副本

4、消息保存完成以后,返回给kafka producer client 端 【消息发送成功】

5、kafka consumer client 调用poll 方法,循环 从kafka server 端获取消息列表

6、kafka consumer 端 从kafka server获取到消息以后,开始消费消息

7、kafka consumer 消费消息完毕以后,向kafka server(topic为 _offset_consumer的消息队列) 发送偏移量
整个流程中,消息丢失的情况分为以几种可能性:

1、producer 端 发送消息给kafka server 端,中间网络出现问题,消息无法送达

2、kafka server端 在收到消息以后,保存消息时发生异常,异常分为三种

(1)可重试错误,通过重试来解决

(2) 网络连接错误

(3)无主(no leader)错误

3、consumer 在消费消息时发生异常,导致consumer端消费失败

注:当然这里还可能发生另一种错误,就是在producer发送消息到kafka server端时,消息体过大,producer client 直接抛出异常,导致发送失败
解决:

1、producer 端的发送方式优化

producer总共有三种发送方式:1、简单发送,无需关心结果   2、同步发送    3、异步发送

采用第一种方式发送时,消息丢失时应用程序是无感知的,如果需要保证消息的不丢失,那么必须要选择第二种或者第三种(需要配合下一节中讲到的acks 参数),当然这里更推荐第三方种方式。

2、producer端的配置优化

acks:该参数指定了,kafka server的多少个副本收到消息以后才算真的正消息发送成功。取值范围:

acks = 0 表示producer 在将消息成功写入到 kafka server 之前不会收任消息
acks = 1 表示只要kafka server 集群中的leader节点收到消息,producer 端就会收到kafka server的成功响应
acks = all 表示只有当消息到leader节点,并且这条数据也同步到了所有副本中,producer 才会收到kafka server的成功响应。
retries:生产端发送消息到kafka server时,发生临时性错误以后,生产者发送消息到kafka server端重试的次数。如果重试超过该次数,则发生异常

解决办法:可以通过设置配置项 acks 、retries 来保证数据的不丢失。acks=1时,lead节点只要收到消息就会告诉producer消息接收成功,假如此时lead 挂掉了开始重新选主,选主成功后之前lead收到的那条消息就会丢失,如果需要保证消息的绝对不丢失,建议设置 acks =all
kafka server:kafka的server端同一个topic下有多个分区,单个分区会有不同的副本

broker中的配置项,unclean.leader.election.enable = false,表示不允许非ISR中的副本被选举为首领,以免数据丢失。

ISR:是指与leader保持一定程度(这种范围是可通过参数进行配置的)同步的副本和 leader 共同被称为ISR

OSR:与leader同步时,滞后很多的副本(不包括leader)被称为OSR

AR,分区中所有的副本统称为AR。AR = ISR + OSR
 

3.TCP和UDP

TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

TCP和UDP有什么区别

1、TCP面向连接,通过三次握手建立连接,四次挥手取消连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。
2、TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、 数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达;而UDP由于无需连接的原因,将会以最大速度进行传输,但不保证可靠交付,也就是会出现丢失、重复等等问题。
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。
4、每一条TCP连接只能是点到点的;而UDP不建立连接,所以可以支持一对一,一对多,多对一和多对多的交互通信,也就是可以同时接受多个人的包。
5、TCP需要建立连接,首部开销20字节相比8个字节的UDP显得比较大。
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

4.CMS收集器和G1收集器的区别 

CMS收集器G1收集器

使用范围不一样

CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用
STW的时间CMS收集器以最小的停顿时间为目标的收集器。G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
垃圾碎片CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片
垃圾回收的过程不一样

1. 初始标记   

2. 并发标记           

3. 重新标记          

4. 并发清楚          

1. 初始标记

2. 并发标记

3. 最终标记

4. 筛选回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值