常见面试问题

一、开场白

自我介绍,项目经验(介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的技术细节;这一块主要考察应聘者对自己做过的事情是否有清晰的描述,判断做的事情的复杂度)

2、JVM

垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

垃圾回收算法:
1、标记清除 实现起来比较容易,但容易产生内存碎片
2、复制算法 运行高效且不容易产生内存碎片,但是很消耗内存空间,
3、标记整理
4、分代收集

类的加载过程是什么?简单描述一下每个步骤

加载、验证、准备、解析、初始化、使用、卸载

JVM 预定义的类加载器有哪几种?分别什么作用?
1.启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中
2.扩展(Extension)类加载器:。它负责将
< Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。
3.应用程序类加载器

什么是双亲委派模式?有什么作用?

启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器。。

双亲委派模式:
类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,
如果父类加载器可以完成类加载任务,就成功返回;
只有父类加载器无法完成此加载任务时,才自己去加载

防止内存中出现多份同样的字节码

什么是内存溢出, 内存泄露? 他们的区别是什么?

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现OOM;
内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

总结:
内存溢出:就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存泄漏:是指你向系统申请分配内存进行使用(new) ,可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。

引起类加载操作的行为有哪些?

1.遇到 new、getstatic、putstatic 或 invokestatic 这四条字节码指令。
2.反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
3.子类初始化的时候,如果其父类还没初始化,则需先触发其父类的初始化。
4.虚拟机执行主类的时候(有 main( string[] args))。

介绍一下 JVM 提供的常用工具

jps:用来显示本地的 Java 进程,可以查看本地运行着几个 Java 程序,并显示他们的进程号。 命令格式:jps
jinfo:运行环境参数:Java System 属性和 JVM 命令行参数,Java class path 等信息。 命令格式:jinfo 进程 pid
jstat:监视虚拟机各种运行状态信息的命令行工具。 命令格式:jstat -gc 123 250 20
jstack:可以观察到 JVM 中当前所有线程的运行情况和线程当前状态。 命令格式:jstack 进程 pid
jmap:观察运行中的 JVM 物理内存的占用情况(如:产生哪些对象,及其数量)。 命令格式:jmap [option] pid

Full GC 、 Major GC 、Minor GC 之间区别?

Minor GC: 从新生代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。
Major GC: 清理 Tenured 区,用于回收老年代,出现 Major GC 通常会出现至少一次 Minor GC。
Full GC: Full GC 是针对整个新生代、老年代、元空间(metaspace,java8 以上版本取代 perm gen)的全局范围的 GC。

什么时候触发 Full GC ?

1.调用 System.gc 时,系统建议执行 Full GC,但是不必然执行。
2.老年代空间不足。
3.方法区空间不足。
4.通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存。
6.由 Eden 区、survivor space1(From Space)区向 survivor space2(To Space)区复制时,对象大小大于 To Space 可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。

3、Java并发

什么是可重入锁、乐观锁、悲观锁、公平锁、非公平锁、独占锁、共享锁?

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据
公平锁:指的是多个线程按照申请锁的顺序来获取锁
非公平锁:指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁

可重入锁: 当两个线程使用的是不同的对象锁的时候,线程无法被锁住,还是会并发执行
当两个线程使用的是同一个对象锁的时候,线程会被锁住,因为只有一个锁,就产生了互斥,一个线程得到锁,另一个只能等待
同一个线程拿到锁时,锁可以被重入,即在拿到该锁的代码块,还可以获取并使用该锁
可重入锁最大的作用就是:防止死锁

独占锁:指该锁一次只能被一个线程所持有,
共享锁:指该锁可被多个线程所持有

讲讲ThreadLocal 的实现原理?

ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值

ThreadLocal 作为变量的线程隔离方式,其内部是如何做的?

每个线程持有一个ThreadLocalMap对象。每创建一个新的线程Thread都会实例化一个ThreadLocalMap并赋值给成员变量threadLocals,使用时若已经存在threadLocals则直接使用已经存在的对象;否则的话,新创建一个ThreadLocalMap并赋值给threadLocals变量。

说说InheritableThreadLocal 的实现原理?

InheritableThreadLocal主要用于子线程创建时,需要自动继承父线程的ThreadLocal变量

并发包中锁的实现底层(对AQS的理解)?

抽象同步队列器
state、lockThread

讲讲独占锁 ReentrantLock 原理?

基于AQS
在这里插入图片描述

4、Java集合

HashSet 和 TreeSet 有什么区别?

一、实现方式
HashSet:HashSet是哈希表实现的。
TreeSet:TreeSet是二差树实现的。
二、数据是否有序
HashSet:HashSet中的数据是无序的。
TreeSet:Treeset中的数据是自动排好序的。
三、是否可以放入null值
HashSet:可以放入null,但只能放入一个null。
TreeSet:不允许放入null值。

HashSet 的底层实现是什么?

HashSet:HashSet是哈希表实现的。

LinkedHashMap 的实现原理?

双向链表
LinkedHashMap使用的是LRU算法(最近最少使用)

为什么集合类没有实现 Cloneable 和 Serializable 接口?

克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。

什么是迭代器 (Iterator)?

Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。
采用指针的方式

Iterator 和 ListIterator 的区别是什么?

1、Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
2. listIterator有add方法,可以向集合中添加元素,而iterator不能。
3、Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

synchronized 和Lock区别

1.来源:
lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;
2.异常是否释放锁:
synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
3.是否响应中断
lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断;
4.是否知道获取锁
Lock可以通过trylock来知道有没有获取锁,而synchronized不能;

5、Spring全家桶

Spring bean的生命周期能不能结合源码回答一下这个问题、或者结合一下bean的生命的意义来回答,就是Spring为什么需要找个生命周期

1.获取 BeanName,对传入的 name 进行解析,转化为可以从 Map 中获取到 BeanDefinition 的 bean name。
2.合并 Bean 定义,对父类的定义进行合并和覆盖,如果父类还有父类,会进行递归合并,以获取完整的 Bean 定义信息。
3.实例化,使用构造或者工厂方法创建 Bean 实例。
4.属性填充,寻找并且注入依赖,依赖的 Bean 还会递归调用 getBean 方法获取。
5.初始化,调用自定义的初始化方法。
6.获取最终的 Bean

Spring容器当中包含了哪些常用组件(至少说5个),作用是什么,场景是什么;比如BeanDefinition;再比如BeanDefinitionMap

Spring自动注入的原理是什么?能不能从源码来说明一下这个问题;我们常常说的自动注入,到底怎么注入的?有什么坑?怎么让你一个属性不自动注入

Spring源码当中如何来搞定循环依赖的?Spring支持循环依赖?生命情况不支持?支持的原理是什么?能不能从源码来说明一下?

spring三级缓存

spring ioc 和aop

spring是ioc和aop的轻量级容器

ioc:控制反转,用依赖注入(反射机制),将实例的初始化交给spring容器来管理,
ioc的反射机制允许我们不重新编译代码,因为它的对象是动态生成的。

aop是面向切面编程,是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,
便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
用于权限、日志 (适配器模式)

如何来二次扩展Spring,比如自定义一个实现自动注入的注解;不使用@Autowried,自己如何开发一个@XXX来完成自动注入?

mybatis源码当中利用了Spirng的那些扩展?mybatis扩展Spring之后有哪些问题是无法解决的?比如二级缓存怎么解决

eureka源码当中如何扩展的Spring?比如怎么动态插拔eureka的功能,利用了Spring的那个技术点,或者从源码说一下

6、Redis

Redis 持久化机制有哪些? 区别是什么?优缺点是什么?

RDB:全量备份,非常适合用于进行备份和灾难恢复。在快照持久化期间修改的数据不会被保存,可能丢失数据。
AOF:AOF可以更好的保护数据不丢失,非常适合做灾难性的误删除的紧急恢复;AOF日志文件通常比RDB数据快照文件更大,AOF开启后,支持的写QPS会比RDB支持的写QPS低

Redis支持的数据类型

string、hash、list、set、zset

###为什么 Redis 需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特性。

Redis 是单线程的吗?

是的

  1. Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目
  2. 效率提升, Epoll最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,
  3. 内存拷贝, Epoll 在这点上使用了“共享内存”,这个内存拷贝也省略了。

Redis 的过期策略和内存淘汰机制

过期策略:
 Redis采用的是惰性删除和定期删除两种策略。
 惰性删除:不管键是否过期,只有每次取值的时候,才检查是否过期,过期就删除。
 定期删除:每隔一段时间,程序对数据库进行一次(随机)检查,过期的就删除。
 
内存淘汰机制:LRU,内存不足时,淘汰最近最少使用的key。

1.在过期时间的数据集中,随机淘汰一个
2.在过期时间的数据集中,快过期的淘汰
3.在过期时间的数据集中,最少使用的淘汰
4.在数据集中,随机淘汰一个
5.在数据集中,最少使用的淘汰
6.禁止驱逐数据

什么是缓存命中率?提高缓存命中率的方法有哪些?

尽可能的聚焦在高频访问且时效性要求不高的热点业务上(如字典数据、session、token),通过缓存预加载(预热)、合理调整缓存有效期的时间 (避免同时失效)、增加存储容量、调整缓存粒度、更新缓存等手段来提高命中率。

Redis全局命令及数据库管理

Redis设计订单应用场景

Redis缓存雪崩讲讲看?

缓存雪崩是指 设置缓存时采用了相同的过期时间,导致缓存在某一个时刻同时失效,或者缓存服务器宕机宕机导致缓存全面失效,请求全部转发到了DB层面,DB由于瞬间压力增大而导致崩溃。

  1. 对缓存的访问,如果发现从缓存中取不到值,那么通过加锁(互斥锁)或者队列的方式保证缓存的单进程操作,从而避免失效时并并发请求全部落到底层的存储系统上;但是这种方式会带来性能上的损耗
  2. 将缓存失效的时间分散,降低每一个缓存过期时间的重复率
  3. 应用程序中可以采用多级缓存

什么是缓存穿透?

缓存穿透是指查询一个根本不存在的数据,缓存和数据源都不会命中

  1. 如果查询数据库也为空**,直接设置一个默认值存放到缓存**,这样第二次到缓冲中获取就有值了,而不会继续访问数据库
  2. 根据缓存数据Key的设计规则,将不符合规则的key进行过滤采用布隆过滤器

Redis重启时加载AOF与RDB的顺序

.aof和rdb都开启,只会加载aof,因为aof最能保证数据的完整性

7.中间件

Dubbo完整的一次调用链路介绍;


提供者端启动 容器负责把Service信息加载 并通过Protocol 注册到注册中心 ;
消费者端启动 通过监听提供者列表来感知提供者信息 并在提供者发生改变时 通过注册中心及时 通知消费端 ;
消费方发起 请求 通过Proxy模块利用Cluster模块来选择真实的要发送给的提供者信息交由Consumer中的Protocol 把信息发送给提供者 ;
提供者同样需要通过 Protocol 模块来处理消费者的信息 最后由真正的服务提供者 Service 来进行处理;

Dubbo支持几种负载均衡策略?

1.权重随机算法:RandomLoadBalance
2.最少活跃调用数算法:LeastActiveLoadBalance
3.一致性哈希算法:ConsistentHashLoadBalance
4.加权轮询算法:RoundRobinLoadBalance

Dubbo Provider服务提供者要控制执行并发请求上限,具体怎么做?

ExecuteLimitFilter ,在服务提供者,通过 <dubbo:service /> 的 “executes” 统一配置项开启:
表示每服务的每方法最大可并行执行请求数。

Dubbo启动的时候支持几种配置方式?

1.XML 配置文件方式
2.properties 配置文件方式
3.annotation 配置方式
4.API 配置方式

了解几种消息中间件产品?各产品的优缺点介绍;

消息中间件如何保证消息的一致性和如何进行消息的重试机制?

Spring Cloud熔断机制介绍;

Spring Cloud对比下Dubbo,什么场景下该使用Spring Cloud?

8、分布式

消息中间件如何解决消息丢失问题

Dubbo的服务请求失败怎么处理

重连机制会不会造成错误

对分布式事务的理解

如何实现负载均衡,有哪些算法可以实现?

Zookeeper的用途,选举的原理是什么?

数据的垂直拆分水平拆分。

zookeeper原理和适用场景

zookeeper watch机制

redis/zk节点宕机如何处理

分布式集群下如何做到唯一序列号

如何做一个分布式锁

用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗

MQ系统的数据如何保证不丢失

列举出你能想到的数据库分库分表策略;分库分表后,如何解决全表查询的问题。

9、数据库

MySQL InnoDB存储的文件结构

索引树是如何维护的?

数据库自增主键可能的问题

MySQL的几种优化

mysql索引为什么使用B+树

数据库锁表的相关处理

索引失效场景

高并发下如何做到安全的修改同一行数据,乐观锁和悲观锁是什么,INNODB的行级锁有哪2种,解释其含义

数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值