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

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

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

相关文章

Brute Force

Brute Force "Brute Force"(暴力破解)指的是一种通过尝试所有可能的组合来获取访问、解密或破解信息的攻击方法。这种攻击方法通常是基于暴力和不断尝试的,不依赖漏洞或弱点。通常用于破解密码、破坏系统或获取未经授权的访问权限…

【数据结构】链表经典OJ题,常见几类题型(二)

目录 题型三:链表相交,找相交节点思路解析OJ题实例解题代码 题型四:链表带环,找入环节点思路解析OJ实例解题代码 题型三:链表相交,找相交节点 思路解析 看到这类题型首先要判断链表是否相交,而…

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大,我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中,密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案,并提出一些解决方案。 一、密钥安全存…

Redis 常用的类型和 API

前言 在当今的软件开发中,数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求,出现了许多不同类型的数据库。其中,Redis 作为一种基于内存且高性能的键值存储数据库,因其快速的读取速度、丰富的数据结…

进行 “最佳价格查询器” 的开发(多种并行方式的性能比较)

前置条件 public class Shop {private final String name;private final Random random;public Shop(String name) {this.name name;random new Random(name.charAt(0) * name.charAt(1) * name.charAt(2));}public double getPrice(String product) {return calculatePrice…

第4关:非递归实现二叉树左右子树交换

任务描述相关知识 栈的基本操作二叉树后序遍历编程要求测试说明 任务描述 本关任务:给定一棵二叉树,使用非递归的方式实现二叉树左右子树交换,并输出后序遍历结果。 相关知识 为了完成本关任务,你需要掌握:1.栈的基…

PostGIS学习教程一:PostGIS介绍

一、什么是空间数据库 PostGIS是一个空间数据库,Oracle Spatial和SQL Server(2008和之后版本)也是空间数据库。 但是这意味着什么?是什么使普通数据库变成空间数据库? 简短的答案是… 空间数据库像存储和操作数据库中其他任何…

C语言文件操作 | 文件分类、文件打开与关闭、文件的读写、文件状态、文件删除与重命名、文件缓冲区

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

UI 自动化测试框架设计与 PageObject 改造!

在 UI 自动化测试过程中,面对复杂的业务场景,经常会遇到这样的挑战: 简单的录制/回放速度快,但无法适应复杂场景;编写自动化测试脚本比较灵活,但工作量大且可维护性差;以往的封装技术&#xff…

Metric

如果 Metric ‘use_polarity(使用极性)’ ,则图像中的对象必须和模型具有相同的对比度(Contrast)。比如,如果模型是一个在暗/深色背景上的明亮物体,则仅当对象比背景更亮时才会被找到。 如果 …

塑料质量检测是确保产品制造和装配过程的关键环节

激光塑料透光率检测是一种有效的塑料材料特性检测方法。在激光束通过上层透明材料后,被下层材料吸收。上层材料可以是透明的或者是有颜色的,但是必须能够保证有足够的激光通过。 塑料质量检测是确保产品制造和装配过程的关键环节。通过激光塑料透光率检测…

微博开启下一战:降本增效守利润,垂直内容拓营收

微博的商业想象空间正在逐步打开。 近日,微博披露了2023年三季度财报,营收4.422亿美元,同比下跌3%;调整后净利润1.366亿美元,同比增长17%。但若剔除汇率因素影响,微博的整体业绩仍然保持在正向增长轨道。 …

软考网络工程师知识点总结(二)

目录 21、海明码--差错控制 22、CRC循环冗余校验码 23、网络时延的计算 24、根据距离选择传输介质 25、多模光纤和单模光纤的区别 26、CSMA/CD协议 27、以太网帧结构 28、以太网类型及传输介质的选择 29、交换式以太网(交换机) 30、VLAN虚拟局…

【Python基础】网络编程之Epoll使用一(符实操:基于epoll实现的实时聊天室)

🌈欢迎来到Python专栏 🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生 🌏IP坐标:湖北武汉 🍉 目前技术栈:C/C、Linux系统编程、计算机网络、数据结构、Mys…

wpf devexpress设置行和编辑器

如下教程示范如何计算行布局,特定的表格单元编辑器,和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源,如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…

1688商品采集api接口1688代购商品采集API商品详情数据获取

做小程序商城时,最崩溃的瞬间是什么? 一定是当你有几百件商品,却要一件一件编辑商品名称、规格、上传图片吧…… 为了帮助商家快速上货开店,特意提供了1688的获取商品详情数据的接口,方便商家一键采集淘宝、天猫、京…

电动自动换刀高速电主轴的技术优势浅析

在制造业中,自动化技术的发展一直是一个重要的话题。其中,电动自动换刀被认为是一项高效、智能、先进的技术,在高速电主轴中使用电动自动换刀这一技术,不仅能够缩短换刀时间,还能减少换刀失误,本文将探讨Sy…

Leetcode-110 平衡二叉树

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

“探寻服务器的无限潜能:从创意项目到在线社区,你会做什么?”

文章目录 每日一句正能量前言什么是服务器?服务器能做什么?服务器怎么用?部署创意项目,还是在线社区亦或做其他的?后记 每日一句正能量 未知的下一秒,千万不要轻言放弃。 前言 在数字化时代,服…

ctf之流量分析学习

链接:https://pan.baidu.com/s/1e3ZcfioIOmebbUs-xGRnUA?pwd9jmc 提取码:9jmc 前几道比较简单,是经常见、常考到的类型 1.pcap——zip里 流量分析里有压缩包 查字符串或者正则表达式,在包的最底层找到flag的相关内容 我们追踪…