Java面试题

Js

变量是用于存储和表示数据的一个名字,可以用var、let或const关键词来声明
Js常见的数据类型 string、number、boolean、object、array和null和Undefined

Jsp

Jsp的基础概念:
Jsp是一种基于Java技术的服务器端编程技术
Jsp的生命周期加载:
初始化、执行、销毁
Jsp与servlet的关系:
servlet主要用于处理请求并生成数据模型,然后将数据模型传递给JSP页面进行展示,而Jsp主要用于表示层,即展示数据给用户。在实际的开发中,servlet通常用于处理请求并生成数据模型,然后将数据模型传递给jsp页面进行展示。Jsp可以通过内置对象(如request、session等)访问servlet传递过来的数据
Jsp中的指令和动作标签,jsp中有三种指令:page指令、include指令和taglib指令。其中page指令用于设置页面相关的属性(如语言、缓存等);include指令用于当前页面包含其他文件内容;taglib指令用于导入自定义标签库。JSP中的动作标签用于在JSP页面中执行特定的操作,如转发请求、包含其他内容、设置JavaBean属性值等。

Spring

Spring架构基础
Spring是一个开源的Java应用开发框架,旨在简化企业级应用的开发。它通过提供依赖注入(DI)和面向切面(AOP)等特性,帮助开发者可以更好的管理对象之间的依赖关系,提高代码的可重用性和可维护性。
Spring IOC容器
Spring Ioc容器是Spring框架的核心组件之一,负责创建、配置和管理应用对象其依赖关系。
它通过读取配置文件或注解信息,自动装配对象的依赖关系,实现对象的创建和初始化。Spring Ioc容器采用了一种反转控制(IOC)的设计模式,将对象的创建和管理权交给容器,
而不是由对象自己控制生命周期和依赖关系。有利于降低代码之间的耦合度,提高代码的可测试性和可维护性。

Spring Aop

Spring Aop是spring框架的另一个核心特性,它允许开发者在不修改现有代码的情况下,为应用添加新的功能和行为。Aop通过定义切点、通知和切面等概念,将横切关注点(如日志、事务管理等)从业务逻辑中分离出来,实现代码的模块化和复用。常见的aop使用场景包括日志记录、性能监控、事务管理、安全性控制等。
Spring事务管理
Spring事务管理允许开发者在应用程序定义和管理事务的边界和属性(如隔离级别、传播行为等)。支持声明式事务管理和编程式事务管理两种方式。声明式事务管理通过配置文件和注解方式实现,编程式事务管理通常与spring和ioc容器和aop技术结合使用,实现事务的自动提交和回滚

Spring MVC

Spring MVC是基于java的web开发框架,它采用了mvc的设计模式来组织代码结构。
Springmvc的主要组件包括前端控制器、处理器映射器、处理器适配器、控制器、模型和试图、视图解析器等。当用户发起一个http的请求时,前端控制器会根据请求的信息和处理器映射器找到对应处理器控制器,然后通过处理器映射器的相应方法来处理请求。处理器处理完请求后返回一个模型和视图对象给前端控制器,前端控制器再根据视图解析器的配置找到对应的视图进行渲染并返回给用户。
Spring boot
Springboot是一个快速构建spring应用的脚手架工具。它简化了spring应用的初始搭建和开发过程,通过提供自动配置和简化依赖管理等特性,使得开发者可以更快的创建和运行spring应用。
Spring cloud
Springcloud是一个基于springboot的微服务架构解决方案。它提供了一系列用于构建微服务应用的工具和组件,包括服务发现(eureka、consul等)、负载均衡(ribbon、fegin等)、断路器(hystrix)配置管理(config server)、消息总线(bus)等。

Tomcat

Tomcat是什么?
Tomacat是一个广泛使用的java servlet容器和web服务器用于运行一个servlet和jsp应用程序。它也可以作为一个独立的web服务器使用,或apache HTTP 服务器等其他web服务器一起使用。
如何在tomcat中配置ssl/tls以实现https的通信?
在tomcat中配置ssl/tls以实现https通信需要生成ssl证书并将其导入tomcat的密钥库中。然后在conf/ server.xml文件中配置 标签启用ssl/tls支持,并指定密钥库的位置和密码等相关参数。
Tomcat的性能调优参数有那些?
-xmn:设置堆新生代大小
-xss:设置每个线程堆栈的大小
-xx:NewRatio:设置年轻代(包括eden和survivor区)与年老代比值。
连接池大小、缓存策略等

Redis

Redis是什么?
Reid是一个开源的,内存中的数据结构存储系统,它可以用于做数据库、缓存和消息中间件。Redis支持多种类型的数据结构,如String、hashes、list、sets、sorted sets等类型
Redis缓存的作用是什么吗?
Redis主要用于存储常用的或重要的数据,通过缓存技术降低数据访问的延时,并提升系统的读取速度。通过将热点数据缓存到redis中,可以显著提高系统的访问速度,提升用户体验。
Redis缓存有哪些常见的使用场景?
– 缓存会话信息,如登录状态、购物车数据等
– 缓存热点数据,如网站首页的轮播图、商品详情页的数据等。
– 缓存一些计算量较大或查询较慢的数据,如数据库查询结果,计算结果等。
– 用作消息队列,实现分布式系统中的消息传递。
Redis的安全机制有哪些?
配置文件保护:使用reids的配置文件,将redis的访问权限设置为只允许本机访问。
访问控制:redis提供了auth命令,可以控制客户端的访问,设定特定的密码,只允许认证成功的客户端进行访问。
使用ssl加密:为reids提供ssl加密,将redis的传输信息加密,以防止数据被未授权的人获取到。
Redis缓存可能遇到的问题包括:
– 缓存击穿:一个存在于缓存中的热点数据,在某个时刻失效的情况下,同时有大量的请求访问这个数据。当缓存中的数据失效后,新的请求访问这个数据,发现缓存中没有这个数据,于是会将请求转发到后端数据库进行查询。这时由于大量请求同时访问数据库,导致数据库负载增加。解决方法包括把不存在的数据null存在缓存,或者布隆过滤器等技术。
– 缓存雪崩:如果大量请求查询的数据都不存在于缓存中,就会导致大量的请求到后端数据库,增加了数据库的负载,降低了系统性能。解决方法设置缓存的失效时间不要相同,或者对缓存进行预热等。
Redis的性能优化可以从多个方面入手
– 使用合适的数据类型
– 调整redis的配置参数:如调整内存分配策略、持久化策略等。
– 分布式部署redis集群,提高系统的处理能力和可扩展性。
– 监控和调优:使用redis的监控工具对系统进行实时监控,根据监控进行调优
Redis哨兵
Redis哨兵的作用和概念:
redis哨兵是一个独立的进程,用于监控redis主从服务器的运行状态。它的主要作用是自动发现和监控redis服务器的运行状态,并在主服务器宕机时自动进行故障转移,将从服务器切换为新的主服务器,从而保证redis集群的高可用性。
Redis哨兵如何监控redis集群:
Redis哨兵通过不断地向集群中的redis节点发送心跳检测来监控节点的健康状态。当哨兵检测到主节点失效时,会进行故障转移,选举新的主节点,并通知其他节点更新配置。
Redis哨兵如何实现故障转移:
– 哨兵之间会进行通信,确认主节点是否真的失效
– 选举出一个哨兵作为领导者来执行故障转移操作
– 领导者哨兵会从节点中选取一个作为新的主节点
– 领导者哨兵会更新集群的配置信息,并将新的主节点通知给所有其他哨兵和redis节点
Redis与主从复制的关系:
Redis哨兵与主从复制是相互依赖的。主从复制是redis实现数据备份和高可用性的基础,而哨兵则是用于监控和管理redis主从集群的进程。通过哨兵监控和管理,可以在主节点失效时自动进行故障转移,从而保证redis集群的高可用性
Redis哨兵的配置和使用:
在配置redis哨兵时需要指定哨兵监控的redis主节点地址和端口号,以及哨兵之间的通信方式(如IP地址和端口号)。同时,还需要配置哨兵进行故障转移时的相关参数,如选举新的主节点的规则、故障转移的超时时间等。
Reids哨兵的优势和限制:
Reids哨兵的优势在于能够自动监控和管理reids主从集群,实现故障转移和数据备份。但是,它也存在一些限制,如需要额外的资源来运行哨兵进程、在故障转移时可能会丢失部分数据等。

Mysql和mycat

数据库优化:
Sql语句的优化:
避免使用explain关键字分析sql语句的执行计划,确保它们按预期使用索引。
避免使用select *。而是指定需要查询的列
使用批量操作以减少数据库连接的开销
索引优化:
– 创建并合理使用索引以加速查询
– 定期优化和删除不必要的索引
数据库连接池:
使用数据库连接池以减少连接和断开的开销
根据负载调整连接池大小
分库分表后的优化:
确保分片策略合理,避免跨库或者跨表查询
监控分片后的数据库性能,并根据需要进行调整
主从复制的性能调优
监控主从复制的延迟,确保数据同步的实时性。
监控主从复制的配置参数,如binlog_format和sync_binlog等,以提高复制性能。
缓存的使用:
使用redis等缓存系统来缓存热点数据,减少对数据库的访问
合理配置缓存的过期时间和淘汰策略
硬件和配置优化:
根据数据库的负载调整硬件资源,如cpu、内存、磁盘等。
调整数据库配置参数,如inndb_buffer_pool_size、max_connections等,以适应实际的负载情况
Mysql主从复制
主从复制的配置:
在主服务器上启用二进制日志,并配置一个唯一的server-id.
在服务器上配置主服务器的连接信息,并指定要复制的主服务器上的数据库和表
Mysql分库分表
分库分表的策略:
垂直切分:按业务和功能进行拆分,不同的业务数据放到不同的数据库中。
水平切分:按某个字段(如用户ID)的某个规则(如哈希值)将数据拆分到不同的数据库或表中。
Mycat
mycat的特点:
支持多种分片策略,如基于范围、哈希、枚举等。
支持读写分离,自动将读请求路由到从服务器
支持全局事务,确保跨库事务的一致性

Rabbitmq

高并发处理方案:
1、数据重复
– 消息去重:在消费者端维护一个已处理消息的唯一ID集合,当接收到消息时,先检查其ID是否存在于集合中,如果存在则直接丢弃,避免重复处理。
– 幂等性设计:确保无论消息被处理多少次,对系统的影响都是相同的。这通常需要在业务逻辑层面进行设计和实现
– rabbitmq的确认机制:rabbitmq支持消费者手动消息,消费者在处理完消息后发送确认,rabbitmq才会将消息从会将消息队列中删除。这可以确保消息只被处理一次
2、消息丢失
– 持久化消息:在rabbitmq中,可以通过将队列和消息都设置为持久化来确保消息不会丢失。这样,即使rabbitmq服务器重启,消息也能保存下来
– 消费者确认机制:如前所述,rabbtimq支持消费者手动确认消息。消费者在处理完消息后发送确认,rabbitmq才会将该消息从队列中删除。如果消费者在处理消息时崩溃,rabbitmq会将消息重新放入队列,等待其他消费者处理。
– 生产者重试机制:在生产者发送消息时,可以配置重试机制。如果发送失败(如网络问题),生产者会在一段时间后重试发送消息
3、高并发处理
– 增加消费者数量:在高并发场景下,可以通过消费者的数量来提高消息的处理能力。Rabbitmq支持多个消费者同时消费同一个队列中的消息。
– 消息预取:rabbitmq允许消费者预取一定数量的消息进行并发处理。这样可以减少消费者与rabbitmq之间的网络交互次数,提高处理效率
– 负载均衡:在分布式环境中,可以使用负载均衡算法均匀地分发给不同的消费者节点,以实现负载均衡和分流
4、其他的注意事项
– 监控和告警:对rabbitmq集群进行实时监控,包括队列长度、消费者数量、消息处理速度等指标。当发现异常情况时,及时发出告警并采取相应的处理措施
– 资源限制与监控:合理设置rabbitmq节点所能够处理的最大连接数、最大通道数和最大队列数等资源限制。同时,通过监控工具实时监测系统使用情况,及时发现并解决潜在的性能问题

Mybatis-plus

Mybatis-plus的主要优点是什么?
– 提高开发效率:通过代码生成、分页、查询构建等功能
– 简化操作:提供常用api和工具,简化crud操作,批量操作等
– 提高代码可读性:提供lambda表达式API,使代码更简洁易读。
Mybatis-plus的主要api有有些?
– Querywrapper:用于构建查询条件
– Page:用于分页查询
– BaseMapper:提供基础CRUD操作接口

Elasticsearch(ES)

1、倒排索引:Elasticsearch底层依赖于Lucene库,它使用倒索引是一种将文档中的词项映射到包含这些词项的文档的列表的数据结构
2、增量更新:当B2C平台上的商品数据发生变化时(如新增商品、商品信息更新或删除商品),es能够通过增量更新的方式快速构建新的倒排索引。
3、自定义分词器和过滤器

多线程

生命周期:新建、就绪、运行、阻塞
新建状态的线程由JVM分配内存并初始化;就绪状态的线程等待获取CPU资源;运行状态的线程正在执行代码;阻塞状态的线程因为某种原因(如等待I/O)而暂停执行;死亡状态的线程表示该线程已经执行完毕或者因为异常而终止。
线程和进程的区别?
– 线程:线程是进程内的一个小的执行单元,多个线程共享同一个进程的内存和资源。线程之间可以更容易地共享数据和通信,因为它们处于同一个地址空间内
– 进程:每个进程都有独立的内存空间和系统资源,创建和销毁进程的开销相对较大。
什么是死锁,死锁的四个条件?
死锁(Deadlock)是指两个或多个进程在竞争资源时,因彼此之间的互斥和等待而陷入无限等待的状态,导致它们都无法继续执行下去。死锁是一种程序设计或系统管理的错误,它会导致应用程序无响应或挂起,需要手动干预才能解决。
死锁通常具备以下四个必要条件,也被称为死锁条件:
1、互斥条件
至少有一个资源是独占的,即一次只能被一个进程或线程占用。如果多个进程或线程同时需要访问这个资源,就会出现互斥条件。
2、请求与保持条件
进程或线程在持有至少一个资源的同时,又请求其它资源,但无法立即获得所需资源。这就会导致持有资源的进程或线程等待其它资源的释放,形成循环等待。
3、不可剥夺条件
资源不能被强制性地从一个进程或者线程中抢占,只能由占用它的进程或线程主动释放。
4、循环等待条件
多个进程或线程之间形成一个资源的循环等待,每个进程或线程都在等待下一个进程或线程所持有的资源,最终导致所有进程或线程都无法继续执行。
要解决死锁问题,需要破坏其中任何一个必要条件,以防止死锁的发生。
什么是线程饥饿现象?
线程饥饿(Thread Starvation)是指在多线程应用中,某些线程由于竞争有限的资源而无法获取执行的机会,导致它们长时间处于等待状态,无法完成其工作现象。线程饥饿通常是由于不公平的资源分配、锁竞争、线程优先级设置不合理等因素引起的。
产生线程饥饿有几个原因:
1、锁竞争
如果多个线程竞争获取某个锁,并且锁的分配不公平,某些线程可能会一直无法获得执行机会。这可能会导致低优先级线程长时间等待,无法执行。
2、线程优先级不均衡
如果线程的优先级设置不和理,高优先级线程可能会抢占资源,导致低优先级线程无法获得执行机会。这可能会导致低优先级线程长时间等待,无法长时间等待,无法执行。
3、资源瓶颈
当多个线程竞争有限的系统资源,如cpu时间、内存等时,某些线程可能会长时间等待资源的释放,导致线程饥饿。这种情况下,系统资源的不合理分配可能会导致线程无法平等地访问资源。
4、死锁
死锁是线程饥饿的一种极端状况,其中多个线程彼此等待对方释放资源,导致所有线程无法继续执行。
如何理解线程的同步与异步、阻塞和非阻塞?
同步(Synchronous)与异步(Asynchronous)
– 同步:在同步编程中,任务按照顺序执行,一个任务完成后,下个任务才会开始执行。这意味着任务之间的执行是相互依赖的,后一个任务通常会等待前一个任务完成才能执行。
– 异步:在异步编程中,任务可以并行执行,一个任务不必等待能一个任务完成九城继续执行。任务之间通常通过回调函数、事件处理或者异步操作来实现协作。异步编程有助于提高程序的响应性和效率。
阻塞(Blocking)与非阻塞(Non-Blocking)
– 阻塞:在阻塞模式下,当一个任务执行时,如果它需要等待某个资源或者事件完成,它会阻止其它任务的执行,直到资源或事件可用。这意味着任务会停滞在等待状态,无法执行其它工作。
– 非阻塞:在非阻塞模式下,任务可以继续执行。即使它需要等待某些资源和事件。任务会定期查询资源或事件资源状态,如果资源不可用,它可以执行其它工作而不会停滞。
这些概念组合在一起,产生四种不同的情况:
1、同步阻塞:任务按顺序执行,并等待资源时阻塞。
2、同步非阻塞:任务按顺序执行,但在等待资源时定期查询,可以执行其它任务
3、异步阻塞:任务可以并行执行,但在等待异步操作完成时阻塞。
4、异步非阻塞:任务可以并行执行,并且在等待异步时不会阻塞,可以继续执行其它任务

限流算法

1、漏桶算法:

– 原理:漏桶算法的主要目的是控制数据注入到网络的速率,平滑网络的突发流量。它可以将突发流量整形为稳定的流量,从而确保系统的稳定运行。
– 工作方式:漏洞算法可以看作是一个带有常量服务时间的服务器队列。当请求到达时,它们被看作是流入桶中的水。桶有一个固定的容量,这代表了系统能够处理的请求最大数量。桶底部有一个漏洞,水(即请求)以固定的速率从桶中漏出,这个速率代表的系统处理的请求速率。如果桶满了,新流入的水(请求)会被丢弃,直到桶中有足够的空间。
– 特点:漏桶算法能够强行限制数据的传输速率,确保系统处理速率不会超过设定的阈值。然而,在某些情况下,漏桶算法可能无法有效地使用网络资源,因为漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使一个单独的数据流达到端口速率。

2、令牌桶算法

– 原理:令牌桶算法主要用于控制发送到网络上的数据的数目,并允许突发数据的发送。它通过限制流量的平均值来稳定输出,并在短时间内应对高额流量
– 工作方式:令牌桶算法以固定的速率往桶内放入令牌。当请求到达时,如果桶内的令牌足够多,请求就会立马被处理。这意味着令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
– 特点:与漏桶算法相比,令牌桶算法更加灵活。它能够满足具有突发特性对的流量需求,因为只要桶内有足够的令牌,就可以处理突发的大量请求。这使得令牌桶算法在某些情况下比漏桶算法更加高效。
总结:漏桶算法和令牌桶算法在限流算法中各有优点。漏桶算法能够强制限制数据的传输速率,确保系统的稳定性;而令牌桶算法则更加灵活,能够满足突发特性流量需求。在实际的应用中,可以根据具体的场景和需求选择合适的算法。

例子:

在BtoC的应用程序中,漏桶算法和令牌算法通常用于处理与流量和速率相关的业务场景。

漏桶算法:
1、流量控制:在高并发的BtoC应用中,为了保护系统免受过载的影响,可以利用漏桶算法对流量进行控制。通过限制每个请求进入系统的速率,确保系统能够平稳处理请求。这在访问频率限制,API接口限流等场景中非常常见。
2、平滑网络传输:漏桶算法还可以用于平滑网络传输中的数据流。在BtoC应用程序中,当用户访问网站或应用时,会产生大量的网络请求。通过漏桶算法,可以固定传输速率,使得数据包以均匀的速度发送,避免网络拥塞和突发流量对网络性能造成的影响。
3、缓解突发流量压力:当BtoC系统面对 突发的流量压力时,如促销活动、新品发布等,漏桶算法可以起到缓冲的作用。通过设定合理的桶容量和出水速率,可以使系统在短时间内处理过载的请求,并释放剩余的请求。
令牌桶算法:
1、网络流量控制:在BtoC应用中,令牌桶算法同样可以用于,控制网络流量,防止网络拥塞和过载。与网络带宽和流量负载等参数结合,令牌桶算法可以动态调整发送数据的速率和数量,保证网络的稳定性和可靠性。
2、服务器资源管理:BtoC应用通常需要处理大量的用户请求和数据。为了确保服务器的稳定运行和资源的合理利用,可以利用令牌桶算法控制对服务器资源的访问,如CPU和内存,磁盘和网络等。通过控制请求的处理速率和资源分配,防止服务器过载和崩溃。
3、个性化推荐服务:在BtoC应用中,个性化推荐服务是一个重要的组成部分。由于每个用户的兴趣和行为都不同,因此需要实时处理大量的用户数据和请求。通过令牌桶算法,可以确保个性化推荐服务的处理速率和稳定性,提高用户体验和满意度。
4、个性化推荐服务:在BtoC应用中,个性化推荐服务是一个重要的组成部分。由于每个用户的兴趣和行为都不同,因此需要实时处理大量的用户数据和请求。通过令牌桶算法,可以确保个性化推荐服务的处理速率和稳定性,提高用户体验的满意度。

总结:需要注意的是,漏桶算法和令牌桶算法并不是互相排斥的,而是可以根据业务场景进行选择和组合。在实际应用中,可以根据系统的特点、流量特性以及性能要求等因素来选择合适的限流算法,已达到最佳的效果。

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米奇妙妙wu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值