JVM内存结构
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
- 运行时常量池
- 直接内存
对象创建的过程JVM如何保证线程安全的
JVM通过分配内存空间、初始化对象和调用构造函数等阶段保证对象创建的线程安全性。尽管创建过程中存在线程不安全的阶段,JVM通过独占性保证每个线程在初始化和构造对象时不受干扰。然而,在构造函数中可能存在耗时操作,需注意其他线程可能在对象未完全构造前访问,导致问题。因此,在编写构造函数时,要考虑多线程并发访问情况,确保构造函数的线程安全性。
什么是内存溢出和内存泄漏常见的内存溢出和内存泄漏操作
大对象长期不被清理,长生命周期对象持有生命周期对象,递归调用层次太深或者方法调用过多,IO流没有关闭
CGRoots,是什么
垃圾收集器通过判断哪些对象是可以被访问到的来确定哪些对象是存活的,而这些能够被访问到的对象通常包括以下几种类型
- 虚拟机栈中的本地变量和引用
- 方法区中的类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Java Native Interface)引用的对象
如何判断对象仍然存活
通过引用计数法与可达性分析方式来判断对象是否存活
finalize方法功能是什么
堆内存结构
常见的垃圾回收算法
- 标记-清除算法,它是一个基础回收算法,它分为两个阶段:标记阶段,从根对象出发,标记所有可达的对象;清除阶段,遍历堆中的所有对象,清除未标记的对象,回收空间,它缺点是堆空间会产生碎片,影响堆空间连续分配
- 复制算法,将堆分为两个区域,每次只使用其中一个区域。当一个区域用尽时,将活动对象复制到另一个区域,然后清除已经不再使用的对象。复制算法避免了内存碎片,但要求堆空间至少为对象的两倍。
- 标记-压缩算法,它先标记所有可达的对象,将所有未标记的对象压缩到堆的一端然后清除,并更新对象引用,它解决了碎片问题,但是压缩也会占用性能
- 分代回收算法,它是根据对象的存活周期不同分为新生代和老年代,新生代使用复制清除算法,老年代使用标记算法,压缩算法
- 三色标记算法,是一种增量算法,使用三种颜色来标记对象状态,避免长时间停顿
- 并发标记-清除算法,使用并发线程进行垃圾回收,减少垃圾回收的停顿时间,提高系统的响应性。
什么时候触发youngGC
当Eden没有足够空间的时候会触发youngGC
什么时候触发FulIGC对象
youngGC触发前检查Old区是否充足,youngGC执行后将对象移动到Old区发现没有足够空间,在Old区空间不足的时候
什么时候进入老年代
在YoungGC每次迭代都会增加年龄。当年龄达到15的时候就会移动对象到老年代,当占用大量连续内存空间的对象回直接在老年代创建
常见的垃圾回收器有哪些
垃圾回收器和垃圾回收算法的关联
什么是STW
什么是OOPMAP
CMS的垃圾回收过程
G1的垃圾回收过程
线上服务CPU过高如何排查
linux的话使用top命令查看是哪个进程导致的,如果是java进程通过PID查询他进程ID 在通过线程ID,再通过线程ID打印具体哪个方法导致的,再去代码中找导致CPU飙升的地方