JVM原理与实战(一)

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文件,但在编译的时候虚拟机并不知道所引用类的地址,所以就用符号引用来代替,而在解析阶段就是为了把这个符号引用转化为真正的地址的阶段。

直接引用

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

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

直接引用可以是:

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

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

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

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

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

相关文章

什么是皮安计?皮安表测试测量软件分享NS-SourceMeter

什么是皮安计 测量低直流电流&#xff0c;其需求常常远远超出数字万用表的功能。一般来说&#xff0c;数字万用表缺少测量低于100nA的电流所需的灵敏度。即使在较高的电流水平上&#xff0c;一个DMM的输入电压降&#xff08;电压负担&#xff09;高达几百毫伏&#xff0c;也不…

DD驱动鼠标键盘(驱动级别机器人使用鼠标键盘)

官网下载 DD虚拟键盘虚拟鼠标 github下载 GitHub - ddxoft/master 点击下载后&#xff0c;将驱动包下&#xff0c;这里以win7为例 setup运行安装 安装成功后 可以打开电脑管理&#xff0c;可以看见DD虚拟鼠标和键盘 这里以JAVA接入为例 使用管理员权限启动eclipse &#…

汇编语言-复习自用

本文用于自我复习汇编语言&#xff0c;参考b站一位老师的讲解整理而成&#xff0c;感谢老师的无私付出视频链接链接 文章目录 1.第一章1.1计算机组成1.2读取1.3 寄存器及数据存储1.4 mov和and指令1.5 确定物理地址1.6 内存分段表示法1.7debug使用1.8CS:IP1.9jmp指令改变csip1.1…

【react 全家桶】高级指引(上)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 12 【react高级指引&#xff08;上&…

SSM框架(SpringBoot快速构建)

简介 本文意在快速构建一个可以接受前端访问&#xff0c;并进行数据库查找&#xff0c;随后返回相关信息给前端的项目。 ssm为Spring IocSpringMVCMyBatis的缩写 Spring Ioc:管理对象的一个工厂。对象之间有依赖&#xff0c;相互引用Spring MVC:开发代码模式Mybatis:操作数据…

7万字省级智慧农业大数据平台项目规划建设方案

1.1 系统总体结构和逻辑结构 XX市智慧农业项目数据中心是全省数据处理加工和数据分析应用的中心&#xff0c;总体上需实现上连省农业厅、下连各级农业、外连市级部门&#xff1b;构建资源整合、互联互通、资源共享的全省统一的数据中心资源库&#xff1b;构建完善的底层支撑平…

放弃40k月薪的程序员工作,选择公务员,我来分享一下看法

我有一个朋友&#xff0c;拒绝了我为他提供的4万薪水的工作&#xff0c;去了一个体制内的银行&#xff0c;做程序员&#xff0c;即使薪水减半。他之前在北京一家大公司做程序员&#xff0c;一个月30k。当我开始创业时&#xff0c;我拉他来和我一起干&#xff0c;但那时我们太小…

windeployqt工具打包C++ QT项目

目录 前言方法TIP 前言 使用VS编写好QT项目后&#xff0c;有时需要发送给他人进行测试。在此情况下&#xff0c;发送所有项目文件显然不可取&#xff0c;因为exe文件不能独立运行&#xff0c;故在测试前需要先配置项目环境&#xff0c;以确保运行所需的库文件能够完全。 因此&…

Java枚举:为什么它是单例模式的最佳选择?

前言 单例模式&#xff0c;是工作中比较常见的一种设计模式&#xff0c;通常有两种实现方式&#xff0c;懒汉式和饿汉式。但是这两种实现方式存在一些问题。懒汉式需要在多线程环境下使用同步锁机制来保证只有一个实例被创建&#xff0c;这会影响程序的性能。而饿汉式在类加载时…

使用kubeadm搭建生产环境的多master节点k8s高可用集群

环境centos 7.9 目录 1.对安装 k8s 的节点进行初始化配置 2 通过 keepalivednginx 实现 k8s apiserver 节点高可用 3、kubeadm 初始化 k8s 集群 4.扩容 k8s 控制节点&#xff0c;把 xuegod62 加入到 k8s 集群 5、扩容 k8s 控制节点&#xff0c;把 xuegod64 加入到 k8s 集群…

使用Gradle7.6+SpringBoot 3.0+java17创建微服务项目

系列文章目录 学习新版本&#xff0c;菜鸟一枚 会持续更新的 文章目录 系列文章目录前言一、搭建项目1.1、创建git仓库1.1.1、登录gitee&#xff0c;新建仓库1.1.2、得到如下命令&#xff08;新建仓库使用创建git仓库 即可&#xff09; 1.2、使用IDEA创建项目1.2.1、开发工具1.…

代码随想录算法训练营day34 | 1005.K次取反后最大化的数组和 ,134. 加油站,135. 分发糖果

代码随想录算法训练营day34 | 1005.K次取反后最大化的数组和 &#xff0c;134. 加油站&#xff0c;135. 分发糖果 1005.K次取反后最大化的数组和解法一&#xff1a;两次正常排序解法二&#xff1a;一次排序 134. 加油站135. 分发糖果 1005.K次取反后最大化的数组和 教程视频&a…

JavaScript原型链污染学习记录

1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制&#xff0c;比较官方的定义&#xff1a; 我们创建的每个函数都有一个 prototype&#xff08;原型&#xff09;属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c; 而这个对象的用途是包含可…

基于STL的演讲比赛管理系统

目录 一、比赛规则描述 二、比赛程序的功能 三、比赛的运行结果 四、程序的实现 1、程序实现的大致思路 2、程序的模块化 <1>选手信息的类 <2>管理比赛所有进度的接口头文件 <3>比赛进行的实现 <4>用户的交互界面<演讲比赛管理系统.cpp>…

DPDK抓包工具dpdk-dumpcap的使用

在进行网络开发中&#xff0c;我们经常会通过抓包来定位分析问题&#xff0c;在不使用DPDK的情况下&#xff0c;Linux系统通常用tcpdump&#xff0c;windows用wireshark&#xff0c;但是如果我们使用了DPDK来收包&#xff0c;就无法用这两个工具来抓包了。 这个时候我们需要用D…

Linux + 香橙派 + V4L2 + http 实现远程监控摄像头在网页端显示

项目场景&#xff1a; 项目需求&#xff0c;需要做一个基于边缘端的人脸识别远程监控摄像头并在网页前端展示 &#xff0c;这里采用国产香橙派作为边缘计算终端&#xff0c;安装ubuntu系统&#xff0c;系统中采用v4l2接口对摄像头进行获取&#xff0c;当客户端通过网页进行请求…

RSA--维纳攻击--代码和题目分析

文章目录 维纳攻击原理&#xff1a;维纳攻击脚本[羊城杯 2020]RRRRRRRSA 1题目描述&#xff1a;题目分析&#xff1a; 收获与体会&#xff1a; 维纳攻击原理&#xff1a; 两位大佬讲得非常清楚&#xff08;搬运工就是我&#xff09;&#xff1a;https://zhuanlan.zhihu.com/p/…

MyBatisPlus学习笔记(SpringBoot版)

MyBatisPlus学习笔记&#xff08;SpringBoot版&#xff09; 一、MyBatis-Plus简介1、简介2、特性3、支持数据库4、框架结构5、代码及文档地址 二、入门案例1、开发环境2、创建数据库及表2.1 创建表2.2 添加数据 3、创建Spring Boot工程3.1 初始化工程3.2 引入依赖3.3 idea中安装…

史上最烂 spring web 原理分析

盗引下篇spring web spring web、spring web 与 tomcat、映射器与适配器、参数解析器与类型转换器、返回值处理器与消息转换器、异常处理器、ControllerAdvice、spring web 工作流程。 版本 jdk&#xff1a;8spring&#xff1a;5.3.20spring boot&#xff1a;2.7.0 1 spring…

python调用海康sdk报错问题

sdk参考&#xff1a; (68条消息) Python调用海康威视网络相机_调用海康SDK_python 海康威视_有一点点麻瓜的博客-CSDN博客https://blog.csdn.net/yinweizhehd/article/details/118722052 报错1&#xff1a; 生成解决方案的时候&#xff0c;显示LNK2001&#xff1a;无法解析的…