JVM 内存结构快速入门

文章目录

    • 一、简介
    • 二、JVM内存区域
      • 2.1 方法区
        • 2.3.2 永久代和元空间
      • 2.2 堆
        • 2.1.2 对象的创建和销毁
      • 2.2 栈内存
        • 2.2.1 栈帧的组成和作用
        • 2.2.2 栈的特点
      • 2.4 程序计数器
        • 2.4.1 程序计数器的作用和使用场景

一、简介

  Java 内存模型(Java Memory Model,JMM)是一种规范,定义了 Java 程序中多线程并发访问共享变量时的行为和规则。

二、JVM内存区域

  线程共享:方法区、堆
  线程独有:栈、程序计数器

在这里插入图片描述

2.1 方法区

  方法区是JVM中的一块内存区域,在JVM启动时被创建,与堆内存分开管理。方法区的大小可以通过-XX:MetaspaceSize-XX:MaxMetaspaceSize参数进行调整。

  存储的内容有:

  • 类的结构信息:包括类的字段、方法、父类、接口等
  • 常量池
  • 静态变量
  • 即时编译器编译后的代码

2.3.2 永久代和元空间

  在Java虚拟机(JVM)的不同版本中,永久代(Permanent Generation)和元空间(Metaspace)是用于存储类相关信息的内存区域,都是实现方法区的方式。

  1. 永久代(Permanent Generation):
    1.8版本以前有永久代,永久代放在JVM内存中,在某些情况下存在一些问题。例如,如果加载的类过多或过大,永久代的大小可能会不够,导致OutOfMemoryError。由于这些问题,从JDK 8开始,永久代被元空间所取代。

  2. 元空间(Metaspace):
    元空间是JDK 8及更高版本中取代永久代的新的内存区域。元空间同样用于存储类的结构信息、常量池、静态变量和即时编译器编译后的代码等。与永久代不同,元空间的大小不再受限于固定的内存大小,而是根据应用程序的需求进行动态分配。元空间的数据存储在本地内存(Native Memory)中,而不是像永久代那样存储在Java运行时内存中。这意味着元空间的大小受限于可用的物理内存。如果元空间的内存耗尽,JVM依然会抛出OutOfMemoryError。
    在这里插入图片描述

2.2 堆

  堆内存是Java程序中最大的一块内存区域,用于存储对象实例和数组。堆内存可以划分为不同的代,包括新生代(Eden区、Survivor区)和老年代。新创建的对象会被分配到新生代的Eden区,经过垃圾回收后,仍然存活的对象会被移到Survivor区,最终进入老年代。

1.8版本的堆结构:
  新生代与老年代的比例是1:2
  Eden、s0、s1的比例是8比1比1
在这里插入图片描述

1.9及以后的堆结构
  G1将内存划分成了多个大小相等的Region(默认是512K),Region逻辑上连续,物理内存地址不连续。同时每个Region被标记成E、S、O、H,分别表示Eden、Survivor、Old、Humongous。其中E、S属于年轻代,O与H属于老年代。

  H表示Humongous。从字面上就可以理解表示大的对象(下面简称H对象)。当分配的对象大于等于Region大小的一半的时候就会被认为是巨型对象。H对象默认分配在老年代,可以防止GC的时候大对象的内存拷贝。
在这里插入图片描述

2.1.2 对象的创建和销毁

  在Java中,对象的创建通过new关键字实现。当调用new关键字创建对象时,JVM会在堆内存中分配一块内存空间用于存储对象的实例变量,并执行构造方法对对象进行初始化。对象的销毁由垃圾回收器负责,当对象不再被引用时,垃圾回收器会回收该对象的内存空间。

  创建流程:

  1. ⾸先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引⽤
  2. 检查这个符号引⽤代表的类是否已被加载、解析和初始化过。如果没有,就先执⾏相应的类加载过程
  3. 类加载检查通过后,接下来虚拟机将为新⽣对象分配内存。
  4. 内存分配完成之后,虚拟机将分配到的内存空间(但不包括对象头)都初始化为零值。
  5. 接下来设置对象头,请求头⾥包含了对象是哪个类的实例、如何才能找到类的元数据信息、对象的 哈希码、对象的 GC 分代年龄等信息
    在这里插入图片描述

2.2 栈内存


  栈分为本地方法栈和java方法栈。
在这里插入图片描述

  每个线程在创建时都会创建一个java方法栈,栈内会保存一个个的栈帧,每个栈帧对应一个方法。
  栈采用先进后出的数据结构,方法的调用和返回都是通过栈帧的入栈和出栈来实现的。
在这里插入图片描述

2.2.1 栈帧的组成和作用

  栈帧是栈内存中的一个元素,用于存储方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。局部变量表用于存储方法的局部变量和参数,操作数栈用于存储方法执行过程中的操作数和中间结果。栈帧的作用是提供方法调用和执行的环境,保证方法的独立性和数据的隔离性。
在这里插入图片描述

2.2.2 栈的特点

  1. 栈是线程私有的
  2. 一个方法开始执行栈帧入栈、方法执行完对应的栈帧就出栈,所以虚拟机栈不需要进行垃圾回收
  3. 虚拟机栈存在OutOfMemoryError、以及StackOverflowError
  4. 线程太多,就可能会出现OutOfMemoryError,线程创建时没有足够的内存去创建虚拟机栈了
  5. 方法调用层次太多,就可能会出现StackOverflowError(栈的大小有限)
  6. 可以通过-Xss来设置虚拟机栈的大小

2.4 程序计数器

2.4.1 程序计数器的作用和使用场景

  程序计数器是一块较小的内存区域,用于存储当前线程执行的字节码指令的地址。程序计数器在多线程环境下,每个线程都有独立的程序计数器,用于记录各个线程执行的位置,保证线程切换后能正确恢复执行。

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

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

相关文章

docker发展历史

docker 一、docker发展历史很久以前2013年2014年2015年2016年2017年2018年2019年及未来 二、 docker概述定义:docker底层运行原理:docker简述核心概念容器特点Docker与虚拟机的区别: 三、容器在内核中支持两种重要技术四、namespace的六项隔离五、虚拟化产品有哪些1…

CTFshow 限时活动 红包挑战7、红包挑战8

CTFshow红包挑战7 写不出来一点&#xff0c;还是等了官方wp之后才复现。 直接给了源码 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd…

《C语言深度解剖》.pdf

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;深入理解C语言 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 C语言深度解剖.pdf 提取码:yunx

收银一体化-亿发2023智慧门店新零售营销策略,实现全渠道运营

伴随着互联网电商行业的兴起&#xff0c;以及用户理念的改变&#xff0c;大量用户从线下涌入线上&#xff0c;传统的线下门店人流量急剧收缩&#xff0c;门店升级几乎成为了每一个零售企业的发展之路。智慧门店新零售收银解决方案是针对传统零售企业面临的诸多挑战和问题&#…

S7-200 Smart 的多种端口及通讯方式

每个S7-200 SMART CPU都提供一个以太网端口和一个RS485端口(端口0)&#xff0c;标准型CPU额外支持SB CM01信号板(端口1)&#xff0c;信号板可通过STEP 7-Micro/WIN SMART软件组态为RS232通信端口或RS485通信端口。 CPU 通信端口引脚分配 1.S7-200 SMART CPU 集成的 RS485 通信…

vant金额输入框

1.在components中新建文件夹currency&#xff0c;新建index.js import Currency from ./src/currency.vueCurrency.install function (Vue) {Vue.component(Currency.name, Currency) }export default Currency 2.在currency中新建文件夹src&#xff0c;在src中间currency.v…

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明&#xff08;1&#xff09;网关将用户信息写在请求头中&#xff08;2&#xff09;业务微服务之间通过OpenFeign进行调用&#xff0c;并且将用户信息写在OpenFeign准备的请求头中&am…

Python 基础教程,Python 是什么?

Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间而开发的&#xff0c;之所以会选择 Python 作为该编程语言的名字&#xff0c;是因为 Guido 是 Monty Python 戏剧团的忠实粉丝。 Python 语言是在 ABC 语言的…

透镜天线的分类、特点及龙伯球透镜天线原理

透镜天线&#xff0c;一种能够通过电磁波&#xff0c;将点源或线源的球面波或柱面波转换为平面波从而获得笔形、扇形或其他形状波束的天线。通过合适设计透镜表面形状和折射率n&#xff0c;调节电磁波的相速以获得辐射口径上的平面波前。透镜天线吸收了许多光信息工程技术&…

lodash常用方法笔记

_.fromPairs(pairs) 与_.toPairs正好相反&#xff1b;这个方法返回一个由键值对pairs构成的对象。 _.fromPairs([[fred, 30], [barney, 40]]); // > { fred: 30, barney: 40 }Object.fromEntries()有同样的功能&#xff0c;只是在高版本浏览器才支持&#xff1a; _toPai…

VR全景智慧文旅,用科技助力旅游业振兴

引言&#xff1a; 近年来&#xff0c;科技的迅猛发展将我们带入一个全新的数字化时代&#xff0c;而虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术则以其令人惊叹的全新方式&#xff0c;影响着各个领域。其中&#xff0c;旅游业作为人们探索世界、体…

通过Python爬虫提升网站搜索排名

目录 怎么使用Python爬虫提升排名 1. 抓取竞争对手数据&#xff1a; 2. 关键词研究&#xff1a; 3. 网页内容优化&#xff1a; 4. 内部链接建设&#xff1a; 5. 外部链接建设&#xff1a; 6. 监测和调整&#xff1a; 需要注意哪些方面 1. 合法性和道德性&#xff1a; …

docker容器管理

创建容器&#xff1a; docker run --name 容器名 -d -p 端口1:端口2 –name :是启动容器时&#xff0c;给容器定义的名称&#xff0c;不使用该参数时&#xff0c;容器启动成功之后&#xff0c;会生成随机名称 -d &#xff1a;代表容器处于后台yunx -p &#xff1a;指定容器的端…

stm32项目(10)——基于stm32的盲人监护系统

一.实现的功能 本次设计的盲人监护系统&#xff0c;旨在为盲人的外出提供保护。主要功能如下&#xff1a; 超声波测距模块检测前方障碍物&#xff0c;当前方有障碍物时&#xff0c;语音模块报警提示“前方有障碍物&#xff0c;请绕道”&#xff0c;盲人在听到这条语音后就知…

数据分析案例丨商品零售购物篮分析(上)

购物篮分析关联规则挖掘应用 将单个客户一次购买商品的总和(以收银台结账为准)称为一个购物篮。那么购物篮分析就是针对商品的相关性进行分析。因为最初这种关联分析主要是在超市应用广泛&#xff0c;所以也称为“购物篮分析”。 购物篮分析是商业领域最前沿、最具挑战性的问…

ASP.NET Core - 缓存之分布式缓存

分布式缓存是由多个应用服务器共享的缓存&#xff0c;通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性&#xff0c;尤其是当应用由云服务或服务器场托管时。 与其他将缓存数据存储在单个应用服务器上的缓存方案相比&am…

日常BUG——git提交代码报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 git 在提交代码时报错&#xff1a; Committing is not possible because you have unmerge…

智慧工地源码,互联网+建筑工地,基于微服务+Java+Spring Cloud +Vue+UniApp开发

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移…

日常BUG—— SpringBoot项目DEBUG模式启动慢、卡死。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 我们调试程序时&#xff0c;需要使用DEBUG模式启动SpringBoot项目&#xff0c; 有时候会发…