面试笔记新

1、ConcurrentHashMap底层实现,CAS,原子引用,ABA问题,volatile?

ConcurrentHashMap是Java中一种线程安全的HashMap实现,它采用了分段锁的技术来提高并发读写的性能。

CAS(Compare and Swap)是一种乐观锁的实现,它通过原子操作来保证线程安全。CAS操作包括三个操作数:内存位置,预期原值和更新值,如果内存位置的值与预期原值相等,则更新为更新值,否则不更新。

原子引用是Java中的一种引用,它通过CAS操作保证了线程安全,使用原子引用可以避免加锁和同步的开销。

ABA问题是指在CAS操作中,由于线程的并发执行,导致内存位置的值被更新多次,导致预期原值与当前值不一致。为了避免ABA问题,ConcurrentHashMap采用了版本号(类似于时间戳)来判断内存位置的值是否发生变化。

volatile是Java中的一种关键字,它保证了变量的可见性,即当一个线程修改了一个volatile变量的值时,其他线程立即可以看到该变量的值。ConcurrentHashMap中使用了volatile关键字来保证分段锁的可见性。

2、并发修改异常解决办法?jdk8以后会使用红黑树优化
对于并发修改异常,常见的解决办法有以下几种:
  1. 加锁:在修改数据结构时加锁,从而避免多个线程同时修改数据结构。

  2. 同步:使用Java中的同步机制(如synchronized关键字)来保证数据结构的安全。

  3. 乐观锁:采用乐观锁的策略,如果修改失败则重试。

在jdk8中,ConcurrentHashMap在遇到并发修改异常时会使用红黑树来优化数据结构,从而提高效率。红黑树是一种平衡树,它保证了插入,删除和查询操作的复杂度为O(log n)。这样可以大大提高数据结构的性能,并避免并发修改异常的发生。

 3、红黑树和二叉平衡树的区别,红黑树和B树,B+树的区别,Mysql二大引擎索引底层实现,HashMap在多线程环境中为何出错
  1. 红黑树和二叉平衡树的区别:
  • 二叉平衡树是一种普通的平衡树,红黑树是二叉平衡树的一种变体。
  • 红黑树通过设置红黑规则来保证平衡,而二叉平衡树则通过重新构造树来保证平衡。
  • 红黑树的查询,插入和删除的时间复杂度为O(log n),而二叉平衡树的时间复杂度与具体的实现方法有关。
  1. 红黑树和B树/B+树的区别:
  • 红黑树是一种内存数据结构,而B树/B+树是一种磁盘数据结构。
  • 红黑树是一种键值对存储结构,而B树/B+树是一种索引存储结构。
  • 红黑树的查询,插入和删除的时间复杂度为O(log n),而B树/B+树的时间复杂度为O(log m),其中m为B树/B+树的阶。
  1. Mysql二大引擎索引底层实现:
  • MyISAM引擎:使用B+树存储索引信息。
  • InnoDB引擎:使用B树存储索引信息。
  1. HashMap在多线程环境中为何出错:
  • HashMap在多线程环境中不保证线程安全,如果多个线程同时修改HashMap中的数据,会出现不一致的
 4、什么是IOC,AOP?

IOC(控制反转)和AOP(面向切面编程)是软件工程中的两种设计思想。

IOC是指在软件编程中,由框架或容器在运行时决定被调用组件的具体实现,而不是在代码编写时硬编码。这样做可以使代码更加灵活,易于维护和测试。

AOP是一种编程范式,用于在程序运行期间动态地将关注点(例如日志记录,安全检查等)分离出来,从而使代码更加清晰和可维护。

总的来说,IOC和AOP的目的是提高代码的可读性,可维护性和可测试性。

5、数据库事务隔离级别,数据库的四大属性底层实现原理、Spring如何实现事务、传播行为

数据库事务隔离级别:

数据库事务隔离级别指的是在多个事务并发访问数据库时,保证数据一致性和完整性的策略。常见的隔离级别有:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。

数据库的四大属性(ACID)底层实现原理:

ACID是数据库事务的四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

原子性:数据库事务是不可分割的,要么全部完成,要么全部回滚;

一致性:在事务开始前和事务结束后,数据库的完整性约束没有被破坏;

隔离性:多个事务并发执行时,不同事务之间的执行不能互相影响;

持久性:事务一旦提交,对数据库的更改是永久性的。

底层实现原理:ACID的实现通常是通过使用日志文件、数据缓存、检查点等技术来保证数据的一致性和完整性。

Spring如何实现事务:

Spring通过使用事务管理器(Transaction Manager)实现事务

 

6、CAP,BASE理论,分布式事务的四种解决方案

CAP定理指出,分布式系统不可能同时提供以下三种保证:一致性、可用性和分区容差。

BASE(基本可用、软状态、最终一致)是一组用于构建可扩展、非关系数据库的设计原则。

有四种常见的解决方案可以解决分布式事务的挑战:

两阶段提交(2PC)-一种用于确保分布式系统中事务原子性的协议。

三阶段提交(3PC)-一种为确保分布式系统中事务的原子性提供额外阶段的协议。

乐观并发控制-一种允许多个事务乐观地进行的技术,假设冲突很少。

悲观并发控制-一种假设可能发生冲突并锁定资源以防止并发访问的技术。

 

 

 7、线程池实现原理,七大核心参数,如何合理的配置核心线程数?

线程池实现原理:

线程池是执行任务的工作线程的集合。当任务提交到池时,将分配一个工作线程来执行该任务。任务完成后,工作线程将返回到池以供重用。这减少了为每个任务创建和销毁线程的开销。

 

七大核心参数:

 

corePoolSize:池中要保留的线程数,即使它们空闲。

maximumPoolSize:池中允许的最大线程数。

keepAliveTime:多余的空闲线程在终止前等待新任务的最长时间。

unit:keepAliveTime参数的时间单位。

workQueue:用于在执行任务之前保存任务的队列。

threadFactory:执行器创建新线程时使用的工厂。

handler:由于达到线程边界和队列容量而导致执行受阻时要使用的处理程序。

如何合理的配置核心线程数:

应根据预期的并发任务数设置核心线程数。如果任务是CPU绑定的,那么内核线程的数量应该等于可用CPU内核的数量。如果任务是IO绑定的,那么在等待IO操作完成时,可能需要更多的线程来保持CPU忙碌。此外,工作队列的大小和最大池大小应根据预期任务到达率和完成任务的预期时间进行设置。

 
 8、线程池的拒绝策略:

线程池的拒绝策略是当线程池中的任务队列已满,并且线程数已经达到了最大数量时,线程池如何处理新任务的策略。常见的拒绝策略有:

  1. AbortPolicy: 直接抛出 RejectedExecutionException 异常。
  2. DiscardPolicy: 丢弃队列中最旧的任务,并执行新任务。
  3. DiscardOldestPolicy: 丢弃当前任务,执行队列中的下一个任务。
  4. CallerRunsPolicy: 直接在调用者线程中运行当前任务。

应用可以选择适合自己业务场景的拒绝策略,或者实现自己的拒绝策略。

9、JUC并发包:信号灯,循环栅栏,倒计时器

UC (Java Util Concurrent) 并发包是 Java 的一个并发工具包,提供了很多并发编程的工具类。

信号灯:Semaphore 是一种基于计数的信号量,用于控制同时访问特定资源的线程数量。

循环栅栏:CyclicBarrier 是一种同步工具,用于等待一组线程中的所有线程到达公共屏障点。

倒计时器:CountDownLatch 是一种同步工具,允许一个或多个线程等待其他线程完成操作。

这三种工具类都是 JUC 并发包中常用的工具,用于解决多线程间的同步问题。

 

10、Redis缓存数据类型的应用场景以及底层数据结构,数据同步问题(双删策略),缓存雪崩,缓存穿透,缓存失效,高并发场景下的分布式锁,热点缓存,哨兵机制,持久化(主从)

 

Redis 是一个开源的内存数据存储系统,支持多种数据结构,具有高性能和高可用性。

Redis 支持多种数据类型,如字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set)等,适用于不同的应用场景。

Redis 的数据结构是基于内存存储的,并且支持持久化,以防止内存数据丢失。

在 Redis 分布式环境中,数据同步问题是一个重要的考虑因素。Redis 采用了双删策略来保证数据的同步:当有节点向其他节点发送“删除”指令时,其他节点会进行两次删除,以确保数据已经同步删除。

缓存雪崩是指在高并发情况下,由于缓存同时失效,导致系统压力过大,服务不可用的情况。缓存穿透则是指查询的数据不存在,但请求却不断发送,给数据库造成了过多的压力。

缓存失效是指缓存数据过期,需要从数据源重新获取。高并发场景下的分布式锁可以解决多个线程同时访问

 

11、JVM算法,垃圾收集器,垃圾回收机制,JMM和JVM内存模型,JVM调优,双亲委派机制,堆溢出,栈溢出,方法区溢出,你都有哪些手段用来排查内存溢出?

VM(Java虚拟机)负责运行Java应用程序。与JVM相关的一些关键概念包括:

 

垃圾收集(GC)算法:JVM实现不同的GC算法,如串行、并行、CMS、G1等,以自动回收不再使用的对象占用的内存。

 

JVM内存模型:JVM内存模型定义JVM中的内存管理规则,包括堆内存和堆栈内存。JMM(Java内存模型)指定线程之间的内存可见性和排序规则。

 

JVM优化:为了提高JVM的性能,我们可以通过调整堆大小、GC算法等各种JVM参数来执行JVM调优。

 

类加载:JVM使用称为“父委派模型”的类加载机制将类加载到JVM中。

 

内存不足错误:内存不足错误可能发生在JVM的不同部分,包括堆、堆栈和方法区域。

 

为了解决内存泄漏问题,我们可以使用JVisualVM、JConsole或堆转储分析工具来确定问题的原因。当发生内存不足错误时,我们还可以使用-XX:+HeapDumpOnOutOfMemoryError等JVM标志来生成堆转储。

 

JVM性能故障排除:为了提高JVM的性能,我们可以使用各种评测工具,如YourKit、JProfiler或Java Flight Recorder来识别性能瓶颈并解决它们。

 

12、MySQL优化,索引限制条件

MySQL优化涉及通过更改各种配置参数、数据库设计、查询执行和索引来提高数据库系统的性能和效率。优化MySQL的一些常见技术是:

 

索引:索引是数据库优化的关键组成部分,因为它可以更快地检索数据。MySQL中的索引被组织为B树,允许基于索引关键字值快速搜索和检索数据。

 

查询优化:编写高效和优化的SQL查询可以提高数据库的性能。这包括选择适当的索引、使用正确的联接类型、避免子查询以及明智地使用聚合函数。

 

模式设计:一个设计良好的数据库模式可以通过减少查询执行过程中需要扫描和处理的数据量来大大提高数据库的性能。

 

配置优化:通过调整缓冲池大小、查询缓存、排序缓冲区大小等各种配置参数,可以提高MySQL数据库的性能。

 

索引限制条件:索引仅用于在查询条件与索引限制条件匹配时执行查询。这些条件包括索引中的列数、列的数据类型以及列的顺序。要充分利用索引,必须了解这些限制并相应地设计索引。

 

13、公平锁,非公平锁,可重入锁,递归锁,自旋锁,读写锁,悲观锁,乐观锁,行锁,排它锁,共享锁,表锁,死锁,分布式锁,AQS,Synchronized

计算机科学中的锁是同步访问共享资源的机制。并发编程中的一些常见锁类型包括:

公平锁:公平锁是一种确保等待线程按照请求的顺序被授予对共享资源的访问权的锁。

非公平锁:非公平锁不能保证等待线程访问共享资源的顺序。

重入锁:重入锁允许已获取锁的线程重新进入并再次获取该锁,而不会导致死锁。

递归锁:递归锁是一种特殊类型的可重入锁,允许线程重复锁定和解锁同一个锁。

自旋锁:自旋锁是一种使用忙等待来实现同步的锁。

读写锁:读写锁允许多个线程同时读取共享资源,同时确保一次只能有一个线程写入资源。

悲观锁:悲观锁是一种锁,它假定共享资源可能被修改,因此在对共享资源执行任何操作之前获取锁。

乐观锁:乐观锁是一种锁,它假定共享资源不太可能被修改,因此只在必要时获取锁。

行锁:行锁是一种锁,允许多个事务同时访问数据库表的不同行,同时确保访问同一行的事务是互斥的。

独占锁:独占锁是一种锁,它在锁被持有时阻止任何其他事务访问共享资源。

共享锁:共享锁是一种类型的锁,允许多个事务同时访问共享资源,但阻止任何事务在锁定时对资源进行修改。

表锁:表锁是一种锁,它锁定整个数据库表,防止任何事务在锁定时访问表。

死锁:死锁是指两个或多个线程在等待对方释放锁,从而导致永久阻塞的情况。

分布式锁:分布式锁是一种在分布式系统中使用的锁,用于确保一次只有一个节点可以访问共享资源。

AQS(AbstractQueuedSynchronizer):AQS是一个在Java中实现同步构造的框架。

Synchronized:Java中的Synchronized关键字用于确保一次只有一个线程可以访问共享资源。

 
 14、幂等性实现,单点登录,金额篡改问题,秒杀场景设计,库存超卖问题
  • 幂等性实现:幂等性指一个操作可以执行多次,但其结果不会随着执行次数的增多而改变。可以通过使用唯一请求 ID 来实现幂等性,避免同一个请求重复执行。

  • 单点登录:单点登录是指在多个应用程序或系统中,用户只需要登录一次,就可以在多个系统中使用相同的身份认证信息。可以通过使用令牌或 Session 实现单点登录。

  • 金额篡改问题:金额篡改问题指在一个多人合作的系统中,有人篡改金额。可以通过使用分布式事务或数字签名等技术解决。

  • 秒杀场景设计:秒杀场景需要考虑高并发和数据一致性问题。可以使用队列、分布式锁、限流、缓存等技术实现。

  • 库存超卖问题:库存超卖问题指在电商系统中,由于高并发请求和抢购导致库存不足,从而导致超额销售。可以通过使用队列、分布式锁、限流等技术解决。

 
 15、什么是OOM以及产生OOM的原因

JVM 内存不足 (OOM) 是 Java 虚拟机 (JVM) 在无法分配内存来执行操作时引发的错误。这可能是由于多种原因造成的,包括:

  1. 堆大小不足:如果 JVM 堆大小太小,无法满足应用程序的内存需求,则可能会出现 OOM。

  2. 内存泄漏:如果应用程序未正确释放对象和内存,JVM 堆可能会填满并导致 OOM。

  3. GC 性能不佳:如果垃圾回收器无法及时回收内存,则可能会出现 OOM。

要诊断 JVM OOM,您应该首先收集数据,包括 JVM 堆大小、GC 日志和内存转储。此数据可以帮助确定 OOM 错误的根本原因,并建议可能的解决方案,例如增加堆大小、修复内存泄漏或优化 GC 性能。

 
 16、怎么诊断OOM和解决

当JVM发生OOM (Out of Memory) 时,排查和解决方案包括以下步骤:

  1. 收集JVM内存使用情况,包括内存使用量、GC日志、线程栈信息等。

  2. 使用内存分析工具,如jmap、jhat、VisualVM等,来查看内存使用情况和对象占用情况。

  3. 检查代码是否存在内存泄漏,例如,是否存在无用的强引用对象或者循环引用。

  4. 调整JVM内存配置,例如,增大堆内存大小或减小元数据空间 (Metaspace) 大小。

  5. 优化代码,减少对象的生成速度或减少对象的生存时间。

  6. 使用内存池(如DirectByteBuffer)来限制内存使用量。

  7. 对于一些特殊场景,使用CMS或G1 GC来提高内存回收效率。

通过以上步骤,可以解决JVM OOM的问题,也可以预防未来的内存问题。

 

17、介绍一下Spring Cloud Netflix

Spring Cloud Netflix是Spring Cloud保护伞内的一个项目,它提供与Netflix的OSS组件的集成,用于构建微服务架构。Spring Cloud Netflix提供的一些核心组件包括:

  1. Eureka:一种服务发现机制,允许微服务注册自己并发现其他服务。
  2. Ribbon:为服务间通信提供客户端负载平衡的负载平衡库。

  3. Hystrix:为微服务提供容错和弹性的断路器库。

  4. Zuul:为微服务提供动态路由、安全和监控功能的 API 网关。

通过使用Spring Cloud Netflix,开发人员可以利用Netflix OSS组件来构建强大,可扩展且有弹性的微服务。Spring Cloud Netflix还提供了与Spring框架的抽象和集成,允许开发人员使用熟悉的编程模型和工具构建微服务。

 
18、springcloud五大组件:

1、注册中心组件(服务治理):Netflix Eureka;

2、负载均衡组件:Netflix Ribbon,各个微服务进行分摊,提高性能;

3、熔断器组件(断路器):Netflix Hystrix,Resilience4j ;保护系统,控制故障范围;

4、网关服务组件:Zuul,Spring Cloud Gateway;api网关,路由,负载均衡等多种作用;

5、配置中心:Spring Cloud Config,将配置文件组合起来,放在远程仓库,便于管理;

19、介绍一下nginx

Nginx(发音为“engine x”)是一个Web服务器,也可以用作反向代理,负载均衡器和HTTP缓存。Nginx的一些主要功能包括:

  1. 高性能:Nginx以其高性能和有效处理大量并发连接的能力而闻名。

  2. 反向代理:Nginx可以充当反向代理,将请求从客户端转发到后端服务器。

  3. 负载均衡:Nginx可以在多个服务器之间分配传入流量,提供高可用性和更好的性能。

  4. HTTP缓存:Nginx可以缓存频繁请求的内容,减少后端服务器的负载并缩短响应时间。

  5. 模块化架构:Nginx具有模块化架构,允许用户根据需要添加或删除功能,并根据自己的特定需求自定义配置。

Nginx被网站和Web应用程序广泛用于处理流量和提高性能。它是一个免费的开源软件,可以在各种平台上运行,包括Linux,macOS和Windows。

 

20、mybatis总结

MyBatis 是一个 Java 持久性框架,它提供了一种灵活高效的方式来与关系数据库进行交互。MyBatis 的一些主要功能包括:

  1. SQL 映射:MyBatis 允许您将 SQL 语句映射到 Java 对象,无需编写复杂的 SQL 代码并提高可维护性。
  2. 动态 SQL:MyBatis 支持生成动态 SQL,使构建复杂的动态查询变得容易。

  3. 对象关系映射(ORM):MyBatis提供了一个轻量级的ORM解决方案,允许您将关系数据映射到Java对象,反之亦然。

  4. 灵活配置:MyBatis 提供灵活的配置系统,支持您以多种方式配置数据源、事务和映射。

  5. 插件架构:MyBatis 有一个插件架构,允许您扩展其功能并向应用程序添加自定义行为。

MyBatis 广泛用于基于 Java 的应用程序,并提供了一种简单、快速和高效的方式来与关系数据库进行交互。它是一个免费的开源软件,可以很容易地与其他基于Java的框架集成,如Spring。

 

21、springboot的Hystrix熔断是怎么实现的
 

Hystrix是一个在Spring Boot中实现断路器模式的库。它提供了一种通过防止一个服务中的故障级联到其他服务来向微服务体系结构添加容错的方法。

Hystrix背后的基本思想是使用断路器包装对远程服务的调用,断路器监视服务的故障,并在故障达到某个阈值时打开电路并停止将请求转发到远程服务。这有助于防止级联故障并提高系统的整体稳定性。

Hystrix通过监控每次调用远程服务的响应时间和成功率来工作。当服务的故障率或响应时间超过指定的阈值时,Hystrix会打开电路并停止向服务转发请求。相反,Hystrix返回默认响应或回退到缓存的响应。

在Spring Boot中,可以通过添加“spring-cloud-starter-netflix-hy”将Hystrix添加到您的项目中。@HystrixCommand对方法的注释,以指示要使用 Hystrix 断路器包装方法调用。

下面是Spring Boot中一个简单的Hystrix实现示例:

@Service
public class MyService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String callRemoteService() {
// logic to call the remote service
}

public String fallbackMethod() {
return "Fallback response";
}
}

 

在此示例中,callRemoteService方法注释为@HystrixCommand,这表示方法调用应使用 Hystrix 断路器包装。这fallbackMethod被指定为断路器打开时要调用的回退方法。

callRemoteService方法执行后,Hystrix监控调用的响应时间和成功率。如果呼叫失败或时间过长,断路器将打开,并且fallbackMethod将改为调用。这有助于防止远程服务中的故障级联到系统的其他部分。

 
22、springboot的Hystrix熔断是做什么的

Spring Boot Hystrix是一个用于在微服务架构中实现断路器模式的库。断路器模式用于向系统添加容错能力,并防止一个服务中的故障级联到其他服务。

在微服务体系结构中,不同的服务通过网络相互通信。当其中一个服务失败或变慢时,它可能会导致依赖于它的其他服务中的故障连锁反应。断路器模式通过监视服务的运行状况并在检测到故障时“触发”断路器以停止将请求转发到故障服务来帮助防止这种情况。

Spring Boot Hystrix提供了一种简单灵活的方法,可以在Spring Boot应用程序中实现断路器模式。使用 Hystrix,您可以使用断路器包装对远程服务的调用,断路器将监视服务的故障,并在故障达到特定阈值时打开电路并停止将请求转发到远程服务。相反,Hystrix将返回默认响应或回退到缓存的响应,有助于防止级联故障并提高系统的整体稳定性。

总之,Hystrix是一个工具,可以帮助您为微服务架构添加容错能力,并防止一个服务中的故障影响其他服务。通过在 Spring 引导应用程序中使用 Hystrix,您可以提高系统的弹性和稳定性,并减少故障对用户的影响。

 
 23、Eureka的服务发现会延迟,而nacos不会出现这种情况
 Eureka和Nacos的服务发现性能之间的比较是一个有争议的问题。Eureka 和 Nacos 都是微服务架构中使用的服务发现解决方案,可用于缓解服务发现延迟。

但是,服务发现延迟对特定系统的实际影响取决于许多因素,包括服务数量、网络大小、服务发现过程的复杂性以及底层基础结构的性能。

话虽如此,Nacos 在设计时考虑了高性能和可扩展性,并具有缓存、动态负载平衡和多数据中心部署等功能,旨在最大限度地减少服务发现延迟。

相比之下,Eureka 具有更简单的架构,这可能使其更容易在中小型系统中设置和使用。但是,随着系统的扩展,由于其简单体系结构的限制,它可能会遇到延迟增加的情况。

最终,Eureka 和 Nacos 之间的选择将取决于您系统的特定要求,并且应基于对易用性、性能和可扩展性之间的权衡的仔细考虑。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2023-02-08 21:06  皇问天  阅读(55)  评论(0编辑  收藏  举报