Java虚拟机笔记

1、JDK&JRE&JVM

  • Java 执行流程

    image-20230818080111014

  • JRE的应用

image-20230818080437924

  • JDK

image-20230818080501387

  • JDK+JRE+JVM

    • JDK(Java开发环境):JRE+工具(编译器、调试器、其他工具等)+类库

      编译器:将Java 文件编译为class文件,也是JVM能运行解释的文件

    • JRE(Java 运行环境):JVM+Java解释器

    • JVM:Java虚拟机

2、Java字节码文件结构

image-20230818081451559

  • 官方字节码文件结构

image-20230818081730077

  • 什么是u2u4

u2:代表数据占2个字节, u4:代表4个字节。

  • JDK编译对应版本号

JDK7-->51 JDK8-->52 JDK-->53 ……

image-20230818082632044

  • 编译的本质

    编译的本质就是Java源文件转换为JVM认识的16进制class文件格式。JVM虚拟机不只是为Java服务,只要符合class标准格式的16进制JVM就能识别。

3、类的加载机制

3.1 类加载大概流程

image-20230818083133336

  1. 装载:获取类的全限定类名,将class文件转化为二进制流。

    1. 将二进制流中类的描述信息存入方法区。如:创建时间、版本等……

    2. 将java.lang.Class对象放入内存。

image-20230818083752782

  1. 链接

    1. 验证:验证被加载类的正确:如文件的格式,文件元素等。

    2. 准备:在方法区中为静态变量分配空间,并设置初值。

    3. 解析:把类的符号引用转换为直接引用。

image-20230818085136385

3.初始化

为类的静态变量设置默认值,执行静态代码块。

image-20230818085830157

①装载---->②链接(验证,准备,解析)---->初始化

image-20230825104559030

第一步:加载指的是把class字节码文件从各个来源通过类加载器(包括启动类加载器,拓展类加载器、应用类加载器、用户自定义加载器)装载入内存中。

流程是,获取全限定类名-->将class字节文件转化为二进制流-->将二进制流中类的描述信息放入方法区。将java.lang.Class对象放入堆内存。

第二步:链接

  • 验证:比如文件格式的验证,元数据的验证(如是否继承了final修饰的类),字节码的验证(保证语义的准确性),符号引用的验证。

  • 准备:主要为静态变量(类变量)分配内存,并赋予初值(初值,不是代码中具体写的初始化的值)。

比如8种基本类型的初值,默认为0;引用类型的初值则为null;常量的初值即为代码中设置的值,final static tmp = 456, 那么该阶段tmp的初值就是456

  • 解析:符号引用替换为直接引用的过程。

第三步:初始化

主要是对类变量初始化,是执行类构造器的过程。

拓展:为什么会有自定义类加载器?

  1. 一方面是由于java代码很容易被反编译,如果需要对自己的代码加密的话,可以对编译后的代码进行加密,然后再通过实现自己的自定义类加载器进行解密,最后再加载。

  2. 另一方面也有可能从非标准的来源加载代码,比如从网络来源,那就需要自己实现一个类加载器,从指定源进行加载。

3.2 类加载器

3.2.1 分类

不同的类加载器加载不同的类:

启动类加载器(Bootstrap classloader):主要负责加载Java中的一些核心类库,主要位于<JAVA_HOME>/lin/rt.jar中。

拓展类加载器(Extension classloader):主要加载一些拓展类,是启动类加载类的子类。

应用类加载器:(System classlzhuyoader):主要用于加载CLASSPATH 路径下,我们自己定义的类,是拓展类加载器的子类。

image-20230818092121435

这由于双亲委派机制模型导致的一个原因。

3.2.2 双亲委派模型

如果一个类加载器收到了类的加载请求,他不会自己去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在其父类加载器,则进一步加载向上委托,一次递归,请求最终达到顶层的启动类加载器返回可以完成类加载任务,就成功返回。倘若父类加载器无法完成此次加载任务,子加载才会尝试自己去加载。

image-20230818094519585

  • 如何打破双亲委派机制? 例子:Tomcat

    自定义类加载器类,继承Classloader类,重写loadClass()方法.

4、JVM内存模型

4.1 什么是JVM内存模型

JVM需要使用计算机的内存,Java程序运行中所处理的对象或者算法都会用使用JVM的内存空间,JVM将内存划分为5块,这样的结构称为JVM内存模型。

4.2 JVM为什么进行内存区域划分

随着对象数量的增加,JVM内存使用率也在增加,如果JVM内存使用率达到100%,则无法继续运行Java程序。为了让JVM内存,我们需要对JVM内存进行回收。为了提高垃圾回收效率,JVM将内存区域进行了划分。

4.3 JVM内存划分

JVM按照线程是否独享将内存首先分为两大类。

  • 线程独享区

只有当前线程能访数据的区域,线程之间不能共享。

线程独享区随线程的创建,随线程的销毁而被回收。

  • 线程共享区

    所有线程都可以访问的区域。

当线程被销毁的时候,线程共享区的数据不会立即回收,需要等待达到垃圾回收的阈值之后才会进行回收

  • 模型图

image-20230818103022944

image-20230818103631152

栈内存独立:基本数据类型

堆内存共享:引用数据类型数据

4.3.1 程序计数器

image-20230818113640698

程序计数器会记录当前线程要执行指令的内存地址,只占用一小部分的内存区域,只记录一个地址,所以我们认为程序计数器是不会出现内存溢出的问题的分区。

所以虚拟机是不会优化程序计数器区域的。

4. 3.2 本地方法栈

Java中有些代码的视线是依赖于其他非Java语言的(C++),本地方法栈存储的是维护非Java语句执行过程中产生的数据,一般本地方法栈不会出现内存问题。

4.4 虚拟机栈

存放当前线程中所有声明的变量,包基本数据类型和引用数据类型的引用。

  • 基本数据类型和引用数据类型的划分标准

    • 基本数据类型:变量在声明的时候,能够确认占用内存的大小。

    • 引用数据类型:变量在声明的时候不知道占用内存大小。

      引用数据类型将值的引用放到虚拟机栈中,而对象则存在对内存中,引用数据类型占用4个字节存放地址。

image-20230818150630402

4.4.1 栈帧的结构

image-20230818150923077

image-20230818151247199

  • 常量池的应用中的常量存放的你是值。而是 方法区中常量池中的常量的地址。

image-20230818151731876

  • 局部变量:存放当前方法的局部变量,基本数据类型存储值。引用数据类型存储堆内存中的地址。

  • 操作数栈:对方法的变量提供计算的区域。

  • 常量数据的引用:常量数据会存放到方法区的常量池,不管是基本数据类型还是引用数据类型都会存放常量池的地址。

  • 方法返回值的地址:方法返回数据会存到计算机内存的寄存器中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多点GRE over IPsecVPN模式下nhrp的调优

一、实验目的 在多点GRE over IPsecVPN模式下对nhrp进行调优&#xff0c;在总部开启重定向、在分支开启shortcut 网络拓扑&#xff1a; 二、基础设置 &#xff08;一&#xff09;如图所示配置接口地址和区域&#xff0c;连接PC的接口位于trust区域、连接路由器的接口位于unt…

【VUE基础】VUE3小技巧(持续更新)

一键快速生成自定义vue3模板代码 根据上图打开配置用户代码片段 搜索vue.jsond打开 "Print to console": {"prefix": "vue","body": ["<!-- $0 -->","<template>"," <div></div>&…

轴承垫圈外观检测有什么技巧?

轴承是一种用于支撑旋转机械零件的元件&#xff0c;通常用于减少摩擦和支撑旋转轴的重量。轴承通过在内部部署滚珠、滚柱或滑动体等方式&#xff0c;使轴的旋转更加顺畅&#xff0c;减少摩擦阻力&#xff0c;并支撑轴的重量。轴承广泛应用于各种机械设备中&#xff0c;包括汽车…

软考分数线有3种,低于45分也能拿证!

软考合格分数标准是45分&#xff0c;这个是广泛为人所知的。然而&#xff0c;有些地区即使没有达到45分也可以获得证书&#xff0c;这一点许多考生并不清楚。总的来说&#xff0c;软考的合格标准有三种&#xff01; ● 全国分数线&#xff1a;通常是各科45分及格&#xff0c;证…

Syncthing一款开源去中心化和点对点文件同步工具

Syncthing&#xff1a;一款开源的文件同步工具&#xff0c;去中心化和点对点加密传输&#xff0c;支持多平台&#xff0c;允许用户在多个设备之间安全、灵活地同步和共享文件&#xff0c;无需依赖第三方云服务&#xff0c;特别适合高安全性和自主控制的文件同步场景。 &#x…

人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了各种视觉处理函数&#xff0c;并…

全志A527 T527 android13支持usb摄像头

1.前言 我们发现usb摄像头在A527 android13上面并不能正常使用,需要支持相关的摄像头。 2.系统节点查看 我们查看系统是否有相关的节点生成,发现/dev/video相关的节点已经生成了。并没有问题,拔插正常。 3.这里我们需要查看系统层是否支持相关的相机, 我们使用命令进行…

11个提升Python列表编码效率的高级技巧

Python中关于列表的一些很酷的技巧 1、collections.deque deque(双端队列)非常适合从列表的两端快速添加和删除项目。 2、使用带有if-else条件的列表推导式 使用if-else的列表推导式可以以简洁的方式创建具有条件逻辑的列表。 3、itertools.product itertools.product从两个…

【windows OBS开启直播】Windows搭建RTMP视频流服务(Nginx服务器版)

如果您想在windows 电脑上设置RTMP服务器&#xff0c;并使用VLC播放器播放OBS的直播流&#xff0c;您可以使用一个本地的RTMP服务器软件&#xff0c;如nginx配合nginx-rtmp-module来搭建。下面 详细介绍下如何搭建此视频流服务。 1、安装和配置本地RTMP服务器 步骤1&#xff…

动手学深度学习6.2 图像卷积-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;卷积层_哔哩哔哩_bilibili 代码_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.2. 图像卷积 — 动…

进程,进程的调度,进程的调度算法(详解)ฅ( ̳• · • ̳ฅ)

目录 &#x1f607;进程的概念&#xff1a; &#x1f61a;进程的组成&#xff1a; &#x1f970;进程的调度&#xff1a; 一.进程调度的概念&#xff1a; 二.进程调度的方式&#xff1a; 三.进程调度的时机&#xff1a; &#x1f92a;进程的调度算法&#xff1a; 一.先…

leetcode--二叉树中的最大路径和

leetcode地址&#xff1a;二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总…

UE5 本地化多语言方案

导入插件&#xff1a; https://www.unrealengine.com/marketplace/zh-CN/product/07e1d9bd9ced444c9b2a7e232161f74d​www.unrealengine.com/marketplace/zh-CN/product/07e1d9bd9ced444c9b2a7e232161f74d 打开测试关卡 打开插件下图目录&#xff0c;csv文件可以添加多个&…

SVN小乌龟没有绿勾解决方法

SVN小乌龟没有绿勾解决方法 1、步骤一2、步骤二3、步骤三&#xff08;修改注册表&#xff09;4、参考文章 1、步骤一 在链接文件夹中右击鼠标 2、步骤二 3、步骤三&#xff08;修改注册表&#xff09; ①在Tortoise1Normal前面放空格&#xff0c;保证Tortoise1Normal前面的空格…

系统吃swap问题排查

目录 背景 问题 分析并解决 1.控制线程数 2.更换IO组件 3.Linux进程信息文件分析 总结加餐 参考文档 背景 隔壁业务组系统是简单的主从结构&#xff0c;写索引的服务(主)叫primary&#xff0c; 读索引并提供搜索功能的服务(从)叫replica。业务线同步数据并不是平滑的&…

【转载】目标检测mAP的含义

转载自三叔家的猫 https://blog.csdn.net/qq_39056987 https://blog.csdn.net/qq_39056987/article/details/104348493 <div id"content_views" class"markdown_views prism-atom-one-light"><svg xmlns"http://www.w3.org/2000/svg" s…

rocketmq实现限流

目录 问题背景 技术方向 方案确认 消息队列&#xff08;√&#xff09; 分布式锁&#xff08;&#xff09; 方案实现 监控方向 业务方向 问题背景 公司邮件服务token有 分钟内超200封的熔断机制&#xff0c;当前token被熔断后&#xff0c;系统发邮件操作会被忽略&…

使用F1C200S从零制作掌机之构建debian文件系统

前情&#xff1a;使用buildrootfs构建的文件系统调试了很久NES模拟器&#xff0c;执行InfoNES模拟器的时候一直黑屏&#xff0c;无内容显示&#xff0c;调不通了&#xff0c;所以改用debian系统试试。 一、环境配置 首先下载两个工具&#xff1a;qemu-arm-static和debootstra…

如何在 Microsoft Edge 上使用开发人员工具

Microsoft Edge 提供了一套强大的开发人员工具&#xff0c;可帮助 Web 开发人员检查、调试和优化他们的网站或 Web 应用程序。 无论您是经验丰富的 Web 开发人员还是刚刚起步&#xff0c;了解如何有效地使用这些工具都可以对开发过程产生重大影响。 在本文中&#xff0c;我们…

vb.netcad二开自学笔记8:界面之任务窗格

使用net可以创建一个类似属性面板的自定义的任务窗格&#xff0c;从而实现应用程序更丰富的人机交互。 1、添加一个自定义控件 2、在前面创建的代码框架内增加一个命令函数ShowMyPalette Imports System.Windows.Media.Imaging Imports Autodesk.AutoCAD.ApplicationServices …