- 类加载机制?类加载过程
- 什么是类加载器,类加载器有哪些?这些类加载器都加载哪些文件?
- 多线程的情况下,类的加载为什么不会出现重复加载的情况?
- 什么是双亲委派机制?它有啥优势?可以打破这种机制吗?
- 自定义了一个String,那么会加载哪个String?
- Java内存分配
- 内存泄露和内存溢出
- 永久代、元空间、方法区的关系
- 如何覆盖 JDK 提供的组件,比如覆盖 ArrayList 的实现
- new 一个对象的过程发生了什么(类加载、变量初始化、内存分配)
- 对象的死亡过程
- JVM 可能会抛出哪些 OOM
- String内容存放在哪儿
- 举例栈溢出的情况?
- 为什么要有GC
- 简述垃圾回收机制
- 深拷贝和浅拷贝
- System.gc() 和 Runtime.gc() 会做什么事情
- 垃圾回收算法有哪些?优缺点比较
- 熟知的垃圾回收器有哪些,简单描述每个应用场景
- CMS 和 G1 的垃圾回收步骤是?
- G1 相对于 CMS 的优缺点
- 可达性分析算法中根节点有哪些
- 如何监控 GC
- 常见 OutOfMemoryError 有哪些
- 常见的 JDK 诊断命令有哪些,应用场景?
- CPU 较高,如何定位问题
- 内存占用较高,如何定位大对象
- 内存泄漏时,如何实时跟踪内存变化情况
- 内存泄漏时,如何定位问题代码
- 大型项目如何进行性能瓶颈调优?
- 字节码是如何在 JVM 中进行流转的(栈帧)
- 方法调用的底层实现
- 方法重写和重载的实现过程
- invokedynamic 指令实现
- 如何修改字节码
- JIT 参数配置如何影响程序运行?
- 虚拟机有哪些性能优化策略
- 为什么要有内存模型
- 简单描述 JMM 和 JVM 两个概念
- 你知道 Java 内存模型 JMM 吗?那你知道它的三大特性吗?
- Java 是如何解决指令重排问题的?
- 为什么要重排序,重排序在什么时候排
- 如何约束重排序规则
- happens-before
- 什么是顺序一致性
- 原子性,可见性,有序性如何保证
- volatile
- volatile 内存语义,什么时候用,用的时候需要考虑什么问题
- 既然CPU有缓存一致性协议(MESI),为什么 JMM 还需要 volatile 关键字?
- CAS 实现的原理,是阻塞还是非阻塞方式?什么时候用,使用时需要考虑的问题
- 处理器和 Java 分别怎么保证原子操作
- 保证了原子性就能保证可见性吗?
- final 内存语义?什么时候用,使用时需要考虑的问题
- synchronized 内存语义,什么时候用,和锁比较一下优缺点
- synchronized 中涉及的锁升级流程
- 锁的内存语义,举例说明,加锁失败时候的处理流程
- 比较下 CAS 、volatile 、synchronized、Lock 区别
- 原子操作类底层实现机制?自增操作是怎么保证原子性的?