java日常面试题

一、HTTP与HTTPS的区别

1、传输协议

HTTP是超文本传输协议,默认的工作端口是80,明文传输,数据都是未加密的,安全性较差

HTTPS是超文本传输安全协议,默认的工作端口是443,数据传输过程是加密的,安全性较好

2、页面响应速度

HTTP是使用 TCP 三次握手建立连接,页面响应速度块

HTTPS除了TCP的三次握手,还需要进行SSL握手,共计12个包,因此相对较慢

3、证书

HTTP不需要证书

HTTPS需要到数字证书认证机构(CA)申请证书,一般免费证书较少,因此需要一定费用

二、线程和进程

1、线程

是操作系统调度的最小单元

2、进程

是操作系统分配资源的最小单元,是一个在内存中运行的应用程序

三、线程池的使用场景

1、批量的数据迁移

2、保存文件

3、优惠券码的生成

四、线程的状态

线程有五种状态:新建(new)、就绪(runnable)、运行(running)、阻塞(block)、终止(dead)

1、

1、初始状态(NEW):新创建了一个线程对象

2、可运行状态(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权

3、运行状态(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码 

4、阻塞状态(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态

5、死亡状态(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生 

五、如何让线程阻塞

1、Thread.sleep():这是最常用的阻塞方法之一。它允许线程暂停执行指定的时间,时间单位为毫秒。当时间到达后,线程会重新进入可运行状态。通常用于等待某个资源变得可用或者进行定时操作

2、Object.wait():这个方法会导致当前线程进入等待状态,同时释放持有的锁,直到其他线程调用相同对象的notify()或notifyAll()方法。这种方法通常用于线程间的协作,例如在生产者-消费者模型中

3、Thread.join():当一个线程A调用另一个线程B的join()方法时,线程A会阻塞,直到线程B完成执行。这通常用于等待另一个线程完成其工作

六、MySQL中有哪几种锁

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

 2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高

 3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

七、Spring 声明式事务无效可能的原因有哪些?

1、扫描包的时候 spirng-ioc.xml和 spring-mvc.xml 的包里面的 component-scan重复导致失效

2、自定义的异常,如果 RunTime 异常没写或者写了大于 RunTime 异常的话,也会事务失效

3、在写异常的时候,自己 try..catch了,导致异常返回通知的 AOP 扫描不到异常,导致事务失效

4、环绕通知没有去调用核心方法,导致事务失效

5、MySQL 使用的是MyISAM(存储)引擎,而 MyISAM 是不支持事务的

6、@Transactional使用在非 public 方法上,@Transactional 注解只能支持 public 级别,其他类型声明的事务不会生效

7、@Transactional 在同一个类中无事务方法 A()内部调用有事务方法 B()那么此时 B() 事务不会生效

八、TCP三次握手,四次挥手

三次握手
客户端A 服务端B
A发送syn同步请求,携带一个随机生成的初始化序列号,B接受到,会回一个syn加ack,对A的一个确定,A收到后再回一个ack对B进行最终确认

TCP四次挥手
A发送一个fin的结束标识,B收到了后说OK,就回一个ACK,回完后会有一个close with的一个等待状态,因为B可能还有一些数据没有传输完,传输完后再回给A一个fin的一个结束标识,表示我也结束了。然后A最终再回一个ACK,然后等待一个2倍的MSL的时长,如果没有收到B那边重复投来的标识,就标识结束了。
等待2倍的MSL,MSL是一个信息再网络沿途中的最长存活时间,2倍就是往返,确保这段时间内B会不会再重发fin

九、tcp通信出现中断用什么排查

tcp dump

十、Java垃圾回收的工作原理

垃圾回收主要是发现和删除无用的对象,GC对堆进行管理,堆是存放对象的区域
Java堆划分为两个区域或者说世代,年轻代,老年代
新创建的对象首先放在新生代,新生代满了会被GC清理那些无用对象,多次清理还存活的对象会被移到幸存者区。
如果一个对象再幸存者区存活时间够长,或者幸存者区满了,就会被放到老年区,当老年区满了GC再进行清理

十一、为什么分新生代和老年代

提升整体的性能,效率,还有作用

十二、哪些方式可以避免死锁

死锁分为java语言层面和mysql数据库层面
java层面首先可以预防死锁,在资源分配下可以静态分配资源避免死锁,或者对资源进行有序分配,对资源进行编号,进程只能采用序号递增的形式申请资源。还有一种银行家算法,它是预分配,就是模拟一个场景,你来申请资源,我模拟分配给你,然后对分配之后的状态进行评估,如果产生问题,那么分配就是作废的,然后发现死锁后可以用阿尔萨斯来排查问题,解决问题

十三、线程池的作用

java中,每次创建一个新线程,开销是相当大的。--在实际使用中, 创建和销毁线程花费的时间和消耗的系统资源都相当大,而线程池其实就是一个 容纳多个线程的容器 ,其中的线程可以反复使用,省去了频繁创建线程对象的操作 ,--无需反复创建线程而消耗过多资源

十四、线程池的7大参数

核心线程数、阻塞队列、最大线程数、拒绝策略、空闲线程存活时间、工作队列、time unit时间单位
1、corePoolSize 核心线程数量
线程池中会维护一个最小的线程数量,线程处于空闲状态,也不会被销毁
2、maximumPoolSize 线程池最大线程数
线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制
3、keepAliveTime 空闲线程存活时间
指定时间后,这个空闲线程会被销毁
4、unit keepAliveTime的单位
计量单位
5、workQueue 工作队列
新任务被提交后,会先进入到工作队列中,任务调度时再从队列中取出任务
6、threadFactory 线程工厂
创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等
7、handler 拒绝策略
工作队列中的任务已到达最大,并且线程池中的线程数量也达到最大,这时如果有新任务提交进来就需要拒绝策略

十五、Elasticsearch如何与MySQL同步

可以使用Logstash作为中间件来实现Elasticsearch与MySQL的同步。Logstash是一个开源的数据收集、处理和传输工具,可以将MySQL中的数据实时同步到Elasticsearch中
可以使用canal
1、安装和配置 Canal 服务器:这通常包括下载 Canal 服务器的安装包或者从源代码构建,并在 canal.properties 文件中配置数据库连接信息、监听的数据表和认证等参数。
2、启动 Canal 服务器:启动配置好的 Canal 服务器后,它会连接到 MySQL 数据库并开始监控指定数据表的数据变更。
3、编写消费端应用程序:消费端可以是任何自定义程序,负责从 Canal 服务器获取数据库变更数据并进行处理。通常会使用 Canal 提供的客户端 SDK(例如 Java 客户端)来连接到 Canal 服务器并订阅特定的数据库和数据表。
4、处理接收到的变更数据:在消费端程序中编写逻辑来处理这些变更数据,比如将数据写入其他系统、存储或消息队列等。
5、将数据写入 Elasticsearch:在消费端程序中,可以使用 Elasticsearch 的 Java 客户端库(如 Elasticsearch RestHighLevelClient)将数据写入 Elasticsearch。具体来说,可以创建一个 Elasticsearch 索引,并将数据以文档的形式写入该索引。
6、配置 Elasticsearch 索引映射:为了确保数据能够正确地被搜索和分析,需要为 Elasticsearch 索引配置适当的映射。这可以通过创建索引模板或直接在索引上设置映射来实现。
7、测试和验证同步效果:完成上述步骤后,可以对同步过程进行测试和验证,以确保数据能够正确地从 MySQL 同步到 Elasticsearch。

十六、RocketMQ和RabbitMQ的区别

1、RocketMQ设计目标是处理大规模、高并发的场景,具有高吞吐量和良好的扩展性
2、RabbitMQ强调的是消息的可靠传递和灵活性,具有稳定性
3、RocketMQ的生产者丢数据  采取send()同步发消息,发送结果是同步感知的。发送失败后可以重试,设置重试次数。默认3次。(2)发送失败的消息会存储在Commitlog中
4、RabbitMQ的生产者丢数据  提供transaction(事务,支持回滚)和 ACK给生产者来确保生产者不丢消息

十七、业务超时锁怎么续命

1、可以创建一个守护线程,也成为看门狗线程,这个线程的任务是实时监控业务线程的执行情况。如果发现业务线程仍在执行中,且未达到预定的超时时间,守护线程就会将锁的过期时间延长
2、可以使用Redisson工具类,Redisson会启动一个守护线程,这个线程会定期检查锁的状态,并在必要时对锁进行续期

十八、RocketMQ消息堆积了怎么解决

1、增加消费者数量
消息消费不过来了,那就把消费者的数量增加一下,让更多人的实例来消费这些消息。
2、提升消费者速度
引入线程池、本地消息存储后即返回成功 后续再慢慢消费
3、清理过期消息
定期清理一些过期的消息
4、调整RocketMQ的配置参数
根据实际情况来调整 消息消费模式、消息拉取间隔时间这些参数,从而优化消息消费的效率
5、增加Topic队列数
通过增加队列数来提高消息的处理并发度,从而减少消息堆积。

十九、Java中压力测试是如何实现的

1、使用JMeter工具 J mi te,模拟大量用户并发访问系统,从而对系统进行压力测试
2、使用LoadRunner工具,模拟数以万计的用户并发访问系统,并对系统进行压力测试
3、JUnit是Java编程语言的一个单元测试框架,也可以用于压力测试。通过编写测试用例,并使用多线程或循环调用这些测试用例,可以模拟高并发的场景对系统进行压力测试

二十、项目的qps是多少

QPS(每秒查询率),在我们的性能测试中,系统能够处理的QPS在4000到6000之间,具体取决于请求的类型和服务器的负载情况

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值