JVM 内存区域

news2024/11/19 22:42:29
JVM内存结构模型

在这里插入图片描述

程序计数器:
1.线程私有的,是一块较小的内存空间,当前线程所执行的字节码的行号指示器
2.每个线程都有一个独立的程序计数器,各线程之间程序计数器互不影响,独立存储
3.此内存区域是唯一一个在java虚拟机中没有OutOfMemoryError异常的区域

Java虚拟机栈:
1.线程私有的,生命周期跟线程相同
2.虚拟机栈描述的是Java方法执行的内存模型。每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息
3.局部变量表存放了编译期间各种基本数据类型和对象引用,在编译期间完成内存分配
4.如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,但扩展时无法申请到足够的内存,将抛出OutOfMemoryError异常

本地方法栈:
1.根Java虚拟机栈的作用类似,Java虚拟机栈为执行Java方法服务,而本地方法栈为Native方法服务
2.跟Java虚拟机一样,本地方法区也会抛出StackOverflowError和OutOfMemoryError异常

Java堆:
1.线程共享的,存放对象的实例
2.Java虚拟机所管理的内存中最大的一块,可分为新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间
3.当堆中没有内存完成实例分配,且堆内存也无法再扩展时,将抛出OutOfMemoryError异常

方法区:
1.线程共享的,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器后的代码等数据
2.当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常
内存分配方式
  虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行响应的类加载过程。
  在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。
  内存分配方式有两种:指针碰撞 和 空闲列表
  • 指针碰撞

    假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲那边挪动一段与对象大小相等的距离,这种分配方式称为"指针碰撞"
    在这里插入图片描述

  • 空闲列表

    如果Java堆中内存不是规整的,已使用和未使用内存相互交错,那么无法简单进行指针碰撞了,虚拟机就必须维护一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为"空闲列表"
    在这里插入图片描述

PS:并发安全问题

例如正在给A对象分配内存,指针还没来得及修改,此时对象B又同时使用了原来的指针来分配内存的情况。

两种解决方案:
1.CAS
  对分配内存空间同步处理-虚拟机采用CAS失败重试的方式保证更新操作的原子性
2.TLAB(本地线程分配缓冲:Thread Local Allocation Buffer)
  把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存

对象的内存布局

在这里插入图片描述

对象的访问定位
使用对象需要通过栈上的reference数据来操作堆上的具体对象,对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用"句柄"和"直接指针"两种。

1.句柄:Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了"对象实例数据"与"对象类型数据"各自的具体地址信息
在这里插入图片描述

优点:reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的示例数据指针而reference本身不需要修改

2.直接指针:Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址
在这里插入图片描述

优点:速度更快,它节省了一次(对象实例数据)指针定位的时间开销

JVM参数设置
-Xmx:堆最大值
-Xms:堆初始值
当-Xmx和-Xms设置一样时,可避免堆自动扩展

-Xss:栈大小

-XX:PermSize 方法区初始值
-XX:MaxPermSize 方法区最大值

-XX:+HeapDumpOnOutOfMemoryError:可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转存储快照以便事后进行分析

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

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

相关文章

u系 kdump查看配置

V4 桌面: 如果能上外网配置网络源安装软件包: 会自动安装以下几个包(不能连接外网直接安装一下几个包即可): 查看kdump配置: Kdump-config show 可以看到USE_KDUMP1 ,生成的vmcore文件在/var…

4种互斥机制比较

4种互斥机制 关中断禁止任务切换信号量互斥信号量 关中断 关中断(Disable Interrupts):通过禁用中断来实现互斥。在关中断期间,任何中断请求都会被忽略,从而确保了临界区的独占性。然而,这种方法会导致系统…

【软考篇】中级软件设计师 第二部分(二)

中级软件设计师 第二部分(二) 十三. 死锁问题十四. 段页式存储14.1 页式存储14.1.1 缺页中断14.1.2 页面置换算法 14.2 段式存储14.3 段页式存储 十五. 索引文件十六. 文件目录16.1 树形目录结构16.2 位示图 十三. 死锁问题 多刷题 系统不可能发生死锁的…

⑨【MySQL事务】事务开启、提交、回滚,事务特性ACID,脏读、幻读、不可重复读。

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL事务 ⑨【事务】1. 事务概述2. 操作事务3…

面试经典(6/150)轮转数组

面试经典(6/150)轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 以下为自己的思路,我不明白最终的返回值为什么有误,好像是题目里要求原地解决问题,而我创…

Live800:客服行业的发展历程及未来前景

随着信息技术和互联网的高速发展,客服行业也在不断变革和发展。客服行业是一个服务型的行业,其发展历程也与人们对服务需求的变化密切相关。本文将介绍客服行业的发展历程和未来前景。 客服行业的发展历程 20世纪70年代,客服行业主要以电话服…

【开源】基于Vue.js的校园二手交易系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模块2.3 商品预约管理模块2.4 商品预定管理模块2.5 商品留言板管理模块2.6 商品资讯管理模块 三、实体类设计3.1 用户表3.2 二手商品表3.3 商品预约表3.4 商品预定表3.5 留言表3.6…

如何安装WampServer并结合内网穿透工具实现公网访问内网服务

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…

卡尔曼家族从零解剖-(06) 一维卡尔曼滤波编程(c++)实践、透彻理解公式结果

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…

linux高级篇基础理论(详细文档)二

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

NOIR脑机接口机器人——让脑机接口通过少样本学习实现做家务的能力

一、概述 大脑与机器人接口(BRI)是人类艺术、科学和工程的集大成之作,其影响已经贯穿于无数科幻作品和创意艺术之中,如《黑客帝国》和《西部世界》等。然而,要真正实现BRI并创造出能够与人类完美协同运作的机器人系统…

对一个Series序列执行多种聚合操作Series.aggregate()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对序列同时做多种聚合计算 聚合计算:求最大、均值等 Series.aggregate() [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd a pd.Series([1,2,3]) print("【…

CNCC 2023收官,Milvus Cloud与行业大咖共话向量数据库系统

近期,CNCC 2023 在沈阳圆满结束,紧凑、前沿的 129 场技术论坛让人印象深刻。据悉,这 129 场技术论坛涵盖人工智能、安全、计算+、软件工程、教育、网络、芯片、云计算等 30 余个方向。Zilliz 受邀参与【智能时代的大数据系统】技术论坛。 智能时代的到来,无疑给社会经济和日…

.pcd文件格式

更详细的格式介绍可以查看我的这篇博客 『Open3D』安装与点云格式通识_open3d安装_NNNNNathan的博客-CSDN博客文章浏览阅读1.9k次。介绍了open3d的安装和当前适用与存储点云信息的文件格式,并详细介绍了pcd与ply两种格式。_open3d安装https://blog.csdn.net/qq_413…

Spring中的BeanFactory和ApplicationContext的区别

我用一个例子去测试BeanFactory和ApplicationContext的区别 首先建立一个bean public class User { //声明无参构造,打印一句话,监测对象创建时机public User(){System.out.println("User对象初始化");} } 然后再建立测试类 ublic class User…

Apache Airflow (七) :DAG调度周期设置

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

轻松找回您的珍贵回忆的最好的 6 种照片数据恢复软件!

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

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析

少儿编程 蓝桥杯青少组计算思维题考试真题及解析 单选题 1.多多观察一个立体图形,从不同的角度看到的形状如下图所示: 这个立体图形可能是 A. B. C. D. 2.将下图旋转后,可以得到的图片是 A、 B、 C、 D、 3.小鱼按照下面的规律排列&a…

C语言--指针与数组--遍历数组的n种方式【详细】

一.一维数组名的含义 arr一般表示数组的其实地址(除了两种例外) 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表示数组的…

Leetcode刷题详解——太平洋大西洋水流问题

1. 题目链接:417. 太平洋大西洋水流问题 2. 题目描述: 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格…