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 分半的对话里,他们介绍了论文的核心内容,一问一答,听上去相当自然。 播客原址…

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

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

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

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

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官方文档 官方文档其实讲述的很详细了,在此记录一下,方便以后维护。 另外欢迎来我的博客 火柴人儿的小站,本博客基于雨云服务器…

15.2 JDBC数据库编程2

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

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

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

百度静态资源瓦片nginx直接显示完整案例

案例地址:https://download.csdn.net/download/jinhuding/89733763 访问显示效果:(根据瓦片地址直接显示) http://172.16.39.203:8099/tiles/

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant&am…

视频号黄金时间

现在刷视频的人越来越多,看视频号的也很多,那我们应该怎样发视频号呢?发朋友圈都有黄金时间,那视频号有吗? 答案是:有的。 不同时间段发什么内容的视频,可以引流更多精准的流量,可…

【JAVA入门】Day34 - Stream流

【JAVA入门】Day34 - Stream流 文章目录 【JAVA入门】Day34 - Stream流一、Stream 流的作用和使用步骤1.Stream流的创建,数据的添加2. Stream流的中间方法3. Stream流的终结方法 Stream 流有什么作用?我们看一个例子: 【练习】需求&#xff…

记录一下linux安装nginx,也是很简单了啦

1、下载nginx 官网下载nginx:http://nginx.org/,这里很简单,下载自己想要的版本就行,这里不罗嗦 1、进入home目录,建一个文件夹nginx rootroot ~]# cd /home rootroot home]# mkdir nginx rootroot home]# cd /nginx2…

Java语言程序设计——篇十三(1)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

系统架构师考试学习笔记第四篇——架构设计实践知识(21)安全架构设计理论与实践

本章考点: 第21课时主要学习信息系统中安全架构设计的理论和工作中的实践。根据考试大纲,本课时知识点会涉及案例分析题和论文题(各占25分),而在历年考试中,综合知识选择题目中也有过诸多考查。本课时内容侧重于知识点记忆;,按照以往的出题规律,安全架构设计基础知识…

SOMEIP_ETS_100: SD_ClientServiceActivate_no_FindServices_in_Main_Phase

测试目的: 确保客户端服务模式仅在启动阶段发送FindService消息,在主阶段不发送。 描述 本测试用例旨在验证DUT在客户端服务模式下的行为,即它应当在启动阶段发送FindService消息,并在进入主阶段后停止发送。 测试拓扑&#x…

【触想智能】工业一体机在物流领域上的四大应用分析

随着物流业的快速发展,工业一体机在物流领域上的应用越来越普遍。工业一体机是一种高级智能设备,是多种技术的综合应用,包括机械、电子、计算机、通讯等。 在物流行业中,工业一体机可以发挥其先进的技术和功能,提高物流…