【JVM】JVM 内存结构

news2024/11/17 1:42:14

程序计数器

Cpu 要不停的切换执行线程,所以在切换回同一个线程的时候要知道程序执行到哪了,程序计数器(PC 计数器),用来存储指向下一条指令的地址,也就是将要执行的代码。
程序的分支、循环、跳转、异常处理、线程恢复都需要程序计数器。
程序计数器是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域

虚拟机栈

概述

每个线程在创建的时候都会创建一个虚拟机栈,虚拟机栈里存储的是一个个栈帧,对应着一次次的 Java 方法调用,是线程私有的,生命周期与线程一致。
虚拟机栈对栈帧的操作只有压栈和出栈两个操作,在一个活动线程中,只有正在执行的方法的栈帧是有效的,这个栈帧被称作当前栈帧,与当前栈帧对应的方法叫做当前方法,当前方法所对应的类叫做当前类。

栈帧的结构

栈帧主要由四部分组成:

  • 局部变量表:存储方法的参数和定义在方法中的局部变量
  • 操作数栈:在字节码执行的过程中,向操作数栈中写入和写出数据,主要用于保存计算的中间结果,同时作为程序执行过程中,变量的临时存储
  • 动态链接:每一个栈帧中都包含一个指向运行时常量池中这个栈帧所属方法的引用
    在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
  • 方法返回地址

本地方法栈

本地方法栈类似于虚拟机栈,栈帧对应的方法为本地方法,native 修饰的方法,一般为 C语言编写的

内存划分

Java 堆是 Java 管理的最大一块内存,被所有线程共享。堆内存的唯一目的就是存放对象实例,几乎所有的对象实例的内存都是在这里被分配的。
Java 堆被分成两个代,新生代和老年代,新生代又被分为 eden 区和 survivor 区(from 和 to),分代的唯一目的就是使垃圾回收更有效。

  • 新生代:新对象和没有到达一定年龄的对象都在年轻代
  • 老年代:被长时间使用的对象,老年代的空间要比新生代大很多

年轻代

年轻代是几乎所有新对象创建的地方,年轻代被分为两个区域,eden 区和 survivor 区,suvivor 区又被分成两个部分,from 和 to,比例是 8:1:1,当年轻代内存满了之后会发生 GC,这种 GC 被称为 Minor GC

  • 几乎所有新创建的对象都会在 eden 区被分配内存
  • 当 eden 区满了会发生第一次 GC,扫描 eden 区将存活的对象都移动至 survivor from 区,清除掉垃圾对象
  • 当 eden 区再次触发 GC 的时候,会扫描 eden 区和 survivor from 区,对这两个区域进行垃圾回收,将存活的对象移动至 survivor to 区,同时将年龄 +1
  • 清空 eden 区和 survivor from 区后,将 from 区和 to 区交换,也就是说谁空谁是 to 区

老年代

老年代存储的对象包括经过许多轮 Minor GC(年龄15) 后仍然存活的对象和大对象

快速分配策略和逃逸分析

TLAB

对 Eden 区进行划分,为每个线程划分一个线程私有的缓存,多线程同时分配的时候,使用 TLAB 可以进行快速分配避免一些多线程的安全问题,这就是快速分配策略

逃逸分析

器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
逃逸分析的基本行为就是分析对象动态作用域:

  • 当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。
  • 当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸。例如作为调用参数传递到其他地方中,称为方法逃逸。

方法区

永久代和元空间

  1. 方法区是 JVM 规范中的定义的一个概念,具体实现各个jvm厂商可能不同,以 HotSpot 为例,在 Java7 中使用永久代来实现方法区,永久代在物理上是与堆空间连续的受JVM垃圾回收的管理;在Java8中,使用了元空间来代替永久代实现方法区,元空间使用的是本地内存也就是堆外内存,不受JVM管理,因此很少出现方法区的内存溢出。
  2. 永久代和元空间存储的内容是不同的,元空间存储的是类的元信息,静态变量和常量池都并入堆中;相当于永久代的内容被划分到了堆(静态变量和常量池)和堆外内存(类的元信息)
    方法区的内部结构
    方法区用于存储已经被虚拟机加载的类型信息、常量、静态变量以及即时编译器编译后的代码缓存。

运行时常量池

  1. 常量池表:
    我们知道常量池是 class 字节码文件的一部分,主要存储的是字面量和符号引用(类和接口的全限定名;变量的名称和描述符;方法的名称和描述符)
    一个 Java 的类、接口编译后会产生一个字节码文件,这个字节码文件通常需要数据的支持,但是这个数据可能会很大,不能存在字节码中,所以就换一个方式存储在常量池表中,然后字节码有指向这个常量池的符号引用。下图中的#2即为符号引用,引用了常量池
    常量池可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。
    在这里插入图片描述
  2. 运行时常量池:
  • 在类加载到虚拟机之后会创建对应的运行时常量池
  • 常量池表是 Class 字节码文件中的一部分,用于存储编译时期生成的各种字面量和符号引用,这一部分在类加载后会被存储到方法区的运行时常量池中
  • 运行时常量池中包含了各种不同的的常量,既包括在编译期间就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或字段引用。此时不再是常量池中的符号地址了,这里换为真实地址
  • 运行时常量池,相对于 Class 文件常量池的另一个重要特征是:动态性,Java 语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中,String 类的 intern() 方法就是这样的

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

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

相关文章

Android12 MultiMedia框架之MediaExtractorService

上节学到setDataSource()时会创建各种Source,source用来读取音视频源文件,读取到之后需要demux出音、视频、字幕数据流,然后再送去解码。那么负责进行demux功能的media extractor模块是在什么时候阶段创建的?这里暂时不考虑APP创建…

6 月份获得了 10000 星的开源项目!

01 开源学习资源的宝库 在这个信息爆炸的时代,想要深入学习一项技术,却常常被海量资源淹没。别担心,Build Your Own X 项目来帮你! 这是一个集合了各种技术主题的开源学习资源库,旨在引导开发者通过实践来掌握核心概念…

提升入住率|智慧酒店解决方案,打造有温度的居住体验!

近年来,智慧酒店被越来越多的人关注,由生物识别、物联网技术和互联网技术融合产生的智慧酒店解决方案,不仅可以提升顾客在酒店的入住体验,还可以帮助酒店降低运营成本,这也让越来越的酒店选择了智慧酒店的赛道&#xf…

【windows|012】光猫、路由器、交换机详解

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 ​ 🏅阿里云ACE认证高级工程师 ​ 🏅阿里云开发者社区专家博主 💊交流社…

CV每日论文--2024.6.28

1、On Scaling Up 3D Gaussian Splatting Training 中文标题:扩展 3D 高斯泼溅训练 简介:3D高斯点描(3DGS)由于其卓越的视觉质量和渲染速度,越来越受欢迎用于3D重建。然而,3DGS的训练目前仅在单个GPU上进行,由于内存限制,它的处理高分辨率和大规模3D重建…

基于C语言+控制台的学生信息管理系统

博主介绍: 大家好,本人精通Java、Python、Php、C#、C、C编程语言,同时也熟练掌握微信小程序和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Python:Python环境搭建

二、Python环境搭建 1.Python安装指南 (1)打开文件夹双击python-3.8.5-amd64.exe,进入安装页面,选择自定义安装,并且勾选环境变量。 (2)自定义安装时,跳出窗口,所有功能…

大力出奇迹:大语言模型的崛起与挑战

随着人工智能(AI)技术的迅猛发展,特别是在自然语言处理(NLP)领域,大语言模型(LLM)的出现与应用,彻底改变了我们与机器互动的方式。本文将探讨ChatGPT等大语言模型的定义、…

IPIDEA代理IP助力高效数据采集

IPIDEA代理IP助力高效数据采集 文章目录 IPIDEA代理IP助力高效数据采集📑前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 选择代理IP的关键因素 三、IPIDEA海外IP代理的优势3.1 IPIDEA的显著优势3.2 IPIDEA的代理类型及应用 四、IPIDEA爬虫实战4…

复分析——第10章——Θ函数应用(E.M. Stein R. Shakarchi)

第10章 Θ函数的应用 (Applications of Theta Functions) The problem of the representation of an integer n as the sum of a given number k of integral squares is one of the most celebrated in the theory of numbers. Its history may be traced back to Diopha…

JS逆向技巧总结

总的来说,JavaScript 逆向可以分为三大部分:寻找入口、调试分析和模拟执行。下面分别进行介绍。 一,寻找入口 一个网站加载了很多 JavaScript 文件,那么怎么从这么多 JavaScript 里面找到关键的位置,那就是一个关键问…

Outlook发送大文件的问题是什么?怎么解决?

Outlook不仅是一款电子邮件客户端,还包括日历、任务、笔记、联系人等功能,同时与Microsoft Office套件中的其他应用程序(如Word、Excel、PowerPoint等)集成紧密,方便用户在不同应用程序之间切换,提高工作效…

计算机毕业设计Python+Spark股票基金推荐与预测系统 股票基金可视化 股票基金推荐系统 股票基金可视化系统 股票基金数据分析 股票基金爬虫大数据

目 录 摘 要 Abstract 第1章 前 言 1.1 项目的背景和意义 1.2 研究现状 1.3 项目的目标和范围 1.4 论文结构简介 第2章 技术与原理 2.1 开发原理 2.2 开发工具 2.3 关键技术 第3章 需求建模 3.1 系统可行性分析 3.2 功能需求分析 3.3 非功能性…

Kafka-服务端-副本同步-源码流程

杂 在0.9.0.0之前,Kafka提供了replica lag.max.messages 来控制follower副本最多落后leader副本的消息数量,follower 相对于leader 落后当超过这个数量的时候就判定该follower是失效的,就会踢出ISR,这里的指的是具体的LEO值。 对…

为Stable Diffusion换件新衣服

你是不是已经看腻Stable Diffusion默认的webui了,想要换件新衣服。Lobe Theme这个插件就可以帮助你。 首先,我们启动 SD,如果没有安装,可以参考https://mp.csdn.net/mp_blog/creation/editor/139196688。 然后找到扩展选项卡&…

网络安全--计算机网络安全概述

文章目录 网络信息系统安全的目标网络安全的分支举例P2DR模型信息安全模型访问控制的分类多级安全模型 网络信息系统安全的目标 保密性 保证用户信息的保密性,对于非公开的信息,用户无法访问并且无法进行非授权访问,举例子就是:防…

鸿蒙OS开发者高级学习第2课:自由流转(含习题答案)

自由流转两种形态:相继使用(跨端迁移);同时使用( 多端协同) 习题:

linux 用户、用户组操作

一、用户组操作 用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用…

8种数据迁移工具

前言 最近有些小伙伴问我,ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业应用来说,我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

Ubuntu 22.04 安装中文字体

笔者在用OpenCV4.9处理图片加水印时,中文乱码。原来是Ubuntu 22.04发行版缺少中文字体支持,因此,笔者就找资料安装了需要的中文字体,特此记录,以备后查。 1、打开终端: 2、更新软件包列表: su…