JVM原理与实战(一)

news2024/11/18 12:42:28

jvm的基本结构

 

1.类加载系统  负责从文件系统或者网络中加载Class信息

2.方法区

   (1)加载的类信息存放于一块称为方法去的内存空间

   (2)除了类的信息外,方法区中可能还存放着运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)是所有线程共享的

3.java堆

        java堆是在虚拟机启动的时候建立的,她是java程序中最主要的内存工作区域,几乎所有的java对象和数据都顿放在java堆中,堆空间是所有线程共享的。

4.直接内存

   java的NIO库允许java程序使用直接内存,在Nio被广泛使用后,直接内存的使用也变得非常普通

直接内存是Java堆外的,直接向系统申请的内存空间,访问速度会大于Java堆,它的空间大小只会受操作系统给出的最大内存影响,与java堆相比,虽然在访问读写上,直接内存有较大的又是,但是在内存空间申请上,堆空间的数据远远高于直接内存。

结论:直接内存时候内存空间申请次数较少,访问较频繁的场合。

5.java栈

 java栈是线程私有的,他在线程创建的时候被创建

java栈中保存着栈帧信息,局部变量,方法参数,同时和Java方法的调用,返回密切相关

 6.本地方法栈

与java栈非常类似,最大的不同在于java栈用于Java方法的调用,而本地方法栈则用于native方法调用。

7.PC寄存器

她是线程私有的,如果正在执行的方法不是本地方法,PC寄存器就会指向当前正在被执行的指令

如果当前方法是本地方法,当么PC寄存器的值就是undefined

8.垃圾回收系统

GC可以对方法去,Java堆,直接内存进行回收

Java堆是GC的工作重点,java中所有对象空间释放都是隐式的。

9.执行引擎

是java虚拟机的最核心组件之一,负责执行虚拟机的字节码。

Class类加载

 1.ClassLoader对类进行加载

主动加载的4种情况

(1)new一个对象实例的时候

(2)利用反射或者clone的时候

(3)初始化子类时候,父类会优先初始化

(4)调用一个类的静态方法时。

2.类的加载步骤

(1)加载ClassLoader

通过类的全路径名称,获取二进制数据流

解析类的二进制流转化为方法区(永久代or元空间)内部的数据结构。

创建java.long.Class类的实例对象,表示该类型

(2)验证

目的时保证第一步种加载的字节码文件时合法切符合规范的。

主要分为

   格式检查:检查魔数,版本,长度,

   语义检查:抽象方法是否有实现类,是否继承了final类等等编码语义上的错误检查

   字节码验证:跳转指令是否指向正确的位置,操作数类型是否合理

   符号引用验证:符号引用的直接引用是否存在

(3)准备

准备阶段时正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配直接变量所使用的内存空间。

注意这里面所说的初始值概念,比如一个类变量定义为 public static int v = 8080;实际上变量v在准备阶段过后的初始值为0不是8080,将V赋值为8080的public static指令时程序编译后,存放于类构造器<client>方法中,但是注意如果声明为 public static final int v = 8080 在编译阶段会为V生成ConstantValue属性,在准备阶段虚拟机会根据ConstantValue属性将V赋值为8080

(4)解析

解析阶段是指虚拟机将运行时常量池中的符号引用替换为直接引用的过程,符号引用就是class文件中CONSTANT_Class_Info,CONSTANT_Field_info,CONSTANT_Method_info等类型的常量

(5) 初始化

到达这个阶段,类就可以顺利加载到系统中,此时类才会开始执行java字节码。

初始化阶段时执行类构造器<client>方法的过程,<Client>方法是由编译器自动收集类中的类类变量的赋值操作和静态语句块种的语句合并而成的,虚拟机回保证子<client>方法执行之前,父类的<client>方法已经执行完毕,如果一个类中没有对静态变量赋值也没有静态与巨款,那么编译器可以不为这个类生成<client>()方法。

3.符号引用和直接引用

在解析阶段会有一个步骤,将运行时常量池当中的二进制数据当中的符号引用转化为直接引用的过程

符号引用

以一组符号来描述所引用的飙

符号引用可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可,符号引用和虚拟机引用的布局无关

为什么要有符号引用?

在编译的时候每个java类都会编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,所以就用符号引用来代替,而在解析阶段就是为了把这个符号引用转化为真正的地址的阶段。

直接引用

直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译出来的直接引用一般是不同的

如果有了直接引用,那么直接引用的目标一定被加载到了内存中。

直接引用可以是:

直接指向目标的指针-----指向对象,类变量和类方法的指针

相对偏移量----指向实例的变量,方法的指针

一个简介定位到对象的句柄

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

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

相关文章

PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递

本文目录 PyQt5桌面应用系列How old are you, Dialog?QInputDialog minimalistwhy not lambdaand how partial worksSummary PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件…

HTML购物车示例(勾选、删除、添加和结算功能)

以下是一个简单的HTML购物车示例&#xff0c;包含勾选、删除、添加和结算功能。结算功能使用PHP实现&#xff0c;可以获取选中商品的ID。 以下是一个简单的HTML购物车示例&#xff0c;包含勾选、删除、添加和结算功能。结算功能使用PHP实现&#xff0c;可以获取选中商品的ID以下…

Linux下安装Redis

下载 方式一&#xff1a;官网下载稳定版本&#xff0c;然后FTP上传至服务器 https://download.redis.io/releases/ 方式二&#xff1a;服务器内使用wget下载&#xff08;想下其它版本可参考上图&#xff0c;更改命令后缀版本即可&#xff09; wget http://download.redis.i…

2.基础篇

目录 一、描述软件测试的生命周期&#xff08;软件测试的流程&#xff09; 二、如何描述一个bug 三、bug的级别&#xff08;粗略划分&#xff09; 四、bug的生命周期 五、因为一个bug和开发人员产生争执怎么办 六、如何设置弱网&#xff1f; 一、描述软件测试的生命周期&a…

Flex弹性布局

文章目录 1. 开启Flex布局2. 应用于flex container的css属性flex-directionjustify-contentalign-itemsflex-wrapflex-flowalign-content 3. 应用于flex items的css属性orderflex-growflex-shrinkflex-basis&#xff08;了解&#xff09;align-selfflex 1. 开启Flex布局 flex c…

校招推荐学习java开发还是大数据开发

这两个方向其实都是不错的方向&#xff0c;java虽然卷&#xff0c;但是技能在手也不怕。大数据的发展前景也是不容小觑的。关键就在于你未来想发展的方向以及个人的兴趣 首先可以肯定的是&#xff0c;市场上终归是需要Java人才的&#xff0c;但是总会有人来问&#xff0c;Java…

对偶问题和KKT条件

KKT条件 对于不等式约束优化问题 min ⁡ f ( x ) s . t . g ( x ) ≤ 0 \min\quad f(x)\\ {\rm s.t.}\quad g(x)\leq 0 minf(x)s.t.g(x)≤0 拉格朗日函数为 L ( x , λ ) f ( x ) λ g ( x ) L(x,\lambda)f(x)\lambda g(x) L(x,λ)f(x)λg(x) 。 KKT条件包括 拉格朗日函…

分享5款轻量级的Win10神器,错过你会后悔的

今天我要为大家推荐五款小众而且小体积的WIN10小工具&#xff0c;它们可以让你的电脑使用更加方便和高效&#xff0c;而且不占用太多的空间和资源&#xff0c;非常适合轻量级的办公和娱乐。 1.窗口管理工具——TileIconifier TileIconifier可以将窗口最小化到托盘区域,从而更…

在Android应用中集成使用traceroute工具

背景知识 traceroute是一个常用于Linux系统的网络工具&#xff0c;它可显示数据包在IP网络中所经过路由的IP地址&#xff0c;理想状态下可探测本机和目标地址之间的所有路由节点。 其他操作系统中也有类似的替代品&#xff0c;实现都大同小异。一般用法如下&#xff1a; 终端…

【TCP为什么需要粘包和拆包】

如今&#xff0c;大半个互联网都建立在 TCP 协议之上&#xff0c;我们使用的 HTTP 协议、消息队列、存储、缓存&#xff0c;都需要用到 TCP 协议——这是因为 TCP 协议提供了可靠性。简单来说&#xff0c;可靠性就是让数据无损送达。但若是考虑到成本&#xff0c;就会变得非常复…

一文带你理解SpringBean

Bean定义 ​ Bean作为Spring框架面试中不可或缺的概念&#xff0c;其本质上是指代任何被Spring加载生成出来的对象。&#xff08;本质上区别于Java Bean&#xff0c;Java Bean是对于Java类的一种规范定义。&#xff09;Spring Bean代表着Spring中最小的执行单位&#xff0c;其…

如何用ApiFox自动生成接口文档?没有比这更详细的教程了

目录 前言 第一步&#xff1a;安装 Apifox IDEA 插件&#xff08;Apifox Helper&#xff09; 第二步&#xff1a;配置 Apifox 访问令牌 和项目 ID 第三步&#xff1a;自动生成文档&#xff01; 第四步&#xff1a;去 Apifox 项目中查看自动生成的文档 Apifox 更多好用的功能…

Addictive Multiplicative in NN

特征交叉是特征工程中的重要环节&#xff0c;在以表格型&#xff08;或结构化&#xff09;数据为输入的建模中起到了很关键的作用。 特征交互的作用&#xff0c;一是尽可能挖掘对目标有效的模式、特征&#xff0c;二是具有较好的可解释性&#xff0c;三是能够将对数据的洞见引…

一文教会你如何重装Windows10系统【过程+图解+说明】

前言 申请了一台台式机电脑&#xff0c;操作系统是windows11的&#xff0c;要windows10的系统。电脑不能连网&#xff0c;身为程序员&#xff0c;我竟然想着别人远程帮我安装&#xff0c;可恶呐。之前也没重装过系统。第一次重装遇到了一些坑。我甚至在拼夕夕上花了几块钱买个镜…

python-使用Qchart总结5-使用信号槽绘制动态曲线图

python-使用Qchart总结3-绘制曲线图在这篇文章基础上&#xff0c;来改造一下&#xff0c;绘制一下动态曲线图吧 一、明确需求 ①点击按钮&#xff0c;开始动态加载曲线&#xff0c;细节:一个一个点加载出来 二、实现 ①在UI上添加按钮&#xff0c;打开原先的untitled.ui文件…

【Linux】浅谈eloop机制

目录 1.eloop 机制 2.eloop结构体 2.1.eloop_data结构体 2.2 Socket事件结构体 2.3 Timeout事件结构体 2.4 Signal事件结构体 3.eloop_init 4.eloop_run 4.1 signal事件 4.2 socket事件 4.3 timeout事件 1.eloop 机制 主线程中启动事件监听机制&#xff0c;对不同的…

【Python入门】字符串的扩展

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

Nginx介绍及安装

简介 Nginx 是一个高性能的 HTTP 和反向代理服务器。它最初由 Nigel Cook 开发&#xff0c;旨在解决 Apache 服务器在高并发环境下性能瓶颈的问题。Nginx 具有占用资源少、处理能力强等优点&#xff0c;在互联网应用中广泛应用于静态资源服务、反向代理、负载均衡、HTTP缓存、…

2023年web前端开发之JavaScript进阶(一)

接上篇博客进行学习,通俗易懂,详细 博客地址: 2023年web前端开发之JavaScript基础(五)基础完结_努力的小周同学的博客-CSDN博客 学习内容 学习 作用域、变量提升、 闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0…

rs485转tcp网关盒子怎么用(rs485协议转以太网tcp/ip)

随着工业自动化技术的不断发展&#xff0c;越来越多的工业设备在使用时需要进行数据通信。其中&#xff0c;RS485通信协议是一种常见的工业通信协议&#xff0c;而TCP/IP协议则是互联网通信的标准协议。为了实现RS485协议与TCP/IP协议之间的通信&#xff0c;可以使用RS485转TCP…