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.rhkb.cn/news/191135.html

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

相关文章

前端案例-css实现ul中对li进行换行

场景描述: 我想要实现,在展示的item个数少于4个的时候,则排成一行,并且均分(比如说有3个,则每个的宽度为33.3%),如果item 个数大于4,则进行换行。 效果如下&#xff1a…

网络运维Day14

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

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上,属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery,这位前端开发的巫师,通过简洁而强大的语法,为我们提供了便捷的属性操作工具。在这篇博客中,我们将深入研究JQuery DOM操作中的属性操作&…

Android Rxjava架构原理与使用的详解解答

简单介绍 Rxjava这个名字,其中java代表java语言,而Rx是什么意思呢?Rx是Reactive Extensions的简写,翻译过来就是,响应式拓展。所以Rxjava的名字的含义就是,对java语言的拓展,让其可以实现对数据…

【论文精读】Pose-Free Neural Radiance Fields via Implicit Pose Regularization

今天读的是一篇发表在ICCV 2023上的文章,作者来自NTU。 文章地址:点击前往 文章目录 Abstract1 Intro2 Related Work3 Preliminary4 Proposed Method4.1 Overall Framework4.2 Scene Codebook Construction4.3 Pose-Guided View Reconstruction4.4 Train…

HTML设置标签栏的图标

添加此图标最简单的方法无需修改内容,只需按以下步骤操作即可: 1.准备一个 ico 格式的图标 2.将该图标命名为 favicon.ico 3.将图标文件置于index.html同级目录即可 为什么我的没有变化? 答曰:ShiftF5强制刷新一下网页就行了

Python实现WOA智能鲸鱼优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

ELK之Logstash解析时间相差8h的问题

一、问题描述 服务器当前时间为:2022年 06月 28日 星期二 11:24:22 CST 而logstash解析的时间为2022-06-28T03:15:25.545Z与实际时间相差8h 一、解决办法: 需改logstash的配置文件: 原理就是:定义一个中间变量timestamp&…

Linux系统编程——标准c库对文件操作

Linux、标准c库对文件操作的区别 1.来源 从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别: open是UNIX系统调用函数 (包括LINUX等) ,返回的是文件描述符 (File Descriptor),它是文件在文件描述符表里的索引。.f…

postswigger 靶场(CSRF)攻略-- 1.没有防御措施的 CSRF 漏洞

靶场地址: What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy (portswigger.net)https://portswigger.net/web-security/csrf 没有防御措施的 CSRF 漏洞 题目中已告知易受攻击的是电子邮件的更改功能,而目…

搜索引擎项目

认识搜索引擎 1、有一个主页、有搜索框。在搜索框中输入的内容 称为“查询词” 2、还有搜索结果页,包含了若干条搜索结果 3、针对每一个搜索结果,都会包含查询词或者查询词的一部分或者和查询词具有一定的相关性 4、每个搜索结果包含好几个部分&…

数据库恢复技术

事务 含义:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位 地位:恢复和控制并发的基本单位 区分事务和程序,一个程序中包含多个事务 定义事务 事务的开始与结束…

景联文科技加入中国人工智能产业发展联盟(AIIA),与行业各方共促AI产业发展

近日,景联文科技加入中国人工智能产业发展联盟(AIIA),与行业各方共同挖掘人工智能数据的更多价值,破解中国人工智能AI数据短缺难题。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部…

PostgreSQL 机器学习插件 MADlib 安装与使用

MADlib 一个可以在数据库上运行的开源机器学习库,支持 PostgreSQL 和 Greenplum 等数据库;并提供了丰富的分析模型,包括回归分析,决策树,随机森林,贝叶斯分类,向量机,风险模型&#…

逐帧动画demo

用这一张图实现一个在跑的猎豹的动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X…

RabbitMq防止消息丢失

RabbitMq防止消息丢失 消息的传递路径出现消息丢失的位置解决 消息的传递路径 消息发送方 --> MQ --> 消息消费方 出现消息丢失的位置 消息发送方: 消息传输过程中丢失MQ: MQ收到消息后,存在内存中,还未被消费就宕机了,导致数据丢失消息消费方: 消息到达消费方后, 服务…

创建maven的 java web项目

创建maven的 java web项目 创建出来的项目样子 再添加java和resources文件夹 一定要如图有文件夹下有图标才代表被IDEA识别&#xff0c;不让是不行的 没有的话在File——ProjectStructure中进行设置

【KCC@南京】KCC南京数字经济-开源行

一场数字经济与开源的视听盛宴&#xff0c;即将于11月26日&#xff0c;在南京举办。本次参与活动的有&#xff1a; 庄表伟&#xff08;开源社理事执行长、天工开物开源基金会执行副秘书长&#xff09;、林旅强Richard&#xff08;开源社联合创始人、前华为开源专家&#xff09;…

Linux SSH免密登录

目录 简介 创建Linux用户和用户组 配置LINUX静态IP 编辑IP映射 SSH免密登录配置 登录测试 简介 SSH&#xff08;Secure shell&#xff09;是可以在应用程序中提供安全通信的一个协议&#xff0c;通过SSH可以安全地进行网络数据传输&#xff0c;它的主要原理是利用非对称加密…

Web后端开发_01

Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet&#xff0c;DispatcherServlet实现了servlet中规范的接口 请求响应&#xff1a; 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletRe…