JVM 内存结构快速入门

news2024/12/23 22:46:47

文章目录

    • 一、简介
    • 二、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 程序计数器的作用和使用场景

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

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

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

相关文章

013 怎么激活win10系统?

1、搜索软件Windows PowerShell: 在“开始”菜单栏,搜索“Windows PowerShell.exe”,以管理员模式打开。 2、输入 三条命令: (1)slmgr /ipk VK7JG-NPHTM-C10JM-9MPGT-3A77T (最后这个字符为秘钥&#xf…

力扣初级算法(数组拆分)

力扣初级算法(数组拆分) 每日一算法: 力扣初级算法(数组拆分) 学习内容: 1.问题描述 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) …

MATLAB中的代数环概念

在 Simulink 模型中,当存在信号环并且信号环中只存在直接馈通模块时,将出现代数环。直接馈通表示 Simulink 需要模块输入信号的值来计算当前时间步的输出。这种信号循环会在同一时间步中产生模块输出和输入的循环依存关系。这会导致一个需要在每个时间步…

基于C#的无边框窗体阴影绘制方案 - 开源研究系列文章

今天介绍无边框窗体阴影绘制的内容。 上次有介绍使用双窗体的方法来显示阴影,这次介绍使用API函数来进行绘制。这里使用的是Windows API函数,操作系统的窗体也是用的这个来进行的绘制。 1、 项目目录; 下面是项目目录; 2、 函数介…

Nginx搭建本地服务器,无需购买服务器即可测试vue项目打包后的效果

一.前言 本文是在windows环境(Linux环境下其实也大同小异)下基于Nginx实现搭建本地服务器,手把手教你部署vue项目。 二.Nginx入门 1)下载安装 进入Nginx官网下载,选择stable版本下的windows版本下载即可 2)…

【链表OJ】链表中倒数第k个结点 合并两个链表(含哨兵位) 分割链表 链表的回文结构

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣和牛客上链表OJ题目 目录 一、链表中倒数第k个结点 题目描述: 解题思路: 二.合并两个链表(含哨兵位) …

热点如何用于期刊写作——以chatGPT为例

交叉领域A,B 以自己为例子,A是教育 B是技术,我是教育技术学专业。 经验来源 知网关于GPT的140余篇专业论文的观察 截止至2023年8月14日15:35:45 学习每出现一个热点,如何应用于学术。 实践阅读发现 套路一:谈理论…

Java通过文件流和文件地址下载文件

通过文件流下载文件 如何使用 MultipartFile 进行文件上传、下载到本地,并返回保存路径呢: import org.springframework.web.multipart.MultipartFile;import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOExcep…

发布游戏,进行打包。(Unity)

做到这里,我们的项目基本功能已经完成了,如果你还想使项目功能更加完善,可以自己思考如何补充,充分发挥并进行优化使效果达到更加美好。 首先呢,我们这里是说打包Window电脑游戏,我们直接点击菜单栏文件-&…

数据结构与算法基础(青岛大学-王卓)(7)

差点就脱更了啊,微臣嘴干玩死,忙碌的暑假,还有头痛的new house, 我这junk food 也是吃一大堆,please不要长胖啊。 图的应用 这一章内容也是很多啊,概念真是比牛毛还多。。。看了两遍才缓过来啊 fighting 文章目录 [toc…

DoIP学习笔记系列:(六)满足AES128-CMAC算法的“安全认证”.dll生成实践

文章目录 1. 算法Demo2. 算法实现传送门 DoIP学习笔记系列:导航篇 AES128-CMAC算法在汽车电子控制单元的软件开发中涉及到安全相关的需求经经常用到,具体的算法原理请各位小伙伴自行百度,本篇主要向大家分享该算法如何集成到.dll文件中,在OTA、刷写等场景作为$27服务的安全…

Python实现透明隧道爬虫ip:不影响现有网络结构

作为一名专业爬虫程序员,我们常常需要使用隧道代理来保护个人隐私和访问互联网资源。本文将分享如何使用Python实现透明隧道代理,以便在保护隐私的同时不影响现有网络结构。通过实际操作示例和专业的解析,我们将带您深入了解透明隧道代理的工…

微服务相关面试题

👏作者简介:大家好,我是爱写博客的嗯哼,爱好Java的小菜坤 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝社区论坛:希望大家能加入社区共同进步…

自动化测试系列 —— UI测试

UI 测试是一种测试类型,也称为用户界面测试,通过该测试,我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要,通过执行 UI 测试…

解决生成式AI落地之困,亚马逊云科技提供完整解决方案

生成式AI技术无疑是当前最大的时代想象力之一。 资本、创业者、普通人都在涌入生成式AI里去一探究竟:“百模大战”连夜打响,融资规模连创新高,各种消费类产品概念不断涌现……根据Bloomberg Intelligence 的报告,2022年生成式AI 市…

[HDLBits] Exams/m2014 q4c

Implement the following circuit: module top_module (input clk,input d, input r, // synchronous resetoutput q);always(posedge clk) beginif(r) q<1b0;elseq<d;end endmodule

万字长文·通俗易懂·一篇包掌握——输入/输出·文件操作(c语言超详细系列)(二)

前言&#xff1a;Hello&#xff0c;大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;上一节我们主要学习了格式化输入输出的基本内容&#xff0c;这一节我们对格式化进行更加深入的了解&#xff0c;对文件概念进行介绍&#xff0c;并且对输入、输出与文件读写的基本概念…

推断统计(独立样本t检验)

这里我们是采用假设检验中的独立样本t 检验来比较两个独立正态总体均值之间是否存在显著性差异&#xff0c;以比较城市与农村孩子的心理素质是否有显著差异为例 。 这里我们首先是假设城市孩子与农村孩子心理素质无显著差异&#xff0c;但是此时方差是否齐性是未知的&#xff0…

IntelliJ IDEA(简称Idea) 基本常用设置及Maven部署---详细介绍

一&#xff0c;Idea是什么&#xff1f; 前言&#xff1a; 众所周知&#xff0c;现在有许多编译工具&#xff0c;如eclipse&#xff0c;pathon, 今天所要学的Idea编译工具 Idea是JetBrains公司开发的一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java…

4.文件保护

第四章 文件管理 4.文件保护 ​   加密保护&#xff1a;可以用“密码”与文件的原始数据依次做异或运算。这样可以把整个文件的数据都进行加密&#xff0c;所以系统中保存的并不是文件的原始数据&#xff0c;而是保存了对文件进行加密之后的数据&#xff0c;所以如果一个用户…