JVM如何运行,揭秘Java虚拟机运行时数据区

目录

一、概述

二、程序计数器

三、虚拟机栈

四、本地方法栈

五、本地方法接口

六、堆

(一)概述

(二)堆空间细分

七、方法区


一、概述

不同的JVM对于内存的划分方式和管理机制存在部分差异,后续针对HotSpot虚拟机进行介绍

JVM结构图如下,此次我们学习的是Java虚拟机运行时数据区

在运行时数据区中,总的来说分为五个部分。程序计数器,本地方法栈和虚拟机栈是线程私有的方法区和堆内存是线程共享的

二、程序计数器

程序计数器是运行时数据区中唯一不会出现OOM的区域,没有垃圾回收。它是当前线程所执行的字节码的行号指示器

其作用是当一个线程发生上下文切换后,回到原本的工作能恢复到正确的位置。每个线程有一个独立的程序计数器,线程之间互不影响。

如果线程执行的Java方法,则计数器记录正在执行的虚拟机字节码的指令的地址

如果正在执行的本地方法,这个计数器值则应为空。(undefined)

三、虚拟机栈

Java虚拟机栈,早期也叫Java栈,每个线程创建时都会创建一个虚拟机栈,内部保存一个个栈帧,对应着一次次的Java方法调用

  1. 每个线程都有自己的栈,栈中的数据以栈帧格式存储
  2. 线程上正在执行的每个方法都各自对应一个栈帧
  3. 栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各个数据信息
  4. 先进后出,后进先出
  5. 一条活动的线程中,一个时间点上,只会有一个活动的栈帧。只有当前正在执行的方法的栈顶栈帧是有效的,这个称为当前栈帧,对应方法是当前方法,对应类是当前类
  6. 执行引擎运行的所有字节码指令只针对当前栈帧进行操作
  7. 如果方法中调用了其他方法,对应的新的栈帧会被创建出来,放在顶端,成为新的当前帧

由于篇幅太多,单独写了一篇博文,链接如下:

JVM运行时数据区-虚拟机栈-CSDN博客文章浏览阅读2k次,点赞62次,收藏58次。学习JVM运行时数据区中的虚拟机栈,栈只要是用来存放栈帧,而栈帧又包括局部变量表,操作数栈,动态链接,方法返回地址等信息。https://blog.csdn.net/m0_62946761/article/details/133854569?spm=1001.2014.3001.5502

四、本地方法栈

Java虚拟机栈管理Java方法的调用,而本地方法栈用于管理本地方法(native方法)的调用

本地方法栈,也是线程私有的。它允许被实现成固定或者是可动态扩展的内存大小。其内存溢出情况和Java虚拟机栈相同

具体做法是 在本地方法栈 中登记native方法,在执行引擎执行时加载到本地方法库

当某个线程调用一个本地方法时,就会进入一个全新,不受虚拟机限制的世界,它和虚拟机拥有同样的权限。

并不是所有的JVM都支持本地方法,因为Java虚拟机规范并没有明确要求本地方法栈的使用语言,具体实现方式,数据结构等。在Hotspot JVM中,直接将本地方法栈和虚拟机栈合二为一。

五、本地方法接口

什么是本地方法?

简单讲,就是一个Java调用非Java代码的接口

为什么使用native method?

早期Java刚出现的时候弱小孤独又无助,而当时盛行的是c/c++,因此一个原因是java也想搞一些方法来和他们有接触,另一个是当时c/c++确实快,可以提高Java效率。综上,与Java环境外交互

  • 例如与操作系统底层或硬件交换信息时的情况
  • 例如启动一个线程

六、堆

(一)概述

1、一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域

2、Java堆区在JVM启动的时候即被创建,其空间大小也就确认了。堆内存的大小是可调节的(可以通过参数调节堆的最大内存和初始内存等)

3、Java虚拟机规范规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的(这里涉及虚拟内存的概念)。

4、所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(TLAB)

5、“几乎”所有的对象实例都在堆上分配内存(为什么是“几乎”,后面会讲到逃逸分析)

6、数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,引用指向对象或者数组在堆中的位置(为什么是“可能”,逃逸分析可能直接在栈上为对象分配空间,而不用在堆上开辟空间了)

7、方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。堆是GC执行垃圾回收的重点区域

(二)堆空间细分

Java7及之前内存逻辑上分为:

  • 新生区
    • Eden区
    • Survivor区
      • from
      • to
        • 谁空谁是to
  • 养老区
  • 永久区

Java8及之后内存逻辑上分为:

  • 新生区
    • Eden区
    • Survivor区
      • from
      • to
        • 谁空谁是to
  • 养老区
  • 元空间

不同书籍叫法不一样,看到这些名词知道是同个意思就可以了

  • 新生区==新生代==年轻代
  • 养老区==老年区==老年代
  • 永久区==永久代

由于篇幅太多,单独写了一篇博文,链接如下:

JVM运行时数据区-堆-CSDN博客文章浏览阅读1.1k次,点赞71次,收藏66次。学习Java运行时数据区中的堆内存,包括堆空间分代思想,内存分配策略,以及逃逸分析等。https://blog.csdn.net/m0_62946761/article/details/133881117?spm=1001.2014.3001.5502

七、方法区

方法区是线程共享的,其只是一种规范,在jdk1.7之前为永久代。jdk1.8之后去除永久代,改为元空间。

1、Java虚拟机规范中明确说明:尽管所有的方法区在逻辑上是属于堆的一部分,但是一些简单的实现,可能不会选择去进行垃圾收集或者进行压缩。对于HotSpot而言,方法区还有一个别名叫Non-Heap(非堆),目的就是要和堆分开。所以方法区看作是一块独立于Java堆的内存空间

2、方法区和Java堆一样,是各个线程共享的内存区域

3、方法区在JVM启动的时候被创建,并且它的实际的物理内存空间和Java堆区一样,都是可以不连续的。方法区的大小和堆空间一样,可以选择固定大小或者可扩展

4、方法区的大小决定了系统可以保存多少个类,如果定义太多类,加载大量的第三方的Jar包,Tomcat部署过多工程,导致方法区溢出,虚拟机同样会抛出内存溢出OOM:PermGen space或者Metaspace 

5、关闭JVM就会释放这个区域的内存

由于篇幅太多,单独写了一篇博文,链接如下:

探究Java虚拟机运行时数据区,了解方法区的奥秘-CSDN博客文章浏览阅读574次,点赞66次,收藏58次。介绍JVM运行时数据区中方法区的在hotspot中的演进和内部结构https://blog.csdn.net/m0_62946761/article/details/133901736?spm=1001.2014.3001.5502

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

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

相关文章

CSS特效007:绘制3D文字,类似PS效果

总第 007 篇文章, 查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花…

2023年数维杯国际大学生数学建模挑战赛A题

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在数维杯前为大家提供了许多资料的内容呀&#xff0…

贪吃蛇和俄罗斯方块

贪吃蛇 一、创建新项目 创建一个新的项目,并命名。 创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类, 创建一个com.xxx.controller的包用来存放启动的入口类(控制类) …

重复性工作自动化解决方案——影刀

以前,影刀是一个邂逅的初见小工具,新奇在里头,踌躇在外头; 现在,影刀是一个稳定的职场贾维斯,高效在里头,悠闲在外头; 以后,影刀是一个潜力的知己老司机,有序…

2019年五一杯数学建模A题让标枪飞解题全过程文档及程序

2020年五一杯数学建模 A题 让标枪飞 原题再现 标枪的投掷是一项历史悠久的田径比赛项目。标枪投掷距离的远近受到运动员水平(出手速度、出手角、初始攻角、出手高度、出手时标枪的初始俯仰角速度等),标枪的技术参数(标枪的长度、…

网络运维Day14

监控概述 监控的目的 报告系统运行状况每一部分必须同时监控内容包括吞吐量、反应时间、使用率等提前发现问题进行服务器性能调整前,知道调整什么找出系统的瓶颈在什么地方 监控的资源类别 公开数据 Web、FTP、SSH、数据库等应用服务TCP或UDP端口 私有数据 CPU、内…

互联网Java工程师面试题·微服务篇·第三弹

目录 34、什么是端到端微服务测试? 35、Container 在微服务中的用途是什么? 36、什么是微服务架构中的 DRY? 37、什么是消费者驱动的合同(CDC)? 38、Web,RESTful API 在微服务中的作用是什…

Mysql-库的操作

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] name name后可以加 CHARACTER SET 或者是 charsetname COLLATE collation_name (mysql数据库不区分大小写) 说明: name表示想创建的库的名字大写的表示关键字 [] 是可选项 CHARACTER SET…

python3+requests+unittest实战系列【二】

前言:上篇文章python3requestsunittest:接口自动化测试(一)已经介绍了基于unittest框架的实现接口自动化,但是也存在一些问题,比如最明显的测试数据和业务没有区分开,接口用例不便于管理等&…

CSS特效009:音频波纹加载律动

总第 009 篇文章, 查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花…

Python高级语法----Python C扩展与性能优化

文章目录 1. 编写Python C扩展模块示例代码编译和运行运行结果2. 利用Cython优化性能示例代码编译和运行运行结果3. Python性能分析工具示例代码分析结果1. 编写Python C扩展模块 Python C扩展模块允许你将C语言代码集成到Python程序中,以提高性能。这对于计算密集型任务特别…

物联网AI MicroPython学习之语法 bluetooth蓝牙

学物联网,来万物简单IoT物联网!! bluetooth 介绍 该模块为板上的蓝牙控制器提供了相关接口。目前支持低功耗蓝牙 (BLE)的Central(中央), Peripheral(外设), Broadcaster(广播者&…

计算机视觉(CV)技术的优势和挑战

计算机视觉技术在很多领域具有很大的优势,例如: 自动化:计算机视觉技术可以帮助实现自动化生产和检测,省去了人力成本和时间成本。 准确性:计算机视觉技术可以提高生产和检测的准确性,降低了人工操作产生的误差。 速度:计算机视觉技术可以实现高速速度的生产和检测,提高…

深度学习 机器视觉 人脸识别系统 - opencv python 计算机竞赛

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目…

从头开始的卷积神经网络

VGG-16 卷积神经网络。来源:LearnOpenCV 参考资料:这篇文章可以在 Kaggle Notebook 🧠 Convolutional Neural Network From Scratch上更好地阅读。路易斯费尔南多托雷斯 一、说明 本文详细介绍在tf2.0上,使用ceras实现基本的神经…

C++字典树算法:找出强数对的最大异或值 II

涉及知识点 数学 字典树 题目 给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件&#xff0c;则称其为 强数对 &#xff1a; |x - y| < min(x, y) 你需要从 nums 中选出两个整数&#xff0c;且满足&#xff1a;这两个整数可以形成一个强数对&…

mysql主从复制-使用心得

文章目录 前言环境配置主库从库 STATEMENTbinloggtidlog-errorDistSQL总结 前言 mysql 主从复制使用感受&#xff0c;遇到一些问题的整理&#xff0c;也总结了一些排查问题技巧。 环境 mysql5.7 配置 附&#xff1a;千万级数据快速插入配置可以参考&#xff1a;mysql千万数…

HarmonyOS应用开发者高级认证(88分答案)

看好选择题&#xff0c;每个2分多答对2个刚好88分&#xff0c;祝你顺利。 其它帮扶选择题。 一、判断 只要使用端云一体化的云端资源就需要支付费用&#xff08;错&#xff09;所有使用Component修饰的自定义组件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期…

vue3配置环境变量,小白简单易学

环境变量的意义就是防止我们更新打包的时候写错变量&#xff0c;合并代码这些一系列问题 首先看看效果 左边是本地测试环境&#xff0c;右边是打包后的生产环境&#xff0c;写这个环境变量的好处就是&#xff0c;你在本地开发的时候变量随便改&#xff0c;不会影响生产环境&am…

07【保姆级】-GO语言的程序流程控制【if switch for while 】

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…