【Java】JVM学习(二)

news2025/1/8 4:55:47

JVM的内存区域

运行时数据区域

运行时数据区的定义:

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域

Java 引以为豪的就是它的自动内存管理机制。相比于 C++的手动内存管理、复杂难以理解的指针等,Java 程序写起来就方便的多。

所以要深入理解JVM必须理解内存虚拟化的概念。

在JVM中,JVM 内存主要分为程序计数器方法区虚拟机栈本地方法栈等。
同时按照与线程的关系也可以这么划分区域:

线程私有区域:一个线程拥有单独的一份内存区域。

线程共享区域:被所有线程共享,且只有一份。

这里还有一个直接内存,这个虽然不是运行时数据区的一部分,但是会被频繁使用。你可以理解成没有被虚拟机化的操作系统上的其他内存(比如操作系统上有8G内存,被JVM虚拟化了3G,那么还剩余5G, JVM是借助一些工具使用这5G内存的,这个内存部分称之为直接内存)

在这里插入图片描述

JAVA方法的运行与虚拟机栈

虚拟机栈是用来存放线程运行java方法所需的数据,指令、返回地址。

在这里插入图片描述

这段代码很简单,就是起一个main方法,在main方法运行中调用A方法,A方法中调用B方法,B方法中运行C方法。

我们把代码跑起来,线程1来运行这段代码, 线程1跑起来,就会有一个对应 的虚拟机栈,同时在执行每个方法的时候都会打包成一个栈帧。

比如main开始运行,打包一个栈帧送入到虚拟机栈。

在这里插入图片描述

C方法运行完了,C方法出栈,接着B方法运行完了,B方法出栈、接着A方法运行完了,A方法出栈,最后main方法运行完了,main方法这个栈帧就出栈了。

这个就是Java方法运行对虚拟机栈的一个影响。虚拟机栈就是用来存储线程运行方法中的数据的。而每一个方法对应一个栈帧。

虚拟机栈

栈的数据结构:先进后出(FILO)的数据结构,

虚拟机栈的作用:在JVM运行过程中存储当前线程运行方法所需的数据,指令、返回地址。

虚拟机栈是基于线程的:哪怕你只有一个 main() 方法,也是以线程的方式运行的。在线程的生命周期中,参与计算的数据会频繁地入栈和出栈,栈的生命周期是和线程一样的。

栈帧:在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦方法完成相应的调用,则出栈。

栈帧大体都包含四个区域:(局部变量表、操作数栈、动态连接、返回地址)
1、局部变量表:

顾名思义就是局部变量的表,用于存放我们的局部变量的(方法中的变量)。首先它是一个32位的长度,主要存放我们的Java的八大基础数据类型,一般32位就可以存放下,如果是64位的就使用高低位占用两个也可以存放下,如果是局部的一些对象,比如我们的Object对象,我们只需要存放它的一个引用地址即可。

2、操作数据栈:
存放java方法执行的操作数的,它就是一个栈,先进后出的栈结构,操作数栈,就是用来操作的,操作的的元素可以是任意的java数据类型,所以我们知道一个方法刚刚开始的时候,这个方法的操作数栈就是空的。

操作数栈本质上是JVM执行引擎的一个工作区,也就是方法在执行,才会对操作数栈进行操作,如果代码不不执行,操作数栈其实就是空的。

3、动态连接:
Java语言特性多态。

4、返回地址:
正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)

同时,虚拟机栈这个内存也不是无限大,它有大小限制,默认情况下是1M。
如果我们不断的往虚拟机栈中入栈帧,但是就是不出栈的话,那么这个虚拟机栈就会爆掉。

程序计数器

较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响。

程序计数器是一块很小的内存空间,主要用来记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。

由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会根据时间片轮询争夺 CPU 资源。如果一个线程的时间片用完了,或者是其它原因导致这个线程的 CPU 资源被提前抢夺,那么这个退出的线程就需要单独的一个程序计数器,来记录下一条运行的指令。

因为JVM是虚拟机,内部有完整的指令与执行的一套流程,所以在运行Java方法的时候需要使用程序计数器(记录字节码执行的地址或行号),如果是遇到本地方法(native方法),这个方法不是JVM来具体执行,所以程序计数器不需要记录了,这个是因为在操作系统层面也有一个程序计数器,这个会记录本地代码的执行的地址,所以在执行native方法时,JVM中程序计数器的值为空(Undefined)。
另外程序计数器也是JVM中唯一不会OOM(OutOfMemory)的内存区域。

栈帧执行对内存区域的影响

在这里插入图片描述
在JVM中,基于解释执行的这种方式是基于栈的引擎,这个说的栈,就是操作数栈。

虚拟机栈:

每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。

栈的大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k

在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的Code属性之中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。

局部变量表:

顾名思义就是局部变量的表,用于存放我们的局部变量的。首先它是一个32位的长度,主要存放我们的Java的八大基础数据类型,一般32位就可以存放下,如果是64位的就使用高低位占用两个也可以存放下,如果是局部的一些对象,比如我们的Object对象,我们只需要存放它的一个引用地址即可。(基本数据类型、对象引用、returnAddress类型)

操作数据栈:

存放我们方法执行的操作数的,它就是一个栈,先进后出的栈结构,操作数栈,就是用来操作的,操作的的元素可以是任意的java数据类型,所以我们知道一个方法刚刚开始的时候,这个方法的操作数栈就是空的,操作数栈运行方法是会一直运行入栈/出栈的操作

动态连接:

Java语言特性多态(需要类加载、运行时才能确定具体的方法)动态分派

完成出口(返回地址):

正常返回:(调用程序计数器中的地址作为返回)

恢复上层方法的局部变量表和操作数栈、
把返回值(如果有的话)压入调用者栈帧的操作数栈中、
调整程序计数器的值以指向方法调用指令后面的一条指令

异常的话:(通过异常处理表<非栈帧中的>来确定)

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

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

相关文章

前端Vue自定义精美tabs,可设置下划线图标 热门标题

前端Vue自定义精美tabs&#xff0c;可设置下划线图标 热门标题&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13186 效果图如下&#xff1a; # cc-beautyTabs #### 使用方法 使用方法 <!-- tabchange: tab选择事…

为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言AI的崛起与编程语言…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

轻松复制:Elasticsearch 中跨集群复制指南

跨集群的数据复制是一个复杂且耗时的过程。 公司必须使用外部工具或编写自定义脚本将数据从一个集群移动到另一个集群。 Elasticsearch 以其跨集群复制功能来救援。 跨集群复制 (CCR) 是 Elasticsearch 中的一项内置功能&#xff0c;允许近乎实时地将数据从一个集群复制到另一…

C语言预处理命令

文章目录 1 什么是预处理命令2 预处理指令实例3 C语言宏定义4 C语言预处理命令总结参考 1 什么是预处理命令 这些在编译之前对源文件进行简单加工的过程&#xff0c;就称为预处理&#xff08;即预先处理、提前处理&#xff09;。预处理主要是处理以#开头的命令&#xff0c;例如…

【c语言】-- 操作符汇总(万字详解)

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习操作符。 让我们开启c语言学习之…

【正点原子STM32连载】第四十章 红外遥控实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

管理类联考——逻辑——知识篇——形式逻辑——二、性质模态——haimian

性质 考点分析 定义分类 思维导图 模态 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量112 定义分类 断定事物发生可能性的命题就是模态命题。 按照可能性的高低&#xff0c;我们可以将模态命题分为如下几类&#xff1a; ①必然发…

Android12 设置系统默认不休眠-迅为RK3588开发板

修改文件&#xff1a; device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults. xml 文件&#xff0c;如下图所示&#xff1a; - 60000 0x7fffffff 更多详情 公众Hao/B站&#xff1a;迅为电子

MFC第九天 CRect类的封装和窗口坐标系转换及获取窗口ID 以及对CTime类与COleDateTime类简介

文章目录 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介CRect类的封装窗口坐标系转换及获取窗口IDCTime类与COleDateTime类简介关于设置日期控件上的时间问题 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介 CRect类的…

300黑客共闯沙盒|赛宁数字化靶场助力第十六届全国大学生信息安全竞赛

6月24日&#xff0c;由中央网信办网络安全协调局指导、教育部高等学校网络空间安全专业教学指导委员会主办、福州大学承办的第十六届全国大学生信息安全竞赛—创新实践能力赛华东南分区选拔赛&#xff08;简称“分区赛”&#xff09;圆满结束。赛宁网安基于数字化靶场打造的“赛…

3、数仓之采集工具MaxWell(MaxWell简介、MaxWell原理、MaxWell部署、MaxWell使用)

1、Maxw简介 1.1 MaxWell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数…

100页干货!一文看懂10+行业领域发展趋势

导读&#xff1a; 当前全球经济环境及疫情的变化&#xff0c;使得中国各行业的发展呈现向好趋势&#xff0c;但市场仍充满诸多不确定性。 在今年伊始&#xff0c;罗兰贝格重磅发布了《“预见2023”中国行业趋势报告》&#xff08;文中简称《报告》&#xff09;&#xff0c;囊…

学生台灯怎么选对眼睛好的?看完再买不踩坑!

我们都知道&#xff0c;对眼睛最好的光就是自然的太阳光&#xff0c;但并不是每时每刻都能享受到太阳光般的光源&#xff0c;所以现在有很多台灯的出现&#xff0c;而护眼台灯是对眼睛最好的&#xff0c;不过护眼台灯的挑选也有一些需要注意的细节&#xff01; 1、全光谱&#…

Lancet Microbe -- 新冠轻症者可能是“超级传播者”

一项对有意感染SARS-CoV-2的人群的研究提供了关于病毒传播的丰富见解&#xff0c;比如&#xff0c;某些特定人群是“超级传播者”&#xff0c;他们向空气中释放的病毒远比其他人多。 该论文描述了一项具有争议的“挑战性研究”的数据&#xff0c;在这项研究中&#xff0c;科学家…

Sangfor华东天勇战队:AspectJWeaver反序列化利用链

依赖&#xff1a; <dependencies><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency> </dependencies>测试类&#xff1a; import java…

基于Matlab实现SVM算法的手写字体识别(附上完整仿真源码+数据 )

手写字体识别是一个重要的人工智能应用领域。在本文中&#xff0c;我们将展示如何使用MATLAB实现手写数字的识别。 首先&#xff0c;我们需要准备一个手写数字数据集。在本文中&#xff0c;我们将使用MNIST数据集&#xff0c;这是一个广泛使用的手写数字数据集&#xff0c;包含…

界面组件DevExpress WinForm v23.1新版亮点 - 皮肤矢量图标全新升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

【机器学习】正则化对过拟合和欠拟合的影响

模型过拟合和欠拟合的图像特征 偏差大表示欠拟合&#xff0c;而方差大表示过拟合&#xff0c;我们这一节再深入探讨下过拟合和欠拟合问题。一个经典的图如下&#xff1a; 其中d1为欠拟合&#xff0c;d4为过拟合&#xff0c;而d2则刚刚好。回顾下刚刚说的使用训练集和交叉验证…

JavaScript知识点DOM 模型详细讲解

DOM 模型 DOM 全称是 Document Object Model 文档对象模型 大白话&#xff0c;就是把文档中的标签&#xff0c;属性&#xff0c;文本&#xff0c;转换成为对象来管理。 Document 对象 Document对象的理解&#xff1a; ​ 第一点&#xff1a;Document 它管理了所有的 HTML 文…