多线程

1.请讲一下JDK线程池的工作流程?

工作流程如下:

①如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务

②如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列

③如果这时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么要创建非核心线程立刻运行这个任务

④如果队列满了,而且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会抛出异常RejectExecutionException

2.jdk的有界阻塞队列在什么情况下发生阻塞?

①队列满 ②队列空时

3.java有哪些可重入锁?

概念:同一线程可多次获取在同一对象上的锁

①ReentrantLock

②Synchronized

4.什么是CAS操作?

①CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。②CAS指令执行时,当且仅当l旧值与预期值A相等时,才可以把值修改为B,否则就什么都不做。②整个比较并替换的操作是一个原子操作,通过硬件指令支持

5.volatile具有什么特性以及是否具有原子性?

volatile具有 ①可见性 ②有序性(禁止指令重排) ③但不具备原子性

JVM

1.jvm类的加载过程经历哪些步骤?

①装载 ②验证 ③准备 ④解析 ⑤初始化 ⑥使用 ⑦卸载

2.发生OOM(outOfMemoryError)时,年轻代和老年代都正常,那有可能是什么原因导致的?

①原生内存不足(操作系统不允许申请更大的内存) ;

②永久代或元空间不足;

③JVM执行GC耗时太久

3.JVM怎样判断某个对象应被回收?

引用计数法与可达性分析法。

①【引用计数法】系统会为对象添加一个计数器,当有新的引用时加1,引用失效时减1。但是此方法无法解决两个对象循环引用的问题。

②【可达性分析法】通过对象的引用链来判断该对象是否需要被回收,通过一系列的GC Roots的对象作为起始点,从这些起节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,就需要回收此对象。