Java基础
-
创建线程的方式有哪些?
(1) 继承Thread类创建线程类
(2) 通过Runnable接口创建线程类
(3) 通过Callable和Future创建线程
(4) 使用线程池例如用Executor框架 -
Callable和Runnable有什么区别?
runnable和callable都可以用来编写多线程程序,两者的区别在于:
(1)实现了runnable接口后无法返回结果信息,实现了callable接口后有返回值。
(2)实现了runnable接口异常无法通过throws抛出异常,实现了callable接口后可以直接抛出Exception异常 -
简要描述线程池的基本原理,并介绍常见的阻塞队列
Java 线程池的实现原理其实就是一个线程集合 workerSet 和一个阻塞队列 workQueue。
当用户向线程池提交一个任务(也就是线程)时, 线程池会先将任务放入 workQueue 中。
workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。 当 workQueue 中没有任务的时候, worker 就会阻塞, 直到队列中有任务了就取出来继续执行。 -
简要描述线程池实现原理
Java 线程池的实现原理其实就是一个线程集合 workerSet 和一个阻塞队列 workQueue。
当用户向线程池提交一个任务(也就是线程)时, 线程池会先将任务放入 workQueue 中。
workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。 当 workQueue 中没有
任务的时候, worker 就会阻塞, 直到队列中有任务了就取出来继续执行。 -
volatile关键字有什么用处?
被其修饰的变量所具有的特性
(1) 保证该变量对所有线程的可见性;
(2) 禁止指令重排序优化。 -
Java内存中的哪些区域会发生OOM?
除了程序计数器,其他区域都有可能发生 OOM, 简单总结如下:
堆内存不足是最常见的 OOM 原因之一,抛出错误信息 java.lang.OutOfMemoryError:Java heap space,原因也不尽相同,可能是内存泄漏,也有可能是堆的大小设置不合理。
对于虚拟机栈和本地方法栈,导致 OOM 一般为对方法自身不断的递归调用,且没有结束点,导致不断的压栈操作。类似这种情况,JVM 实际会抛出 StackOverFlowError , 但是如果 JVM 试图去拓展栈空间的时候,就会抛出 OOM.
对于老版的 JDK, 因为永久代大小是有限的,并且 JVM 对老年代的内存回收非常不积极,所以当我们添加新的对象,老年代发生 OOM 的情况也非常常见。
随着元数据区的引入,方法区内存已经不再那么窘迫,所以相应的 OOM 有所改观,出现 OOM,异常信息则变成了:“java.lang.OutOfMemoryError: Metaspace”。 -
常见垃圾回收算法有哪些?
(1) 标记-清除算法
(2) 复制算法
(3) 标记-整理算法
(4) 分代收集算法 -
哪些对象可以作为GC Root?
-
常见垃圾回收器有哪些?
-
如何避免ThreadLocal产生内存泄漏?
Java 集合
-
简要描述HashMap存入K:V的过程
-
LinkedHashMap是如何实现有序性的?
-
简要描述ArrayList扩容机制与过程
常用框架
-
简要描述Spring Bean生命周期
-
Spring中用到了哪些设计模式?
-
简要描述AOP实现原理
MySQL数据库
-
简要描述SQL语句执行过程
-
简要描述WAL机制及其实现原理
-
简要描述MySQL事务实现原理
-
如果一条查询SQL优化到了极限,还有哪些方法可以提升查询速度?
Redis
-
简要介绍Redis的5种基础数据类型及其对应数据结构
-
Redis为什么快?
-
Redis在什么情况下会删除Key?是怎么删除的?
RabbitMQ
-
RabbitMQ是如何做到消息不丢失的
-
简要描述RabbitMQ延迟队列实现原理