云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

06|类加载子系统 (上):类加载的流程与机制

你好,我是康杨。今天这节课我们来聊聊 JVM 中的类加载流程和机制。
类加载子系统可以看作是 JVM 的搬运工。通过使用 Javac 编译器,我们将编写的代码转换为.class 文件,这样类就可以被真正地加载到 JVM 中,从而实现高效地运行。借助类加载流程,我们将.class 文件中的数据结构存储到了运行时的方法区中,作为后续 Java 程序运行的基础。

方法区

这里的方法区其实是一个逻辑空间的概念,并不是真实的物理空间。
因为在 JDK 7 之前,方法区也被称为永久代(PermGen),作为堆内存的一部分分配。由于在某些场景下可能导致永久代内存溢出,因此后续版本的 JVM 对其进行了优化。 到了 JDK 8,方法区的概念经过改进,不再叫做永久代,而是改为元空间(Metaspace)。
方法区包含 4 类信息。
类的元数据,包括类的结构信息、访问权限、字段和方法等。
静态变量,类的静态变量,即在类级别共享的变量。
类的方法信息、构造函数。
最后是运行时常量池,它是一种存储编译时常量和引用的数据结构,主要包括字符串常量、数值常量、类引用、字段引用、方法引用等。运行时常量池在类被加载时自动创建,并在运行时被 JVM 使用。
因为方法区里存储了类的元数据和静态变量等,所以平时在开发的时候你需要关注方法区的内存使用,避免大量加载类以及定义过多的静态变量导致内存不足。最后还要避免类初始化的循环引用,创建类时,确保类之间的引用关系没有循环,否则可能导致类初始化阻塞。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JVM类加载子系统是Java虚拟机的核心组成部分,负责将编写的代码转换为.class文件,并将类加载到JVM中,为Java程序的高效运行提供基础。方法区作为类加载子系统的一部分,存储类的元数据、静态变量、方法信息和运行时常量池,需要注意内存使用和避免类初始化的循环引用。类加载时机基于首次主动使用原则,延迟加载可以节省系统资源,提高程序响应速度,增强系统稳定性。JVM加载.class文件的方式灵活多样,可以从本地系统加载、通过网络下载、动态编译等。类加载全流程包括加载、连接、初始化三个步骤,其中连接阶段包括验证、准备和解析。验证阶段确保类的准确性和安全性,准备阶段给静态变量分配空间并设置初值。类加载的锁机制确保了类的全局唯一性和线程安全性。整体而言,JVM的类加载机制通过加载、连接和初始化等阶段,确保类可以被正常使用,并执行验证、准备和解析等操作,保证程序的正确性和安全性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • on
    方法区不就是直接变为了metaspace?为啥代码示例还是两块,方法区和metaspace?

    作者回复: 在 Java 8 及以后版本中,HotSpot JVM 已经全面废弃原先的永久代,取而代之的是元空间(Metaspace),此举主要是为了克服永久代内存空间容易出现的溢出问题。一个是逻辑概念,一个是实际物理空间概念

    2023-09-10归属地:上海
    1
  • ^_^
    初始化包括两个方面:一是为对象的实例变量分配内存并设置默认初始值,二是执行对象的构造方法进行初始化。这块初始化能否详细讲讲一下

    作者回复: 后面的章节对这部分有详细的介绍,可以关注下,最晚应该下周更新就能看到了

    2023-09-06归属地:北京
  • 郭刚
    元空间内存溢出,怎么诊断呢?

    作者回复: 当出现空间内存溢出时,多半情况下都是由于程序中存在一些无法被垃圾回收的对象,它们一直占用着内存,造成了内存溢出。诊断该问题,步骤可能包括以下几种: 1. 查看错误堆栈信息:当发生内存溢出错误时,堆栈信息将被打印出来。这可以为我们提供一些有价值的信息,例如错误的类型、位置等。 2. 利用JVM提供的工具诊断问题:JVM提供了一些工具来帮助我们诊断内存的问题。这包括jmap命令、jhat命令、VisualVM工具等等。我们可以通过这些工具查看堆内存的使用情况,找出哪些对象导致了内存溢出。 3. 使用内存分析工具:存在很多第三方的分析工具,如Eclipse Memory Analyzer (MAT)等,可以帮助我们查看内存的分布情况,定位可能的内存泄漏点。 4. Dump内存快照:当内存溢出发生时,可以生成heap dump,然后用分析工具进行分析。这样一般可以找到那些最占内存的对象,进一步分析为什么它们会占用这么多内存。 5. 代码审查:如果以上步骤都无法找到问题,可能需要进行代码审查,看代码逻辑是否有可能导致内存溢出。 总的来说,要诊断和解决该问题,就需要了解JVM的工作原理和使用相关的诊断工具。同时,对代码的熟悉也能帮助我们更快地找到问题。

    2023-09-04归属地:广东
    2
  • 请输入昵称
    翻了下《深入理解 Java 虚拟机第二版》,书中讲到解析可以在初始化之后开始。 有五种情况需要对类初始化: 1、遇到new、getstatic、setstatic、invokestatic这四个字节码指令时 2、对类反射调用 3、该类是某个被初始化类的父类 4、虚拟机启动时的执行主类 5、jdk 1.7 动态语言支持,省去若干
    2023-09-10归属地:北京
    2
  • peter
    类加载器是JVM的一部分还是和JVM并列的一个东西?类加载器是jre的bin目录下的一个工具吗?
    2023-09-01归属地:北京
    1
  • 文敦复
    方法区包含 4 类信息,其中有2个是类的元信息和类的方法方法信息?这里类的元信息不是包括了类的方法信息吗?为什么这么分,是我理解错了吗?
    2024-01-05归属地:四川
  • Geek_d41785
    没有看懂Java 代码获取方法区的内存使用情况及元空间信息这个代码示例,在Java8 之后方法区不等于元空间吗
    2023-10-23归属地:陕西
  • 郭刚
    元空间内存溢出如何分析呢?
    2023-09-04归属地:广东
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部