JVM——运行时数据区(堆+方法区+直接内存)

news2024/11/26 18:30:51

目录

  • 1.Java堆
  • 2.方法区
    • **方法区(Method Area)溢出**
    • 方法区(Method Area)字符串常量池
    • 静态变量的存储
  • 3.直接内存(Direct Memory)

1.Java堆

⚫ 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。
⚫ 栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间共享。在这里插入图片描述

堆内存大小是有上限的,当对象一直向堆中放入对象达到上限之后,就会抛出OutOfMemory错误。

⚫ 堆空间有三个需要关注的值,used total max。
⚫ used指的是当前已使用的堆内存,total是java虚拟机已经分配的可用堆内存,max是java虚拟机可以分配的最大堆内存。
在这里插入图片描述
arthas中堆内存相关的功能
⚫ 堆内存used total max三个值可以通过dashboard命令看到。
⚫ 手动指定刷新频率(不指定默认5秒一次):dashboard –i 刷新频率(毫秒)在这里插入图片描述
⚫ 随着堆中的对象增多,当total可以使用的内存即将不足时,java虚拟机会继续分配内存给堆。
⚫ 如果堆内存不足,java虚拟机就会不断的分配内存,total值会变大。total最多只能与max相等在这里插入图片描述
⚫ 如果不设置任何的虚拟机参数,max默认是系统内存的1/4,total默认是系统内存的1/64。在实际应用中一般都需要设置total和max的值。

堆 – 设置大小

⚫ 要修改堆的大小,可以使用虚拟机参数 –Xmx(max最大值)和-Xms (初始的total)。

⚫ 语法:-Xmx值 -Xms值

⚫ 单位:字节(默认,必须是 1024 的倍数)、k或者K(KB)、m或者M(MB)、g或者G(GB)
⚫ 限制:Xmx必须大于 2 MB,Xms必须大于1MB
在这里插入图片描述

⚫ Java服务端程序开发时,建议将-Xmx和-Xms设置为相同的值,这样在程序启动之后可使用的总内存就是最大内存,而无
需向java虚拟机再次申请,减少了申请并分配内存时间上的开销,同时也不会出现内存过剩之后堆收缩的情况。
⚫ -Xmx具体设置的值与实际的应用程序运行环境有关,在《实战篇》中会给出设置方案。在这里插入图片描述

2.方法区

⚫ 方法区是存放基础信息的位置,线程共享,主要包含三部分内容:在这里插入图片描述
⚫ 方法区是用来存储每个类的基本信息(元信息),一般称之为InstanceKlass对象。在类的加载阶段完成。在这里插入图片描述
⚫ 方法区除了存储类的元信息之外,还存放了运行时常量池。常量池中存放的是字节码中的常量池内容。
⚫ 字节码文件中通过编号查表的方式找到常量,这种常量池称为静态常量池。当常量池加载到内存中之后,可以通过内存地址快速的定位到常量池中的内容,这种常量池称为运行时常量池。在这里插入图片描述
⚫ 方法区是《Java虚拟机规范》中设计的虚拟概念,每款Java虚拟机在实现上都各不相同。Hotspot设计如下:
⚫ JDK7及之前的版本将方法区存放在堆区域中的永久代空间,堆的大小由虚拟机参数来控制。
⚫ JDK8及之后的版本将方法区存放在元空间中,元空间位于操作系统维护的直接内存中,默认情况下只要不超过操作系统承受的上限,可以一直分配在这里插入图片描述
arthas中查看方法区
⚫ 使用memory打印出内存情况,JDK7及之前的版本查看ps_perm_gen属性。
⚫ JDK8及之后的版本查看metaspace属性。在这里插入图片描述

方法区(Method Area)溢出

实验发现,JDK7上运行大概十几万次,就出现了错误。在JDK8上运行百万次,程序都没有出现任何错误,但是内存会直线升高。这说明JDK7和JDK8在方法区的存放上,采用了不同的设计。
⚫ JDK7将方法区存放在堆区域中的永久代空间,堆的大小由虚拟机参数-XX:MaxPermSize=值来控制。
⚫ JDK8将方法区存放在元空间中,元空间位于操作系统维护的直接内存中,默认情况下只要不超过操作系统承受的上限,可以一直分配。可以使用-XX:MaxMetaspaceSize=值将元空间最大大小进行限制。

方法区(Method Area)字符串常量池

⚫ 方法区中除了类的元信息、运行时常量池之外,还有一块区域叫字符串常量池(StringTable)。
⚫ 字符串常量池存储在代码中定义的常量字符串内容。比如“123” 这个123就会被放入字符串常量池。在这里插入图片描述
字符串常量池和运行时常量池有什么关系?
早期设计时,字符串常量池是属于运行时常量池的一部分,他们存储的位置也是一致的。后续做出了调整,将字符串常量池和运行时常量池做了拆分在这里插入图片描述

静态变量的存储

在这里插入图片描述
在这里插入图片描述

3.直接内存(Direct Memory)

⚫ 直接内存(Direct Memory)并不在《Java虚拟机规范》中存在,所以并不属于Java运行时的内存区域。
在 JDK 1.4 中引入了 NIO 机制,使用了直接内存,主要为了解决以下两个问题:
1、Java堆中的对象如果不再使用要回收,回收时会影响对象的创建和使用。
2、IO操作比如读文件,需要先把文件读入直接内存(缓冲区)再把数据复制到Java堆中。
现在直接放入直接内存即可,同时Java堆上维护直接内存的引用,减少了数据复制的开销。写文件也是类似的思路。在这里插入图片描述
直接内存(Direct Memory)
⚫ 要创建直接内存上的数据,可以使用ByteBuffer。
⚫ 语法: ByteBuffer directBuffer = ByteBuffer.allocateDirect(size);
⚫ 注意事项: arthas的memory命令可以查看直接内存大小,属性名direct。
在这里插入图片描述

⚫ 如果需要手动调整直接内存的大小,可以使用-XX:MaxDirectMemorySize=大小
单位k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。默认不设置该参数情况下,JVM 自动选择 最
大分配的大小。
以下示例以不同的单位说明如何将 直接内存大小设置为 1024 KB:
-XX:MaxDirectMemorySize=1m
-XX:MaxDirectMemorySize=1024k
-XX:MaxDirectMemorySize=1048576

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

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

相关文章

NoC流量控制

参考链接1:https://blog.csdn.net/yang1573/article/details/128787167参考链接2:https://shili2017.github.io/posts/NOC5/参考文件:SE22_noc_flow_control.pdf

对象存储OSS服务器邀请试用

文章目录 试用产品领取产品试用权限上传文件开启加速传输提交作品小程序提交任务获取奖励 试用产品 先下载要上传的资源 电脑浏览器打开此页面开始试用,页面如下图 未登录的先登录 领取产品试用权限 在该页面中点击立即试用,弹框勾选服务协议并领取试…

差分详解(附加模板和例题)

一、一维差分 1.一维差分运用 设a[N]为原数组,b[N]为差分数组&#xff0c;c[N]为进行操作后得到的新数组 (1).先求出差分数组b[N] for(i1;i<n;i) {cin>>a[i];b[i]a[i]-a[i-1]; } (2).进行差分操作&#xff0c;利用void insert(int l,int r,int c)函数 void ins…

redis运维(五)再探redis

一 redis概述 ① redis简介 redis三大特性&#xff1a; 缓存、分布式内存数据库、持久化说明&#xff1a;非必须不建议在redis终端操作 ② redis亮点 ③ 初露锋芒 redis-benchmark redis-benchmark并发压力测试的问题解析 备注&#xff1a;多次测试取平均值,最好在物理机…

Android修行手册-Gson中不用实体类生成JsonObject或JsonArray

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

那些年我们追过的 内部类

目录 1. 什么是内部类&#xff1f; 2. 内部类的分类 3. 内部类 3.1 实例内部类 3.2 静态内部类 4. 局部内部类 5. 匿名内部类 6.对象的打印 “不积跬步无以至千里&#xff0c;不积小流无以成江海。”每天坚持学习&#xff0c;哪怕是一点点&#xff01;&#xff01;&a…

Java毕业设计心得体会

1. 开始准备选题、开题报告 大四上学期开学时开始准备论文的&#xff0c;首先是确定论文主题&#xff0c;看自己想做什么毕业设计&#xff0c;可以选取之前接触过的&#xff0c;做过的东西&#xff0c;这样快一些&#xff0c;我之前一直是学Java的&#xff0c;就打算直接用Jav…

【网络知识必知必会】再谈Cookie和Session

文章目录 前言1. 回顾 Cookie1.1 到底什么是 CookieCookie 的数据从哪里来Cookie 的数据长什么样Cookie 有什么作用Cookie 到哪里去Cookie 怎么存储的 2. 理解 Session3. Cookie 和 Session 的区别总结 前言 在讲 HTTP 协议时, 我们就谈到了 Cookie 和 Session, 当时我们只是粗…

redis运维(六)redis-cli命令

一 redis-cli 注意&#xff1a; redis-cli核redis-server版本必须适配 --> 见 redis-cli --version提示&#xff1a; 不过一般安装服务端 redis-server 时内置了客户端 redis-cli说明&#xff1a; redis-cli 是 redis 的一种命令行的客户端工具备注&#xff1a; redis-se…

单链表经典OJ题(四)

目录 1、链表中倒数第k个结点 2、消失的数字 3、轮转数组 4、合并两个有序数组 5、数组串联 6、序列中删除指定数字 1、链表中倒数第k个结点 链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com) 这道题依然利用双指针法&#xff0c;具体解题思路如下&#xff1a; 1…

场景图形管理-多视图与相机(3)

在OSG中多视图的管理是通过osgViewer::CompositeViewer类来实现的。该类负责多个视图的管理及同步工作&#xff0c;继承自osgViewer;:ViewerBase类&#xff0c;继承关系图如图8-13所示 图8-13 osgViewer::CompositeViewer 的继承关系图 在前面已经讲到&#xff0c;osgViewer:Vi…

GDPU 商务英语 [初入职场](持续更新……)

&#x1f468;‍&#x1f3eb; 商务英语&#xff08;初入职场电子书PDF&#xff09;提取码&#xff1a;t9ri Unit 1 Job-seeking ✨ 单词 recruitment n. 招聘physical adj. 有形的;物质的profitability n. 盈利launch vt. 将(新产品等)投放市场budget n. 预算account for 占…

Qt QLable 字符过长省略

前言&#xff1a; 项目中常用到字符过长问题&#xff0c;Qt默认的省略并不好用&#xff0c;不是自己想要的&#xff1b; QFontMetri 可使用 QFontMetri 当text的像素宽度超过width&#xff0c;将返回字符串的一个省略版本取决于mode。否则将返回原字符串&#xff1b; mode…

工厂是否需要单独的设备管理部门

设备是工厂生产过程中不可或缺的重要资源&#xff0c;其正常运行和有效管理对于工厂的生产效率和质量至关重要。为了确保设备的良好状态和高效运行&#xff0c;许多工厂选择设立专门的设备管理部门。本文将探讨设备管理部门的职责、与生产部门下的点检维保团队的区别&#xff0…

PyCharm 远程连接服务器并使用服务器的 Jupyter 环境

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法&#xff1a;CENC-AES-CTR 使用 AES&#xff08;Advanced Encryption Standard&…

Java GUI实现贪吃蛇游戏

贪吃蛇是一款经典的游戏&#xff0c;玩法相对简单但富有挑战性。以下是贪吃蛇游戏的基本玩法说明&#xff1a; 目标&#xff1a;控制一条蛇&#xff0c;在游戏区域内吃到尽可能多的食物&#xff0c;使蛇身变长&#xff0c;同时避免撞到自己的身体或游戏区域的边界。 控制&…

SQL题

[极客大挑战 2019]EasySQL 进行简单的尝试&#xff0c;就知道是单引号的字符型注入 万能密码进行一个简单的尝试 结果就出来了 还是要了解一下原理 输入的是1&#xff0c;形成的sql语句是错误的SELECT*FROM table_name WHERE username1and password123; 第一个单引号和第二个…

[代码实战和详解]VGG16

VGG16 详解 我的github代码实现&#xff1a;vgg16 我们在vgg16神经网络上训练了SIGNS数据集&#xff0c;这是一个分类的数据集&#xff0c;在我的github上有介绍怎么下载数据集以及如何训练。 VGG16是一个卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;它在2014年…