面试经验二

说说mysql?

MySQL是一个关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

AQS、阻塞队列?

AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。

AQS是自旋锁:在等待唤醒的时候,经常会使用自旋(while(!cas()))的方式,不停地尝试获取锁,直到被其他线程获取成功

阻塞队列?

当阻塞队列为空时,从队列中获取元素的操作将会被阻塞,就好比餐馆休息区没人了,此时不能接纳新的顾客了。换句话,肚子为空的时候也没东西吃。

当阻塞队列满了,往队列添加元素的操作将会被阻塞,好比餐馆的休息区也挤满了,后来的顾客只能走了。

JUC常用工具类?

countDownLatch(相当于减法计数器,就是指一个线程必须等待一些线程执行完以后,才能够往下执行)

cyclibarrier(相当于加法计数器,就是指一个线程必须等待足够多的线程一起到达执行语句时,才能通过,否则线程会自己调用awai方法,等待线程足够多时将被唤醒)

semaphore(计数控制器)用于限制访问某些资源的线程数,有acquire获取许可和release释放线程两个方法

线程安全的类

  • ConcurrentHashMap
  • CountDownLatch、CyclicBarrier
  • Semaphore
  • BlockingQueue
  • ThreadPoolExecutor
  • ReentrantLock、ReentrantReadWriteLock
  • CompletableFuture

线程池七大参数?

核心线程数、最大线程数、最大空闲时间、时间单位、任务队列、线程工厂、拒绝策略

mysql的索引有使用过吗?

  • 普通索引:一个索引只包含一个列,一个表可以有多个单列索引。
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
  • 聚簇索引:也称为主键索引,是一种数据存储方式。B+Tree结构,非叶子节点包含健值和指针,叶子节点包含索引列和行数据。一张表只能有一个聚簇索引。
  • 非聚簇索引:不是聚簇索引,就是非聚簇索引。叶子节点只是存索引列和主键id。如果sql还要返回除了索引列的其他字段信息,需要回表,第一次索引一般是顺序IO,回表的操作属于随机IO。回表的次数越多,性能越差。此时我们推荐覆盖索引

怎么知道索引如何生效?

explain函数验证索引是否有效

explain显示了MySQL如何使用索引来处理select语句以及连接表。他可以帮助选择更好的索引和写出更优化的查询语句

有什么参数?

select_type:表示 SELECT 的类型。

table:输出结果集的表。

possible_keys:表示查询时,可能使用的索引。

key:表示实际使用的索引。

key_len:索引字段的长度。

rows:扫描行的数量。

Extra:执行情况的说明和描述。

JVM包含哪些东西?

JVM包含两个子系统和和两个组件,

两个子系统为类装载(Class Loader)和执行引擎(Execution engine);

两个组件为运行时数据区(Runtime data area),本地接口(Native Interface)。
类装载(Class Loader):根据给定的全限定名类名(如:java.lang.Object)来装载class 文件到 运行时数据区(Runtime data area )中的方法区(method area)
执行引擎(Execution engine):执行classes 中的指令。
本地接口(Native Interface) :与native libraries 交互,是其他编程语言交互的接口。
运行时数区域(Runtime data arae):这就是我们常说的JVM 内存

强引用和弱引用?

当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题

在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

举例说Object的方法?wait

知道其他可以让线程等待的方法吗?

在这里插入图片描述

HashMap底层原理?扩容机制?默认参数?负载因子?

内部由数组和链表组成,非线程安全。JDK1.7和1.8的主要区别在于头插和尾插方式的修改,头插容易导致HashMap链表死循环,并且1.8之后加入红黑树对性能有提升。

  • put插入:key 计算hash值,取模,找到数组位置,如果数组中没有元素直接存入,反之,则判断key是否相同,key相同就覆盖,否则就会插入到链表的尾部。如果链表的⻓度超过8且数据总量超过64,则会转换成红黑树。最后判断元素个数是否超过默认的⻓度(16)*负载因子(0.75),也就是12,超过则进行扩容。
  • get查询:计算出hash值,然后去数组查询,是红黑树就去红黑树查,链表就遍历链表查询就可以了。

IOC?

IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦

IOC也叫依赖注入(DI)

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

AOP动态代理?

面向切面编程

AOP中的代理说是由AOP框架动态生成的一个对象,该对象可以作为目标对象使用。Spring 中的AOP有两种,JDK动态代理,CGLIB代理

JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。

CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用字节码技术,对指定的目标类生成一个子类,并对子类进行增强。
在Spring的核心包中已经集成了CGLIB所需的包,所以开发中不需要导包。

redis常用数据类型?

  • String:缓存、计数器、分布式锁等
  • List:链表、队列、微博关注人时间轴列表等
  • Hash:用户信息、Hash 表等
  • Set:去重、赞、踩、共同好友等
  • Zset:访问量排行榜、点击量排行榜等

三种特殊的数据类型:BitmapHyperLogLogGeospatial,其中Bitmap 、HyperLogLog的底层都是 String 数据类型,Geospatial 底层是 Sorted Set 数据类型。

redis的持久化机制有哪些?

1、快照RDB。将某个时间点上的数据库状态保存到RDB文件中,RDB文件是一个压缩的二进制文件,保存在磁盘上。当Redis崩溃时,可用于恢复数据。通过SAVEBGSAVE来生成RDB文件。

  • SAVE:会阻塞redis进程,直到RDB文件创建完毕,在进程阻塞期间,redis不能处理任何命令请求。
  • BGSAVE:会fork出一个子进程,然后由子进程去负责生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。

2、只追加文件AOF。以日志的形式记录每个写操作(非读操作)。当不同节点同步数据时,读取日志文件的内容将写指令从前到后执行一次,即可完成数据恢复。

有技术一点的部分呢和功能?

bean的生命周期?

在这里插入图片描述

redis作为缓存是怎么使用的?

Redis是后端的缓存,主要对MySQL的数据作缓存(MySQL查询效率远不及Redis)

对于多查询、少修改的数据(热点数据),则可以将其存入Redis中作为缓存。

基于Redis缓存的数据查询流程

如果接触新的东西是怎么学习的?

反问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值