JVM知识点总结

一、JVM结构

  • 类加载子系统
    • JVM类加载器分为3层,启动类加载器(Bootstrap类加载器),加载%JAVA_HOME%/lib包下的核心类;扩展类加载器(Extension类加载器) ,加载%JAVA_HOME%/lib/ext内的扩展类;应用类加载器(Application类加载器),加载应用程序内定义的类。
    • 双亲委派(类加载机制):①应用类加载器收到加载类的请求时,会先检查自己是否加载过这个类,加载过则直接返回;②如果未加载过则委托它的父级-扩展类加载器加载,扩展类加载器已加载,则返回该类,加载结束;③如果扩展类加载器仍未加载,则继续向上委派,由启动类加载器加载,启动类加载器已加载,则返回该类,加载结束④双亲都无法完成加载,则由应用类加载器尝试加载该类。优点:①保护核心类;②避免重复加载。
  • 执行引擎
  • 运行时数据区
    运行时数据区包含:
    • 线程共享区域:
      • 堆区: 动态扩展的数据结构。堆区特点:
        ①线程共享,需要考虑并发问题
        ②动态扩展的内存区域;
        ③被垃圾回收器监控回收;
        ④存储的对象都有一个指向它的类引用指针;
        ⑤分为年轻代和老年代,年轻代又分为Eden和两个Survivor(幸存者)区域,默认比例:8:1:1;
        ⑥按照对象创建的时间顺序分配内存,标记清除算法回收垃圾会产生大量内存碎片导致频繁GC。
      • 方法区: Java8之前通过永久代实现,使用堆内存,大小有限,无法动态调整,加载类过多或动态生成类过多时容易OOM;Java8使用元空间实现,使用堆外内存,可动态调整,避免了永久代的一些问题。
      • 直接内存区域: 由操作系统直接操作的内存区域。优点:①零拷贝提高效率②不归Java堆内存管理,降低GC压力。缺点:①不归Java堆内存管理,容易内存泄漏,要注意释放②直接内存的分配和释放比Java堆上的操作成本更高。
    • 线程私有区域:
      • 程序计数器: 记录当前线程执行到的位置,线程切换需要使用。
      • 虚拟机栈: 用于存储方法调用和局部变量。栈帧: 局部变量表、帧数据区、操作数栈、动态链接。
      • 本地方法栈: native方法的方法调用和局部变量。

二、 如何判断对象是否存活

  • 引用计数法: 引用一次计数+1,简单快速,但出现互相引用时会导致无法回收。
  • 可达性分析法: 以GC Roots为起点,开始向下遍历,能够被访问到的对象认为是存活的,无法到达的对象认为垃圾对象等待回收。
    GC Roots:①静态变量②常量③虚拟机栈引用的对象④本地方法栈引用的对象。

三、垃圾回收算法

  • 标记复制: 使用双倍内存,将存活对象移动到另一内存区域,未存活对象回收,然后交换区域。特点:速率快,使用内存只有总内存的一半,常用于年轻代垃圾回收。
  • 标记清除: 标记后直接回收未存活对象,会产生大量内存碎片,导致频繁GC。速率中等,常用于老年代垃圾回收。
  • 标记整理: 过程:①标记阶段:从GCRoots出发标记存活对象;②整理阶段:将存活对象移动到一端,同时清理未标记的数据;③更新引用:更新存活对象引用,使其指向对象所在新位置的地址;④回收阶段:回收掉所有未被标记的对象,释放内存(整理阶段的回收可能存在遗漏,如错标,所以需要回收阶段再统一回收)。速率慢,减少内存碎片,减少内存分配失败的情况(内存连续)。

四、三色标记法

将对象标记为三种颜色:白色、灰色和黑色,用于表示对象的可达性状态。

  • 白色:所有对象初始状态都为白色,表示尚未被访问和处理。
  • 灰色:对象被标为灰色表示这些对象已经访问,但是其引用的对象还未被遍历。
  • 黑色:对象被标记为黑色表示这些对象已经被访问,并且其引用的对象已经被遍历。

基本流程:
①初始化:根对象标记为灰色,其他对象标记为白色;
②标记阶段:从根对象开始遍历对象,遍历完成的对象标记为黑色;
③清除阶段:清除所有未被标记为黑色的对象,这些对象被认为不可达,可以回收。

五、四大引用类型

  • 强引用: 即使系统内存不足,垃圾回收时也不会回收该对象,如new的对象。
  • 软引用: 系统内存充足,垃圾回收时不会被回收,系统内存不足时会被回收,适合缓存功能。
  • 弱引用: 系统内存无论是否充足,垃圾回收时都会被回收,ThreadLocal 中 Key。
  • 虚引用: 相当于不存在,垃圾回收时会得到通知。

六、yangGC流程

  1. yangGC发生在年轻代,年轻代区域分为1个Eden区和两个幸存区(Survivor),比例8:1:1,幸存区分为from/to两个角色;
  2. Eden区三色标记法判断对象存活,然后通过标记复制算法垃圾回收,Eden区存活对象移动到to区域;
  3. From区域存储的上一次yangGC存活的对象,根据存活对象的存活年代判断是否移动到老年代,未移动到老年代的对象移动到To区域;
  4. 交换From和To区域的引用,保证To区域GC完成后为空;
  5. yangGC完成后如果新创建对象需要的内存仍不够,会触发空间担保机制将存活对象从新生代晋升到老年代;
  6. 循环上述过程,To区域被填满后所有对象移动到老年代。

七、主流垃圾回收算法

  • CMS: 特点:基于标记清除算法,并发收集、低停顿。工作机制:
    ①初始标记:标记GC Roots直接关联的对象,速度很快,需要暂停所有工作线程;
    ②并发标记:遍历GC Roots引用链,并发进行,不需要暂停工作线程;
    ③重新标记:修正并发标记期间,因用户线程继续工作而导致产生变动的一部分对象的标记记录,需要暂停所有工作线程;
    ④并发清除:清除遍历GC Roots不可达的对象,并发进行,不需要暂停工作线程。
  • Parallel: :多线程垃圾回收器,基于标记整理算法,适用多核处理器和对吞吐量要求较高的场景。
  • G1: JDK9之后默认的垃圾回收器,基于标记整理算法。
  • CMS与Parallel区别:
    ①使用场景不同,CMS适合对停顿时间要求较高的场景,Parallel适合对吞吐量要求较高的场景;
    ②工作原理不同,CMS 老年代垃圾回收,基于标记清除算法,会产生内存碎片导致频繁GC,Parallel 老年代垃圾回收,基于标记整理算法,不会产生大量内存碎片;
    ③CMS停顿时间较短,Parallel停顿时间较长,停顿时无法正常提供服务。

八、OOM

  • 产生的原因:
    ①堆区分配的内存不足;
    ②堆区内存泄漏,多余内存无法正常释放,代码有问题;
    ③栈内存不足,虚拟机在扩展栈的时候无法申请到足够的内存;
    StackOverflowError :线程请求的栈深度超过了虚拟机允许的最大深度,会抛出该异常(无限递归)。

九、常用工具

jps:输出当前系统中正在运行的java进程的进程ID及状态信息。
jstack:生成java进程的线程转储信息,可以获取 Java 进程中每个线程的堆栈跟踪信息,包括线程的状态、调用栈信息、锁信息等。
jstat:虚拟机统计信息监控工具。
jinfo:实时查看和调整虚拟机的各项参数。
jmap:生成虚拟机的内存转存储快照。
JConsole:可视化监控工具。

十、如何进行JVM调优

  1. 明确调优原因;
  2. 全面监控,收集性能数据,分析GC日志,涉及GC类型、频率、停顿时间等信息;
  3. 如果存在内存泄漏,则下载dump文件,利用工具分析内存泄漏对象关联的GC Roots,优化对应代码;
  4. 根据业务场景和需求选择合适的GC算法,如CMS、Parallel、G1等;
  5. 设置JVM参数,如初始堆内存大小、最大堆内存大小、新生代大小等;
  6. 优化代码;
  7. 根据需求,压测应用,观察吞吐量、性能、GC频率、内存大小、GC时间等,不断调整JVM参数到合适值,确保调优后达到性能和稳定性要求。
  • 一般情况下,yangGC单次小于50ms且间隔在10s以上,表示健康;
    FullGC单次小于1s,且间隔在10min以上,表示健康。
  • 调优参数:
    • -Xmx 最大堆内存
    • -Xms 初始堆内存
    • -Xmn 新生代大小
    • -XX:MetaSpaceSize:初始元空间大小
    • -XX:MaxMetaSpaceSize:最大元空间大小
    • -XX:MaxDirectMemorySize:最大堆外内存
    • -XX:+HeapDumpOnOutOfMemoryError: 内存溢出时生成快照文件
    • -XX:HeapDumpPath: 内存溢出时生成快照文件的路径
  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java核心面试知识整理(架构师)是一份非常有价值的Java面试指南,此指南对于那些准备进行Java工作面试的候选者来说非常重要。该指南详细介绍了Java技术的基本概念,包括多线程、面向对象编程、JVM以及其他与Java语言相关的技术。除此之外,该指南还列出了一系列与Java技术相关的最新面试题目,并通过详细的解题思路和示例代码展示了如何解决这些问题。这对于那些想要通过Java面试的候选者来说非常有帮助。 此外,该指南还介绍了Java SE、Java EE、Spring、Hibernate等重要的框架和技术的概要以及相应的面试题目。候选人可以通过这些问题详细了解这些技术的实际应用,并为面试做好充分的准备。 总之,Java核心面试知识整理(架构师)是一份非常有用的指南,对于那些想在Java领域取得成功并通过技术面试的人来说非常有帮助。无论现在你是一个初学Java的新手,还是一位有经验的开发者或工程师,这份指南都值得一读。 ### 回答2: 《Java核心面试知识整理(架构师)》是一份重要的面试资料,涵盖了Java开发中的核心知识点和面试考察的难点,可以帮助应聘者更好地准备面试。 该资料主要分为八个章节,分别是Java基础知识、集合框架、多线程、JVM、网络编程、数据库、分布式系统和框架技术。在每个章节中,都涵盖了该领域中的重要概念、常见的面试题和优秀的回答方法,可以帮助应聘者在面试中更加从容自信地回答问题。 其中,Java基础知识和集合框架是面试中最常考察的部分,主要考察应聘者的基础扎实度和掌握程度。多线程和JVM是Java开发中的难点,需要求职者深入理解并掌握其原理,才能在面试中获得高分。网络编程和数据库相关问题则是针对应聘者的项目经验和实践经验,需要应聘者结合自己的经验和项目实践,进行深入的思考和总结。分布式系统和框架技术则是考察应聘者对当前技术潮流和趋势的了解程度,需要应聘者关注行业动态和进行充分的技术积累。 总的来说,《Java核心面试知识整理(架构师)》是一份全面、权威且实用的Java面试资料,对于想要深入了解Java开发技术和成功求职的人来说,具有非常重要的参考价值。 ### 回答3: 这份《Java核心面试知识整理(架构师版)》的文档总结了Java领域中架构师的核心面试知识。文档涵盖了Java基础、集合、多线程、JVM、设计模式、分布式微服务等方面的知识点。 在Java基础方面,文档详细介绍了Java语言的基础类型、运算符、循环结构、流程控制语句以及面向对象的特性和原则。而在集合方面,文档涵盖了Java中的各种集合类型及其特点,如List、Map、Set等。此外,文档还详细讲解了多线程的基本概念和Java中的线程安全问题,包括锁机制、线程池等。 在JVM方面,文档深入讲解了Java程序的运行原理和内存管理机制,详细分析了垃圾回收算法和优化策略,并解释了如何进行JVM性能调优。 文档还涉及了常用的设计模式及其应用场景,如单例模式、工厂模式、观察者模式等。此外,分布式、微服务等一系列架构方面的知识也被全方位地介绍和讲解。 总之,这份文档是Java架构师在面试时必备的知识点整理手册,对于正在准备面试的Java架构师和Java程序员来说具有非常重要的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值