掌门一对一面试总结

1.a>b与a-b>0的区别

参考文章:https://blog.csdn.net/asd991936157/article/details/52033118

总结:

  • a>b在计算机中不一定等于a-b>0,比如Integer.MAX_VALUE-(-1)将得到一个-2147483648的负数。
  • 比如一个32位的操作系统,会预留一位作为符号位,比如Integer.MAX_VALUE二进制位数为:01111111111111111111111111111111,加一后二进制位数为:10000000000000000000000000000000红色代表的是符号位这个时候变成了负数

2.一共了解几种单例模式

参考文章:https://www.jianshu.com/p/3bfd916f2bb2

  • 懒汉式、延迟初始化,线程不安全
  • 饿汉式、线程安全,但是一开始就初始化
  • 双重检查锁模式、需要用volatile修饰否则,非线程安全
  • 静态内部类单例模式、只有一个线程可以获得对象的初始化锁,其他线程无法进行初始化,保证对象的唯一性。由jvm内部保证的线程安全,推荐使用
  • 枚举单例模式、线程安全但可读性差

3.了解哪些设计模式以及装饰模式与代理模式的区别

常用设计模式:
  • 单例模式、避免创建多个实例造成资源浪费

  • 工厂方法模式、生产对象的一种创建型模式,如FactoryBean

  • 策略模式、在多种算法类似的情况下避免过多的if else、通常配合一个接口多个实现来实现的

  • 模板模式、定义一个模板通常是接口,然后由子类去实现;很容易和策略模式混淆,

  • 策略模式 核心在 使用者的策略。模板方法模式 核心在 子类的 怎么实现,策略模式包含了模板模式。如jdbcTemp

  • 代理模式、代理类在客户端与目标对象之间起到一个中介作用和保护目标对象的作用,其特征是代理类和委托类实现相同的接口。可以用代理类来增强委托类的功能。
    装饰模式、现有的对象添加新的功能,同时又不改变其结构,保持类方法完整性的前提下,提供了额外的功能。但是会使类变得复杂

  • 装饰模式与代理模式的区别:
    装饰模式主要是强调对类中代码的拓展,而代理模式则偏向于委托类(使用代理对象的类)的访问限制,委托类不能直接访问被代理的对象;

4.synchronized与lock的区别,AQS实现锁的缺点

表面区别:

  • 存在层面的区别、synchronized是关键字存在jvm层面,lock属于类

  • 释放锁的区别、synchronized会自动释放锁,lock需要手动释放否者死锁

  • 获取锁的区别、synchronized获取不到锁会一直等待、lock可以根据返回不用等待

  • 类型的区别、synchronized可重入 不可中断 非公平,lock可重入可中断可公平/不公平

实质区别:

  • synchronized基于监视器锁(monitor)来实现的,每个对象都有一个监视器锁,能自动权衡自旋与暂时放弃获取锁,同时有锁的粒度的粗化等优化

  • lock锁基于AQS实现,而AQS同步锁的实现类似于CAS,长时间获取不到锁的情况下自旋将导致浪费cpu资源

5.缓存穿透、缓存雪崩解决方案

参考文章:https://mp.weixin.qq.com/s/JCFx-GNjueLLOEjWMKbLRQ

缓存雪崩
简介:缓存设置相同的过期时间导致大面积失效、给数据库造成巨大压力
解决:加锁通常是分布式锁、加队列、设置不同的缓存时间、使用缓存标记:每个缓存额外增加一个是否存在的状态,先判断是否存在在取缓存的值,通常缓存的值的时间是缓存标记的时间两倍用于脏读
缓存穿透
简介:通常是用户查询数据、数据库中没有,自然缓存中也没有,导致每次从缓存中查不到数据每次都要去数据库中查一遍
解决:空的记录也要缓存避免缓存穿透
缓存击穿
简介:缓存击穿表示数据库中有缓存没有,并发又太大数据库压力瞬间增大
解决:热点数据用不过期、加互斥锁、队列

缓存击穿与缓存雪崩的区别:击穿是并发查询同一条数据、雪崩是不同数据都过期了

6.多线程的几种实现方式

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口通过FutureTask包装器来创建Thread线程
  • 线程池的方式

7.线程一共有哪些状态

初始态(NEW)
运行态(RUNNABLE),运行态包括 就绪态 和 运行态。
阻塞态(BLOCKED)
等待态(WAITING)
超时等待态(TIMED_WAITING)
终止态(TERMINATED)

8.了解哪些内存溢出

以下均属于错误而不是异常:

  • java.lang.StackOverflowError
    默认栈的大小为0.5m~1m,超出这个大小将发生栈溢出错误。导致原因:深度的方法调用,出不来了。
  • java.lang.OutOfMemoryError:Java heap space
    堆内存溢出异常。导致原因:大对象无法被回收,或者大量对象无法回收,撑爆设定的虚拟机设置的空间
  • java.lang.OutOfMemoryError:GC overhead limit exceeded
    导致原因:GC回收时间过长,并且收效甚微,回收到很少的内存。如果不抛出内存很快填满,GC再次运行,CPU100%,却没什么成果。
  • java.lang.OutOfMemoryError:Direct buffer memory
    直接内存溢出异常,多见于nio与netty框架中,ByteBuffer.allocteDirect(capability),堆内存很少使用jvm也不会回收,但是本地内存已经使用完了,再次尝试分配就会出现OutOfMemoryError
  • java.lang.OutOfMemoryError:unable to create new native thread
    操作系统线程数量是有限制的,root用户没有限制普通用户liunx默认最多为1024个线程,如果超过这个数量就会报这个异常,当然是可配置的。
  • java.lang.OutOfMemoryError:Metaspace
    元空间溢出异常,元空间存储虚拟机加载的类信息,常量池,静态变量,即时编译后的代码,这些存放超过元空间指定大小就会报这个异常

9.内存溢出与内存泄露区别

内存溢出表示内存不够用了,内存泄露表示使用结束时未及时释放清理,导致一直占用内存,使得实际内存减少好像内存泄露了一样

10.如何快速定位内存溢出

  • 根据日志排查
  • 使用jamp指令生成dump文件、然后使用MAT工具进行分析

11.服务器动态缩减方案

  • LB(Load Balancing),负载均衡方案
  • 代表:硬负载均衡F5、软负载均衡nginx,HAProxy
  • 根据负载均衡算法关闭某些服务费访问
  • 常用的负载均衡算法:最小请求、随机、加权随机、哈希、轮询

12.一致性hash算法

https://mp.weixin.qq.com/s/AYwarOGR7We1WO5u41onGQ

  • 假如redis使用hash算法,当需要增加一台机器的时候需要全部重新计算hash值,扩容的这段时间内存失效的,容易造成内存雪崩。hashmap用的就是hash算法
  • 一致性hash算法,构造出一个2^32个虚拟槽位置俗称hash环、redis每个节点进行hash找到对应的槽的位置。数据key进行hash,确定在换的位置,然后从此位置顺时针行走,遇到第一个节点就是应该定位的服务器。如果其中后一个不幸宕机了,它的数据会移动到其它的节点;
  • 一致性hash数据倾斜问题:同一个节点可以多次hash构造多个hash节点

13.bio与nio的区别

http://www.pianshen.com/article/9423291755/
https://my.oschina.net/ljhlgj/blog/1811319

  • BIO:同步阻塞IO、收到连接请求后一直阻塞(阻塞io),直到数据就绪后读取或者写入完成;
  • NIO:同步非阻塞IO、收到连接请求后立即返回(非阻塞io),然后定时轮询检查是否有数据就绪;
  • 同步:触发IO操作并等待或者轮询的去查看IO操作是否就绪(亲力亲为且专注于一件事)
  • 异步: 异步是指用户进程触发IO操作以后便开始做自己的事情

14.springboot配置文件加载顺序

  通过启动命令配置spring.config.location 改变默认配置,此优先级最高
  默认加载顺序依次为:
   file:./config                     文件根目录的config目录最高
   file:./                              文件根目录其次
   classpath:/config/          classpath的config目录下依次
   classpath:/                       classpath  目录下最后

15.springboot获取属性有哪些方式

@value 适合单个值
@ConfigurationProperties 适合类对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值