7.18 面试

面一:


1. interface 和abstract

为什么要使用接口,接口+实现(Impl)好处是什么
  1. 接口是一种特殊的抽象类,比抽象类更加抽象。若不考虑多继承问题;
  2. 只有抽象方法的抽象类是可以代替接口的。
  3. 接口的目的不是减少工作了 约定优于配置(Convention Over Configuration),

2. like 和 in 的执行差别

  1. in查询相当于多个or条件的叠加,例如:
  2. like是广泛的模糊匹配

3. sql 执行顺序

在这里插入图片描述

4. spring依赖注入最底层的原理

反射是读取持久堆上存储的类信息。而 ASM 是直接处理 .class 字节码的小工具
反射只能读取类信息,而 ASM 除了读还能写。
反射读取类信息时需要进行类加载处理,而 ASM 则不需要将类加载到内存中。
反射相对于 ASM 来说使用方便,想直接操纵 ASM 的话需要有 JVM 指令基础。

5. 反射和动态代理关系

反射作用总结就是:1.动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。2.应用程序需要在运行时从某个特定的程序集中载入一个特定的类。

那么什么是动态代理呢?先给出百度的答案:动态代理,就是根据对象在内存中加载的Class类创建运行时类对象,从而调用代理类方法和属性。

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。而代理模式又分为静态代理和动态代理,先说静态代理。

静态代理通俗点将就是自己手写一个代理类,而动态代理则不用我们手写,而是依赖于java反射机制,下面以一个demo举例。

6. spring 创建bean的几种方式

1、空参构造方法

2、静态工厂方法

3、实例工厂

7. 垃圾回收算法

标记—清除算法(Mark-Sweep)
复制算法
标记—整理算法(Mark-Compact)
分代收集算法

8. 创建线程


面二:

1、JVM内存结构
线程私有 线程共享 两部分
堆、方法区
本地方法栈、Java虚拟机栈、程序计数器、元空间、直接内存
jmm是规范

2、字符串常量在哪个区域,类文件常量池在哪个区域

3、类加载有哪些过程

4、类加载器

5、软引用和弱引用的区别
在内存足够的时候,软引用对象不会被回收,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。
弱引用对象相比较软引用,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象

7、垃圾收集算法
标记清除(碎片化)
复制算法(浪费空间)
标记整理算法(效率比前两者差)
分代收集算法(老年代一般使用“标记-清除”、“标记-整理”算法,年轻代一般用复制算法)

8、JVM怎么判断哪些对象需要删除哪些不用删除
根据GC Root进行查找标记

9、CMS垃圾收集器收集的过程?
CMS 工作机制相比其他的垃圾收集器来说更复杂,整个过程分为以下 4 个阶段:
初始标记
只是标记一下 GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。
并发标记
进行 GC Roots 跟踪的过程,和用户线程一起工作,不需要暂停工作线程。
重新标记
为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。
并发清除
清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停工作线程。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户线程一起并发工作, 所以总体上来看CMS 收集器的内存回收和用户线程是一起并发地执行。

10、G1垃圾收集器收集的过程?
Garbage first 垃圾收集器是目前垃圾收集器理论发展的最前沿成果,相比与 CMS 收集器, G1 收集器两个最突出的改进是:

  1. 基于标记-整理算法,不产生内存碎片。
  2. 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。
    G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间, 优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保 G1 收集器可以在有限时间获得最高的垃圾收集效率。

12、synchronized锁升级
偏向锁
在 JDK1.8 中,其实默认是轻量级锁,但如果设定了 -XX:BiasedLockingStartupDelay = 0 ,那在对一个 Object 做 syncronized 的时候,会立即上一把偏向锁。当处于偏向锁状态时, markwork 会记录当前线程 ID 。
升级到轻量级锁
当下一个线程参与到偏向锁竞争时,会先判断 markword 中保存的线程 ID 是否与这个线程 ID 相等,如果不相等,会立即撤销偏向锁,升级为轻量级锁。每个线程在自己的线程栈中生成一个 LockRecord ( LR ),然后每个线程通过 CAS (自旋)的操作将锁对象头中的 markwork 设置为指向自己的 LR 的指针,哪个线程设置成功,就意味着获得锁。关于 synchronized 中此时执行的 CAS 操作是通过 native 的调用 HotSpot 中 bytecodeInterpreter.cpp 文件 C++ 代码实现的,有兴趣的可以继续深挖。
升级到重量级锁
如果锁竞争加剧(如线程自旋次数或者自旋的线程数超过某阈值, JDK1.6 之后,由 JVM 自己控制该规则),就会升级为重量级锁。此时就会向操作系统申请资源,线程挂起,进入到操作系统内核态的等待队列中,等待操作系统调度,然后映射回用户态。在重量级锁中,由于需要做内核态到用户态的转换,而这个过程中需要消耗较多时间,也就是"重"的原因之一。

13、CAS的问题
ABA问题,可以用版本号来避免这个问题。
具体可以看这篇:
https://blog.csdn.net/summerZBH123/article/details/80642467

14、LongAdder原理
LongAdder类与AtomicLong类的区别在于高并发时前者将对单一变量的CAS操作分散为对数组cells中多个元素的CAS操作,取值时进行求和;而在并发较低时仅对base变量进行CAS操作,与AtomicLong类原理相同。
具体可以看这篇:
https://www.jianshu.com/p/ec045c38ef0c

18、加密和签名的区别
加密是为了防泄露
签名是为了防伪造、防篡改

19、对称加密与非对称加密的区别

21、分布式session

22、微服务有什么好处

24、spring cloud有哪些组件

  • Spring Cloud Netflix:核心组件,可以对多个Netflix OSS开源套件进行整合,包括以下几个组件:
    • Eureka:服务治理组件,包含服务注册与发现
    • Hystrix:容错管理组件,实现了熔断器
    • Ribbon:客户端负载均衡的服务调用组件
    • Feign:基于Ribbon和Hystrix的声明式服务调用组件
    • Zuul:网关组件,提供智能路由、访问过滤等功能
    • Archaius:外部化配置组件
  • Spring Cloud Config:配置管理工具,实现应用配置的外部化存储,支持客户端配置信息刷新、加密/解密配置内容等。
  • Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以及触发后续的处理
  • Spring Cloud Security:基于spring security的安全工具包,为我们的应用程序添加安全控制
  • Spring Cloud Consul : 封装了Consul操作,Consul是一个服务发现与配置工具(与Eureka作用类似),与Docker容器可以无缝集成

25、微服务网关的好处

26、MySQL回表
具体可以看这篇:
https://www.jianshu.com/p/8991cbca3854

27、覆盖索引
具体可以看这篇:
https://www.cnblogs.com/happyflyingpig/p/7662881.html

28、索引下推
具体可以看这篇:
https://blog.csdn.net/mccand1234/article/details/95799942

29 、Redis事务
Redis事务的概念:
  Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
  总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。  
Redis事务没有隔离级别的概念:
  批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。
Redis不保证原子性:
  Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

可以看这篇:
https://www.cnblogs.com/DeepInThought/p/10720132.html

30、缓存击穿/穿透
可以看这篇:
https://baijiahao.baidu.com/s?id=1655304940308056733

34、TCP中的time_wait状态
具体可以看这篇:
https://www.cnblogs.com/cenglinjinran/p/8482412.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值