温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JVM+Redis+SpringBoot的面试题有哪些

发布时间:2022-03-29 14:14:26 来源:亿速云 阅读:196 作者:iii 栏目:大数据

JVM+Redis+SpringBoot的面试题有哪些

目录

  1. JVM面试题
  2. Redis面试题
  3. Spring Boot面试题
  4. 综合面试题

JVM面试题

1.1 JVM内存模型

1.1.1 JVM内存区域划分

JVM内存区域主要分为以下几个部分:

  • 方法区(Method Area):存储类信息、常量、静态变量等。
  • 堆(Heap):存储对象实例和数组。
  • 栈(Stack):存储局部变量、操作数栈、动态链接、方法出口等。
  • 程序计数器(Program Counter Register):记录当前线程执行的字节码指令地址。
  • 本地方法栈(Native Method Stack):为Native方法服务。

1.1.2 堆内存的划分

堆内存主要分为以下几个部分:

  • 新生代(Young Generation):包括Eden区、Survivor区(From和To)。
  • 老年代(Old Generation):存放长期存活的对象。
  • 永久代(Permanent Generation):在JDK 8之前,用于存储类信息、常量、静态变量等,JDK 8之后被元空间(Metaspace)取代。

1.1.3 栈内存的划分

栈内存主要分为以下几个部分:

  • 虚拟机栈(VM Stack):每个线程私有的栈,存储局部变量、操作数栈、动态链接、方法出口等。
  • 本地方法栈(Native Method Stack):为Native方法服务。

1.2 垃圾回收机制

1.2.1 垃圾回收算法

  • 标记-清除算法(Mark-Sweep):标记所有需要回收的对象,然后清除。
  • 复制算法(Copying):将内存分为两块,每次只使用一块,当一块内存用完后,将存活的对象复制到另一块内存中。
  • 标记-整理算法(Mark-Compact):标记所有需要回收的对象,然后将存活的对象向一端移动,最后清理掉边界以外的内存。
  • 分代收集算法(Generational Collection):根据对象的存活周期将内存分为新生代和老年代,分别采用不同的垃圾回收算法。

1.2.2 垃圾回收器

  • Serial收集器:单线程收集器,适用于单CPU环境。
  • Parallel收集器:多线程收集器,适用于多CPU环境。
  • CMS收集器(Concurrent Mark Sweep):以获取最短回收停顿时间为目标的收集器。
  • G1收集器(Garbage-First):面向服务端应用的垃圾回收器,适用于大内存、多CPU环境。

1.3 类加载机制

1.3.1 类加载过程

  • 加载(Loading):通过类的全限定名获取类的二进制字节流,将字节流所代表的静态存储结构转化为方法区的运行时数据结构,生成一个代表该类的Class对象。
  • 验证(Verification):确保Class文件的字节流中包含的信息符合当前虚拟机的要求。
  • 准备(Preparation):为类的静态变量分配内存并设置初始值。
  • 解析(Resolution):将常量池中的符号引用替换为直接引用。
  • 初始化(Initialization):执行类的静态初始化代码和静态变量赋值。

1.3.2 类加载器

  • 启动类加载器(Bootstrap ClassLoader):负责加载JVM核心类库,如rt.jar。
  • 扩展类加载器(Extension ClassLoader):负责加载JVM扩展类库,如ext目录下的jar包。
  • 应用程序类加载器(Application ClassLoader):负责加载用户类路径(ClassPath)上的类库。
  • 自定义类加载器(Custom ClassLoader):用户自定义的类加载器,继承自ClassLoader类。

1.4 JVM调优

1.4.1 JVM参数调优

  • -Xms:设置JVM初始堆内存大小。
  • -Xmx:设置JVM最大堆内存大小。
  • -Xmn:设置新生代内存大小。
  • -XX:SurvivorRatio:设置Eden区与Survivor区的比例。
  • -XX:NewRatio:设置新生代与老年代的比例。
  • -XX:MaxPermSize:设置永久代的最大内存大小(JDK 8之前)。
  • -XX:MetaspaceSize:设置元空间的初始大小(JDK 8之后)。
  • -XX:MaxMetaspaceSize:设置元空间的最大大小(JDK 8之后)。

1.4.2 垃圾回收器选择

  • Serial收集器:适用于单CPU环境,适合客户端应用。
  • Parallel收集器:适用于多CPU环境,适合后台计算任务。
  • CMS收集器:适用于对响应时间要求较高的应用。
  • G1收集器:适用于大内存、多CPU环境,适合服务端应用。

Redis面试题

2.1 Redis数据结构

2.1.1 字符串(String)

  • SET key value:设置键值对。
  • GET key:获取键对应的值。
  • INCR key:将键对应的值加1。
  • DECR key:将键对应的值减1。

2.1.2 列表(List)

  • LPUSH key value:将值插入到列表的头部。
  • RPUSH key value:将值插入到列表的尾部。
  • LPOP key:移除并返回列表的头部元素。
  • RPOP key:移除并返回列表的尾部元素。

2.1.3 集合(Set)

  • SADD key member:向集合中添加一个元素。
  • SREM key member:从集合中移除一个元素。
  • SMEMBERS key:返回集合中的所有元素。

2.1.4 有序集合(Sorted Set)

  • ZADD key score member:向有序集合中添加一个元素。
  • ZREM key member:从有序集合中移除一个元素。
  • ZRANGE key start stop:返回有序集合中指定范围内的元素。

2.1.5 哈希(Hash)

  • HSET key field value:向哈希表中添加一个字段。
  • HGET key field:获取哈希表中指定字段的值。
  • HDEL key field:删除哈希表中指定字段。

2.2 Redis持久化

2.2.1 RDB持久化

  • RDB(Redis Database):将内存中的数据以快照的形式保存到磁盘上。
  • SAVE:同步保存数据到磁盘。
  • BGSAVE:异步保存数据到磁盘。

2.2.2 AOF持久化

  • AOF(Append Only File):将每次写操作追加到文件末尾。
  • appendonly yes:开启AOF持久化。
  • appendfsync always:每次写操作都同步到磁盘。
  • appendfsync everysec:每秒同步一次到磁盘。
  • appendfsync no:由操作系统决定何时同步到磁盘。

2.3 Redis集群

2.3.1 主从复制

  • 主从复制:主节点负责写操作,从节点负责读操作,主节点将数据同步到从节点。
  • SLAVEOF host port:将当前节点设置为指定主节点的从节点。

2.3.2 哨兵模式

  • 哨兵模式:通过哨兵节点监控主从节点的状态,当主节点宕机时,自动将从节点提升为主节点。
  • sentinel monitor mymaster 127.0.0.1 6379 2:监控主节点的状态。

2.3.3 集群模式

  • 集群模式:将数据分片存储在多个节点上,每个节点负责一部分数据。
  • CLUSTER MEET ip port:将节点加入集群。
  • CLUSTER ADDSLOTS slot:为节点分配槽位。

2.4 Redis事务

2.4.1 事务命令

  • MULTI:开启事务。
  • EXEC:执行事务。
  • DISCARD:取消事务。
  • WATCH key:监视一个或多个键,如果在事务执行之前这些键被其他命令修改,则事务将被打断。

2.4.2 事务特性

  • 原子性:事务中的所有命令要么全部执行,要么全部不执行。
  • 隔离性:事务中的命令在执行过程中不会被其他客户端打断。
  • 一致性:事务执行前后,数据保持一致。
  • 持久性:事务执行成功后,数据将被持久化到磁盘。

Spring Boot面试题

3.1 Spring Boot自动配置

3.1.1 自动配置原理

  • @EnableAutoConfiguration:开启自动配置。
  • @Conditional:根据条件决定是否加载某个配置类。
  • @ConfigurationProperties:将配置文件中的属性绑定到Java对象中。

3.1.2 自定义自动配置

  • @Configuration:定义一个配置类。
  • @Bean:定义一个Bean。
  • @ConditionalOnClass:当某个类存在时,才加载配置类。
  • @ConditionalOnMissingBean:当某个Bean不存在时,才加载配置类。

3.2 Spring Boot启动流程

3.2.1 启动流程概述

  • SpringApplication.run():启动Spring Boot应用。
  • ApplicationContextInitializer:在ApplicationContext创建之前执行初始化操作。
  • ApplicationRunner:在Spring Boot应用启动后执行某些操作。
  • CommandLineRunner:在Spring Boot应用启动后执行某些操作。

3.2.2 启动流程详解

  • 加载配置文件:加载application.properties或application.yml配置文件。
  • 创建ApplicationContext:创建Spring应用上下文。
  • 执行ApplicationContextInitializer:执行初始化操作。
  • 加载Bean定义:加载所有Bean定义。
  • 初始化Bean:初始化所有Bean。
  • 执行ApplicationRunner和CommandLineRunner:执行启动后的操作。

3.3 Spring Boot常用注解

3.3.1 核心注解

  • @SpringBootApplication:组合注解,包含@Configuration、@EnableAutoConfiguration、@ComponentScan。
  • @RestController:组合注解,包含@Controller和@ResponseBody。
  • @RequestMapping:映射HTTP请求到处理方法。
  • @Autowired:自动注入Bean。

3.3.2 配置注解

  • @Configuration:定义一个配置类。
  • @Bean:定义一个Bean。
  • @Value:注入配置文件中的属性值。
  • @PropertySource:加载指定的配置文件。

3.4 Spring Boot与微服务

3.4.1 微服务架构

  • 微服务架构:将单体应用拆分为多个小型服务,每个服务独立部署、独立运行。
  • 服务注册与发现:通过服务注册中心实现服务的注册与发现。
  • 服务调用:通过RESTful API或RPC调用其他服务。
  • 服务容错:通过熔断器、限流等手段保证服务的稳定性。

3.4.2 Spring Cloud

  • Spring Cloud:基于Spring Boot的微服务框架,提供了一系列微服务解决方案。
  • Eureka:服务注册与发现组件。
  • Ribbon:客户端负载均衡组件。
  • Feign:声明式REST客户端。
  • Hystrix:熔断器组件。
  • Zuul:API网关组件。

综合面试题

4.1 JVM与Redis的结合

4.1.1 Redis作为缓存

  • 缓存穿透:查询一个不存在的数据,导致请求直接打到数据库。
  • 缓存击穿:某个热点数据在缓存中过期,导致大量请求直接打到数据库。
  • 缓存雪崩:大量缓存数据在同一时间过期,导致大量请求直接打到数据库。

4.1.2 Redis与JVM内存管理

  • Redis内存管理:通过maxmemory参数限制Redis使用的最大内存。
  • JVM内存管理:通过-Xmx参数限制JVM使用的最大内存。
  • 内存溢出:当Redis或JVM使用的内存超过限制时,会导致内存溢出。

4.2 Spring Boot与Redis的结合

4.2.1 Spring Data Redis

  • Spring Data Redis:Spring提供的Redis操作框架。
  • RedisTemplate:用于操作Redis的模板类。
  • StringRedisTemplate:用于操作字符串类型数据的模板类。
  • @Cacheable:将方法的返回值缓存到Redis中。
  • @CacheEvict:清除Redis中的缓存。

4.2.2 Redis缓存配置

  • spring.redis.host:Redis服务器地址。
  • spring.redis.port:Redis服务器端口。
  • spring.redis.password:Redis服务器密码。
  • spring.redis.timeout:Redis连接超时时间。
  • spring.redis.database:Redis数据库索引。

4.3 JVM与Spring Boot的结合

4.3.1 JVM参数配置

  • -Xms:设置JVM初始堆内存大小。
  • -Xmx:设置JVM最大堆内存大小。
  • -Xmn:设置新生代内存大小。
  • -XX:SurvivorRatio:设置Eden区与Survivor区的比例。
  • -XX:NewRatio:设置新生代与老年代的比例。
  • -XX:MaxPermSize:设置永久代的最大内存大小(JDK 8之前)。
  • -XX:MetaspaceSize:设置元空间的初始大小(JDK 8之后)。
  • -XX:MaxMetaspaceSize:设置元空间的最大大小(JDK 8之后)。

4.3.2 Spring Boot性能调优

  • JVM参数调优:根据应用需求调整JVM参数。
  • 数据库连接池调优:调整数据库连接池的大小和超时时间。
  • 缓存调优:合理使用缓存,减少数据库访问。
  • 线程池调优:调整线程池的大小和队列长度。

以上是关于JVM、Redis和Spring Boot的面试题总结,涵盖了从基础到高级的各个方面。希望这些内容能够帮助你在面试中脱颖而出。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI