4.运行时数据区

目录

  • 概述
  • 虚拟机栈
    • 栈帧
    • 当前栈帧
    • 创建栈帧
    • 栈异常的两种情况
  • 本地方法栈
  • 方法区
    • 方法区存储
    • 永久代和元空间的区别
  • 结束

概述

整个 jvm 构成里,主要由三部分组成:类加载系统、运行时数据区、执行引擎。

在这里插入图片描述

由上图总结如下。
按照线程使用情况和职责分成两大类:

  • 线程独享(程序执行区域)
    • 虚拟机栈、本地方法栈、程序计数器
    • 不需要垃圾回收
  • 线程共享(数据存储区域)
    • 堆和方法区
    • 存储类的静态数据和对象数据
    • 需要垃圾回收

java 堆在 jvm 启动时创建内存区域,去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域。
在这里插入图片描述

内存划分:
核心逻辑就是三大假说,基于程序运行情况进行不断的优化设计。

堆内存为什么会存在新生代和老年代
分代收集理论:当前商业虚拟机的垃圾收集器,大多数都遵循了 分代收集 (Generational Collection) 的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上:

  • 弱分代假说 (Weak Generational Hypothesis) :绝大多数对象都是很快会消亡的
  • 强分代假说 (Strong Generational Hypothesis) : 熬过越多次垃圾收集过程的对象就越难以消亡。

这两个分代假说是几个常用垃圾收集器的一致的设计原则 :收集器应将java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。

这就同时 兼顾了垃圾收集的时间开销和内存的空间有效利用

虚拟机栈

在这里插入图片描述

栈帧

栈帧(Stack Frame) 是用于支持虚拟机进行方法执行的数据结构。

栈帧存储了方法的 局部变量表操作数栈动态连接 和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机里从入栈到出栈的过程。

栈内存为线程私有的空间,每个线程都会创建私有的栈内存,生命周期与线程相同,每个java方法在执行的时候都会创建一个栈帧(Stack Frame) 。栈内存大小决定了方法调用的深度,栈内存过小则会导致方法调用的深度过小,如递归调用的次数较少。

当前栈帧

一个线程中方法的调用链可能会很长,所以会有很栈帧。只有位于jvm虚拟机栈,栈顶的元素才是有效的,即称为当前栈帧,与这个栈帧相关连的方法称为当前方法,定义这个方法的类叫做当前类.

执行引擎运行的所有字节码指令都只针对当前栈帧 进行操作。如果当前方法调用了其方法,或者当前方法执行结束,那这个方法的栈帧就不再是当前栈帧了。

创建栈帧

什么时候创建栈帧?

调用新的方法时,新的栈帧也会随之创建。并且随着程序控制权转移到新方法时,新的栈帧成为了当前栈帧。

栈异常的两种情况

  • 如果线程请求的栈深度大于虚拟机所允许的深度(Xss 默认 1m),会抛出 StackOverflowError异常
  • 如果在创建新的线程时,没有足够的内存去创建对应的虚拟机栈,会抛出OutOfMemoryError导常(不一定能复现)

本地方法栈

本地方法栈虚拟机栈(自己编写的代码是在此运行)相似,区别就是虚拟机栈为虚拟机执行 java 服务(字节码服务),而本地方法栈为虚拟机使用到的 Native 方法(比如 C++) 服务。

简单来说,一个Native Method 就是一个 java 调用非 java 代码的接口。

方法区

方法区(Method Area) 是可供各个线程共享的运行时内存区域,方法区本质上是 java 语言编译后代码存储区域,它存储每一个类的结构信息,如:运行时常量池、成员变量、方法数据、构造方法和普通方法的字节码指令等内容。很多语言都有类似区域。

方法区的具体实现有两种:永久代(PermGen)元空间(Metaspace)

方法区存储

存储了以下数据

Class1Class2
1.类型信息1.类型信息
2.类型的常量池2.类型的常量池
3.字段信息3.字段信息
4.方法信息4.方法信息
5.类变量5.类变量
6.指向类加载器的引用6.指向类加载器的引用
7.指向Class实例的引用7.指向Class实例的引用
8.方法表8.方法表
运行时常量池(所有Class共用,此为 Class1 与 Class2)

总结如下:
主要有如下三种类型。

  • 第一:Class
    • 类型信息,比如Class(idea中定义的类)
    • 方法信息,比如Method(方法名称、方法参数列表、方法返回值信息)
    • 字段信息,比如Field(字段类型、字段名称需要特殊设置才能保存的住)
    • 类变量(静态变量):jdk1.7这后,转移到堆中存储(按jvm规范是在方法区,实现不一定)
    • 方法表(方法调用的时候) 在A类的main方法中去调用B类的method方法时,是根据B类的方法表去查找合适的方法,进行调用。
  • 第二:运行时常量池(字符串常量池):从class中的常量池加载而来,jdk1.7之后,转移到堆中存储
    • 字面量类型
    • 引用类型 --> 内存地址
  • 第三:JIT编译器编译之后的代码缓存

如果需要访问方法区中类的其它信息,都必须先获得Class对象,才能获取该Class对象关联的方法信息或者字段信息。

永久代和元空间的区别

  • jdk1.8之前使用的方法区实现是永久代,jdk1.8及以后使用的方法区实现是元空间
  • 存储位置不同
    • 永久代所使用的内存区域是jvm进程所使用的区域,它的大小受整个jvm的大小所限制。
    • 元空间所使用的内存区域是物理内存区域;那么元空间的使用大小只会受物理内存大小的限制。
  • 存储内容不同
    • 永久代存储的信息基本上就是上面方法区存储内容中的数据。
    • 元空间只存储类的元信息,而静态变量和运行时常量池都挪到堆中

结束

至此,运行时数据区就结束了,如有疑问,欢迎评论区留言。

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

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

相关文章

sqli-labs关卡13(基于post提交的单引号加括号的报错盲注)通关思路

文章目录 前言一、回顾第十二关知识点二、靶场第十三关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,…

学校教的Python根本不够!来看看Python学习路线图

如果只靠学校学的东西去找工作,能找到工作吗? 今天给大家看一个粉丝的真实求职案例,想做Python方面的工作,投了二十几个简历却没人要,心态崩了。为什么没人要?我来告诉你答案。 然后我还会结合我的这些年的…

什么是Vue.js的计算属性(computed properties)?与方法(methods)有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

GetSimple CMS 忘记密码

GetSimple CMS是一个超简单的 CMS,适合建立个人网站等只需要极少数页面的网站。在站长百科上,是这么说的: GetSimple是一款基于XML存储数据的开源内容管理系统,且易于安装和定制,无需MySQL支持。提供撤销保护和备份功能…

有效找回误删照片的 6 种照片数据恢复软件!

照片是珍惜过去珍贵时刻的唯一方式。它们让记忆永存,帮助我们重温生命中最美好的时刻。但是,当这些时刻丢失时会发生什么?您是否曾经因系统崩溃而意外删除或丢失照片?丢失照片可能令人心碎,但仍有希望,因为…

k8s的Init Containers容器实现代码版本升级发布和deployment版本回退:实战操作版

Pod中的初始化容器:Init Containers initContainers实现理论前提:同一个Pod内的容器共享 网络、volume等资源 Init Containers 在Kubernetes中,init容器是在同一个Pod中的其他容器之前启动和执行的容器。它的目的是为Pod上托管的主应用程序执行初始化…

最新支付宝扫码跳转到发红包技术(含效果演示)

需要了解该技术的可以通过联系:https://m.hlcode.cn/?idNK1f1gt

Misc | 相当于签到 第二届“奇安信”杯网络安全技能竞赛

题目描述: 图片似乎经过了什么处理,你能否将其复原呢? 密文: 下载附件,解压得到一张.jpg图片。 解题思路: 1、一张图片,典型的图片隐写。放到Kali中,使用binwalk检测,确…

AI生成PPT工具——Gamma,结合GPT生成不错的效果

AI生成PPT工具——Gamma,结合GPT生成不错的效果 先告诉GPT我现在要参加一个比赛,请他帮忙梳理一下内容。当然整个过程需要不断调整,GPT生成的内容也不是一次就是最好的 不断调整之后让其列出提纲即可,如下: 紧接着我们…

Linux系统进行进程管理,用户管理,文件压缩命令

目录 1.gcc与g区别(补充了解) 2.进程管理命令 3.用户管理命令 4.文件压缩与解压命令 5.常见面试题目 1.gcc与g区别(补充了解) 比如有两个文件:main.c,mainc.cpp(分别用C语言和C语言写的)如果要用gcc编译呢? gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc 指明用c的…

CAD转换器:CAD Exchanger SDK --Crack

转换器 目录 概述读取文件 增量加载写入文件格式特定的详细信息进度状态支持例子 读取和写入多种 CAD 和 BIM 文件格式。 概述 读取(导入)和写入(导出)文件是使用 CAD Exchanger SDK 时的主流场景。支持的格式列表可在此处获取。 …

HTML-fieldset与legend的使用

fieldset 可以对表单组件进行分组 legend 可以对分组进行命名 效果&#xff1a; 源码&#xff1a; <form action""><fieldset><legend>主要信息</legend><!-- 第一种方法:用id的方式绑定账户(文字)和输入框 --><label for"z…

合作共赢 共克时艰

​ 采访人&#xff1a;最近财政部11月6日通报隐性债务问责典型案例&#xff0c;这中间涉及湖北多所重要地市&#xff0c;形成新增隐性债务200多亿&#xff0c;您怎么看这件事&#xff1f; 辜渝傧&#xff1a;是的&#xff0c;无论是数字还是涉及的范围都可以明显感觉到“防范…

④【数据查询】MySQL查询语句,拿来即用。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL查询操作 ④【数据查询】MySQL查询语句&a…

2023.11-9 hive数据仓库,概念,架构,元数据管理模式

目录 0.数据仓库和数据库 数据仓库和数据库的区别 数据仓库基础三层架构 一.HDFS、HBase、Hive的区别 二.大数据相关软件 三. Hive 的优缺点 1&#xff09;优点 2&#xff09;缺点 四. Hive 和数据库比较 1&#xff09;查询语言 2&#xff09;数据更新 3&#xff09;…

SQL 存储过程优化

问题&#xff1a;一个复杂的6个表的left jion 语句&#xff0c;发现设置为定时任务后最高时长为18分钟 1、原因分析&#xff1a;对复杂SQL 进行拆分验证 发现是合同明细表和 产品表的left jion 时间过长&#xff0c;发现 合同明细表每天为3w条&#xff0c;之前做过优化 对每个…

1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

Spring实战系列文章&#xff1a; Spring实战 | Spring AOP核心秘笈之葵花宝典 Spring实战 | Spring IOC不能说的秘密&#xff1f; 国庆中秋特辑系列文章&#xff1a; 国庆中秋特辑&#xff08;八&#xff09;Spring Boot项目如何使用JPA 国庆中秋特辑&#xff08;七&#…

【Recap教程】autodesk recap软件的安装、认识与使用

一、autodesk recap概述 1. recap介绍 Autodesk Recap是一款由Autodesk公司推出的三维扫描软件,它能够转换多种数据源(如点云、激光雷达、照片)为可视的三维模型。该软件的使用使得用户可以更容易地生成高质量、完整的三维模型。Autodesk Recap通常用于建筑、土木工程、汽…

将VS工程转为Qt的pro工程及VS安装Qt插件后没有create basic .pro file菜单问题解决

目录 1. 前言 2. VS工程转为pro工程 3. 没有create basic .pro file菜单 1. 前言 很多小伙伴包括本人&#xff0c;如果是在Windows下开发Qt程序&#xff0c;偏好用Visual Studio外加装个Qt插件进行Qt开发&#xff0c;毕竟Visual Studio确实是功能强大的IDE&#xff0c;但有时…

谷歌黑客(google hacking)

免责声明 由于传播、利用本公众号CSJH网络安全团队所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;公众号CSJH网络安全团队及作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&#xff01;如有侵权烦请告知&#xff0c…