JVM第三讲 JVM从底层原理分析类加载过程

2023-11-01

类加载运行全过程

其中loadClass的类加载过程有如下几步:

加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载

  • 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
  • 验证:校验字节码文件的正确性
  • 准备:给类的静态变量分配内存,并赋予默认值
  • 解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用
  • 初始化:对类的静态变量初始化为指定的值,执行静态代码块

类被加载到方法区中后主要包含  运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应class实例的引用 等信息。

类加载器在加载类信息放到方法区中后,会创建一个对应的Class 类型的对象实例放到堆(Heap)中, 作为开发人员访问方法区中类定义的入口和切入点。


类加载过程:
1:先执行static 方法块
2:执行构造方法
3:生成类对象

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM第三讲 JVM从底层原理分析类加载过程 的相关文章

  • 估计 64 位 Java 中最大安全 JVM 堆大小

    在分析存在一些问题的 64 位 Java 应用程序的过程中 我注意到分析器本身 YourKit 正在使用真正大量的内存 我在 YourKit 启动脚本中得到的是 JAVA HEAP LIMIT Xmx3072m XX PermSize 25
  • 集群环境下的Spring Singleton

    正如中所讨论的this https stackoverflow com questions 1194129 singleton in cluster environmentpost 不适合使用单例聚集的环境 因为不同 JVM 中有多个单例对
  • 如何在JVM不退出的情况下多次运行Java程序?

    假设我有一个Java程序Test class 如果我使用下面的脚本 for i in 1 10 do java Test done JVM每次都会退出java Test被调用 我想要的是跑步java Test在不退出JVM的情况下多次执行
  • 为什么不在下一个 JVM 中删除类型擦除呢?

    Java 在 Java 5 中引入了泛型类型擦除 因此它们可以在旧版本的 Java 上运行 这是兼容性的权衡 我们已经失去了这种兼容性 1 https stackoverflow com questions 22610400 a progr
  • jvm 如何以及何时何地更改 Linux 的最大打开文件值?

    在linux中 每个登录用户的每个进程的最大打开文件数有限制 如下所示 ulimit n 1024 当我学习java nio时 我想检查这个值 因为channel在Linux中也是一个文件 所以我编写了一个客户端代码来不断创建socketC
  • 在正在运行的 JVM 中查找正在运行的实例

    我想知道是否可以获取给定类的正在运行的实例的句柄 触发此问题的特定问题是应用程序由于存在大量正在运行的线程而无法正常退出 是的 我知道您可以对 thead 进行守护进程 然后它们就不会阻止应用程序退出 但这确实让我想知道这是否可能 我能做的
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • Java:为什么它使用固定数量的内存?或者它如何管理内存?

    JVM 似乎使用了一些固定数量的内存 至少我经常看到参数 Xmx 对于最大尺寸 和 Xms 对于初始大小 这表明 我感觉 Java 应用程序不能很好地处理内存 我注意到一些事情 即使一些非常小的示例演示应用程序也会加载大量内存 也许这是因为
  • OQL 包中的所有实例

    是否有可能在OQL检索属于一个包的所有对象 或者我可以查询wildcards 正如 haridsv 建议我尝试过的 SELECT from com example and SELECT a from com example but in V
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • 将 Kotlin .kt 类打包到 JAR 中

    我如何构建HelloWorld kt as a JAR以便它运行 thufir dur kotlin thufir dur kotlin kotlinc HelloWorld kt include runtime d HelloWorld
  • 是什么让热部署成为“难题”?

    在工作中 我们经常遇到这样的问题 永久代内存不足 http www jroller com agileanswers entry preventing java s java lang例外 团队负责人认为这是 JVM 中的一个错误 与代码的
  • Kotlin 支持 Java 11 吗?

    我尝试使用 Kotlin V1 2 70 Gradle V4 10 1 和 Java 11 使用 gradle 编译项目时 出现错误 未知 JVM 目标版本 11 支持的版本 1 6 1 8 Kotlin 编译器是否支持 Java 11 生
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • 如何将 JVM 选项传递给 SBT 以在运行应用程序或测试用例时使用?

    我想在运行我的应用程序或通过 SBT 对应用程序进行测试时指定 JVM 选项 具体来说 我需要能够为 JVM 提供 Djava security policy 参数 以便加载我的策略并用于测试 我怎样才能用 SBT 做到这一点 With x

随机推荐

  • springboot整合fisco

    Spring Boot连接Fisco Bcos区块链 使用spring boot连接Fisco Bcos 在Fisco Bcos的官方提供了Java Sdk工具用于连接 Java SDK 提供了访问 FISCO BCOS 节点的Java A
  • 飞机降落(dfs+贪心思想)

    飞机降落 dfs 贪心思想 原题链接 4957 飞机降落 AcWing题库 思路分析 通过读题易知 题目可以翻译为 已知有 n 条线段 每条线段都可以在一定的区域内滑动 需要我们来判断是否可以找到一种线段的分布方案 使得每条线段都不相交 首
  • stl::(8)set容器API

    set根据元素键值自动被排序 迭代器不能修改键值 键值唯一不重复 set 构造函数 set
  • C和C++安全编码笔记:指针诡计

    指针诡计 pointer subterfuge 是通过修改指针值来利用程序漏洞的方法的统称 可以通过覆盖函数指针将程序的控制权转移到攻击者提供的外壳代码 shellcode 当程序通过函数指针执行一个函数调用时 攻击者提供的代码将会取代原本
  • 深度学习之感知机学习算法

    一 感知机模型 感知机是一种较为简单的二分类模型 但由简至繁 感知机却是神经网络和支持向量机的基础 感知机旨在学习能够将输入数据划分为 1 1的线性分离超平面 所以感知机是一种线性模型 由输入空间到输出空间到函数为 其中x为实例的特征向量
  • c语言程序学生籍贯信息记录,C语言程序设计学生籍贯信息记录簿

    C语言程序设计学生籍贯信息记录簿 编制一个学生籍贯信息记录簿 每个学生信息包括 学号 姓名 籍贯 具体功能 1 创建信息链表并以磁盘文件保存 2 读取磁盘文件并显示输出所有学生的籍贯信息 3 按学号或姓名查询其籍贯 4 按籍贯查询并输出该籍
  • 阻止 JetBrains 的 IDE 自动去掉行尾空格

    起因 最近换了电脑 然后重新装了一堆堆 IDE 包括 Pycharm RubyMine 和 GoLand等 发现 RubyMine 修改某一行的代码后 Ctrl S 保存 结果 IDE 将文件的所有行末尾的空格都自动给去掉了 但是这样就会有
  • git报错kex_exchange_identification

    完整报错 环境 windows10电脑 ssh方式拉取git代码 FATAL Unable to connect to relay host errno 10061 kex exchange identification Connectio
  • mysql 默认连接数和timeout_mysql和连接相关的timeout

    MySQL和连接相关的timeout 今天同事问为什么查询mysql库时 在数据量比较大时 会话总断 刚开始以为是mysql的和连接有关timeout的问题 结果是网络的不稳定的原因 下面总结下和连接有关的timeout slave net
  • Windows安装Java并配置环境变量

    jdk 下载 链接 链接 https pan baidu com s 1j F3kJaGePaT6AJy6iMJvQ 提取码 GYHH 来自百度网盘超级会员V1的分享 打开下载好的安装包 全部默认下载即可 下载完成后一定要记住自己的安装路径
  • oracle 怎么去掉小数位,Oracle 去掉小数终了的0的方法

    Oracle 去掉小数末尾的0的方法 Oracle PL SQL查询语句有的时候要将number类型的字段转换成varchar2类型在报表或页面上经常会出现 440 4411 010 100之类的数据 要不就是小数点前面的0被to char
  • FileZilla,读取目录列表失败(425 Can‘t open data connection.)的解决办法

    因为对外FTP客户要求安全升级的原因 针对部分FTP User启用了SSL认证功能 启用方式 1 建立FTP User时 Force SSL for user login 前面打勾 2 启用被动传输模式 进入FileZilla Server
  • SpringMVC如何在web.xml中配置DispatcherServlet呢?

    转自 SpringMVC如何在web xml中配置DispatcherServlet呢 下文讲述SpringMVC中对DispatcherServlet进行配置的方法分享 如下所示 实现思路 只有在web xml中Servlet处理类指向D
  • 如何实现审核功能

    如何实现审核功能 开发工具与关键技术 VS C 作者 撰写时间 2019 7 26 如何实现审核的功能呢 首先是实现弹出审核模态框和重置表单 再通过ID获取要审核的数据和使用post获取到通过ID查询的数据 用loadDatatoForm回
  • IEqualityComparer VS System.IEquatable

    类似于IComparer
  • vuejs 原生JS 拖拽事件案例

    原生JS or Vue 事件案例合集 详细 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 Section 1 单个或多个鼠标拖拽事件的理解 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 原生
  • SpringMVC的@InitBinder的作用

    一 前言 在SpringMVC中 InitBinder注解用于自定义数据绑定的方法 在使用表单提交数据时 SpringMVC会将请求参数绑定到Java对象中 但是 有些时候请求参数的数据格式可能与Java对象的属性格式不一致 这时就需要使用
  • 初露头角!Walrus入选服贸会“数智影响力”数字化转型创新案例

    9月5日 由北京市通信管理局 工业和信息化部新闻宣传中心联合主办的 企业数字化转型论坛 在2023中国国际服务贸易交易会期间召开 论坛以 数字化引领 高质量发展 主题 旨在探讨信息技术如何与各行业深度融合 构建数字化转型新格局 赋能产业高质
  • 【转载】如何使用VSCode编译IAR

    参考原址 https blog csdn net lczdk article details 114639094 总结 安装IAR For Visual Studio Code插件 使用VSCode打开IAR prj 当前发现最方便的方法是
  • JVM第三讲 JVM从底层原理分析类加载过程

    类加载运行全过程 其中loadClass的类加载过程有如下几步 加载 gt gt 验证 gt gt 准备 gt gt 解析 gt gt 初始化 gt gt 使用 gt gt 卸载 加载 在硬盘上查找并通过IO读入字节码文件 使用到类时才会加