JVM合集

序言:

1.什么是JVM?

  • JVM就是将javac编译后的.class字节码文件翻译为操作系统能执行的机器指令
  • 翻译过程:
    • 前端编译:生成.class文件就是前端编译
    • 后端编译:通过jvm解释(或即时编译或AOT)执行
  • .class文件时跨平台的,jvm并不是跨平台的
  • 通过javap进行反编译

2.java文件是怎么变成.class文件的?

属于前端编译

3..class文件解读

  • 采用16进制
  • magic、版本号、常量池(包括字面量、符号引用、接口、字段、方法等)、字段表集合、方法表集合
  • 符号引用就是类信息、修饰符、名称等

4.类加载机制(JVM的类加载子系统)

  • 所谓的类加载机制就是将class文件加载进内存,并对数据进行校验,转换解析和初始化,使得JVM可以直接使用。
  • 如何加载进内存?
    • 常见的从本地系统加载
    • 动态代理
    • 从jar包加载
  • 类加载过程
    • 装载:
      • 通过类全限定名获取类的二进制字节流!这个过程可以做拦截增强
      • 字节流代表的静态存储结构转换为方法区的运行时数据结构
      • 在堆中生成java.lang.class对象,作为对方法区中这些数据的访问入口(defineClass方法生成
    • 链接
      • 验证:格式验证、字节码验证:跳转验证、符号引用验证、元数据验证:语法。-Xverify:none 取消验证。穿插在整个过程中
      • 准备:为静态变量赋值,初始化成默认值。
        • 这里不包含final修饰的static,final修饰的static都在编译的时候就分配了
        • 不会为实例变量分配初始化,类变量在方法区中,实例变量随着对象在堆中(即在实例构造器方法中进行的)
      • 解析
        • 将符号引用(名称、描述符、全限定名啥的)转换成直接引用,直接指向目标的指针(方法区里的指向)
        • 对解析结果进行缓存
    • 初始化
      • 对比于准备阶段,这里是通过指定主观计划去初始化变量和其他资源。有点懒加载的味道,需要使用的时候才加载
      • 对类变量设置初始值的两种方式:
        • 直接声明
        • static代码块
      • 步骤
        • 先装载和链接本类
        • 然后初始化父类
        • 初始化自己
      • 什么时候加载(初始化):(主动引用)
        • 创建实例;final在调用构造方法前就要弄好
        • 使用静态变量或者静态方法的时候
        • 调用子类父类也会初始化;
        • 标明启动类的类,或者像object和class类启动时候就加载了
        • 反射的时候
      • (被动引用)
        • 定义类数组不会初始化
        • 使用父类的静态变量,不会初始化
        • 使用static final不会初始化
    • 卸载:
      • 用完之后就卸载回收
      • 所有实例被回收,classloader被gc回收,class对象没有被任何地方引用

5.类加载器

  •  类加载器:
    • 就是读取字节码,转换成java.lang.class类的一个实例的代码模块
    • 一个类在同一个类加载器中具有唯一性,不同类加载器是允许同名类存在的,类加载器不同,就不会是同一个类。
    • 分类:
      • Bootstrap classloader:负责java_home的所有class,核心类库
      • Platform classloader:负责一些扩展的包
      • Application classloader:classpath中指定的包
      • custom classloader:根据程序自定义类加载器
    • 为什么要分层?
      • 如果自己编写了一个String类,如果只有一个的话无法判定究竟要加载哪个。所以分层对信任级别进行划分
      • 即使打破了双亲委派也不能重写String,defineClass限制了限定类名不能以java开头,除非自己将二进制流转换成class对象
    • 三个特性:
      • 全盘负责:
        • 当一个类加载器加载某个class的时候,该class所依赖的和引用其他的class都由该类加载器负责载入。除非显式使用另一个类加载器
      • 父类委托(双亲委派):
        • 首先传入类的全限定名
        • 为什么:实现带有优先级的层次关系
        • 从app层依次往上找是否加载过,然后又从上往下看谁能加载,最后还没有就抛异常。
        • 可以重写loadclass打破双亲委派
        • 打破:
          • SPI,JDK提供了一套接口,定义实现类,在META-INF/services中注册实现类的相关信息,比如JDBC的DriverManager
          • OSGI:热部署、热替换
          • 如果怕打破可以重写findclass方法
      • 缓存机制:
        • 加载过的class文件在内存中(方法区)缓存
        • 每一个类加载器都有自己的缓存
      • 打破父类委托:
        import java.io.IOException;
        import java.io.InputStream;public class CustomClassLoader extends ClassLoader {public CustomClassLoader(ClassLoader parent) {super(par

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

任意论文一键变播客,谷歌正式发布Illuminate,它能重构研究者的学习方式吗?

先来听一段英文播客,内容是不是很熟悉? ,时长04:27 是的,这俩人就是在聊那篇《Attention is All You Need》。在 4 分半的对话里,他们介绍了论文的核心内容,一问一答,听上去相当自然。 播客原址…

OAuth2.0和JWT

OAuth2.0 阮一峰的 理解OAuth 2.0 通俗的讲解了OAuth 2.0 的设计思路和运行流程 简单来说,OAuth(开放授权)是一种开放标准,用于允许用户在不暴露其凭据(如用户名和密码)的情况下,让第三方应用…

OPENAIGC开发者大赛企业组金奖 | 深度融合大语言模型的企业级智能文本审核系统

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…

SpringBoot大学生租房平台:技术实现与市场分析

第2章 开发环境与技术 大学生租房平台的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对大学生租房平台用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的,是经常变动的,没有办…

[最优化方法] 《最优化方法》个人问答式学习笔记 with LLM

《最优化方法》问答式学习笔记 with LLM 文章目录 《最优化方法》问答式学习笔记 with LLM写在前面每周提问的链接表格绪论 | 第一周 | [answer by 文心一言]Q1 请为我解释一下最优化方法研究的核心重点主要是哪些?一、问题定义与建模二、求解方法三、算法性能与优化…

【Sqlite】.NET Framework使用Sqlite的注意事项

注意:NuGet引入System.Data.SQLite.Core不要引入System.Data.SQLite 注意:局域网共享链接 正常链接Data Source\\BAT-OCV\SqliteDB\batOCV.db;Version3;PoolingTrue;Max Pool Size100; 局域网链接Data Source\\\BAT-OCV\SqliteDB\batOCV.db;Version3;P…

qt怎么格式化字符串?

在Qt中,格式化字符串可以通过多种方式实现,主要依赖于你的具体需求和上下文。下面列出了一些常见的方法: 1. 使用QString的arg()方法 QString类提供了arg()方法,这个方法允许你插入值到字符串中的占位符位置。占位符由%1、%2等表…

HTML5+CSS+JS制作中秋佳节页面

HTML5CSSJS制作中秋佳节页面 中秋节,是中国民间的传统节日。每年农历八月十五庆祝。 在中秋节这一天,人们会通过各种方式庆祝,其中最重要的活动之一就是赏月。家人团聚在一起,共同欣赏明亮的月亮。同时,吃月饼也是中秋…

Delphi 12.1安卓APP开发中获取硬件信息及手机号

Demo与代码已上传到CSDN下载。 这里简单说一下代码内容,完整代码请自行下载,不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件,TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载控…

2024年【上海市安全员C证】考试题库及上海市安全员C证报名考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年【上海市安全员C证】考试题库及上海市安全员C证报名考试,包含上海市安全员C证考试题库答案和解析及上海市安全员C证报名考试练习。安全生产模拟考试一点通结合国家上海市安全员C证考试最新大纲及上海…

Vue 3 + Element Plus 封装单列控制编辑的可编辑表格组件

在Web应用开发中,经常需要提供表格数据的编辑功能。本文将介绍如何使用Vue 3结合Element Plus库来实现一个支持单列控制编辑功能的表格,并通过封装组件的形式提高代码的复用性。通过本教程,你将学会如何构建一个具备单列控制编辑功能的表格组…

Vue2中使用ant-design的tab组件让他一行充满

使用tabs组件默认样式这样 想改成水平居中铺满如下: 需要改下css样式 /deep/ .ant-tabs-nav {width: 100%;& > div {width: 100%;display: flex;align-items: center;}.ant-tabs-tab {flex: 1;text-align: center;}}

为Hexo添加说说功能—Artitalk

文章目录 Artitalk部署LeanCloud配置Hexo Artitalk 基于 LeanCloud 实现的可实时发布说说/微语的 js Artitalk.js官方文档 官方文档其实讲述的很详细了,在此记录一下,方便以后维护。 另外欢迎来我的博客 火柴人儿的小站,本博客基于雨云服务器…

MongoDB延迟查询

在 MongoDB 中,查看副本集成员之间的副本延迟可以通过以下步骤进行: 使用 rs.status() 命令: 这个命令提供了副本集的详细状态信息,包括每个成员的延迟情况。在 MongoDB shell 中,你可以执行以下命令: rs.s…

斯坦福大学论文润色chat-gpt指令

Quick Prompts快速提示 To enhance text clarity-为了增强文本清晰度 As a non-native English speaker, kindly help me revise the following text for improved understand clarity. Please check for spelling and sentence structure errors and suggest alternatives.为…

15.2 JDBC数据库编程2

15.2.1 数据库访问步骤 使用JDBC API连接和访问数据库,一般分为以下5个步骤: (1) 加载驱动程序 (2) 建立连接对象 (3) 创建语句对象 (4) 获得SQL语句的执行结果 (5) 关闭建立的对象,释放资源 下面将详细描述这些步骤 15.2.2 加载驱动程序 要使…

山东省行政执法证照片要求及图像处理方法

在山东省,行政执法证是执法人员身份的重要标识,其照片的规范性对于证件的有效性至关重要。本文将详细介绍山东省行政执法证照片的要求,并提供使用手机相机拍照的实用方法,以确保照片符合标准。 一、山东省行政人员执法证照片拍摄要…

el-table实现当内容过多时,el-table显示滚动条,页面不显示滚动条

估计有不少小伙伴在开发公司的ERP使用el-table都会遇到这么一个问题,就是产品经理提出,页面不出现滚动条,因为不美观。但是当el-table内容过多,超过页面的宽度时候,页面就会有滚动条。那应该如何解决呢?能不能让滚动条…

MySQL 大量 IN 的查询优化

背景 (1)MySQL 8.0 版本 (2)业务中遇到大量 IN 的查询,例: SELECT id, username, icon FROM users WHERE id IN (123, 523, 1343, ...);其中 id 为主键,IN 的列表长度有 8000 多个 问题 …

c++开关灯

题目描述 现有 𝑛n 盏灯排成一排,从左到右依次编号为:11,22,……,𝑛n。然后依次执行 𝑚m 项操作。 操作分为两种: 指定一个区间 [𝑎,𝑏][a,b]&…