【基础篇】十、JVM堆 直接内存

文章目录

  • 一、堆
    • 1、堆heap
    • 2、堆溢出
    • 3、used、total、max
    • 4、设置堆内存大小
  • 二、直接内存

运行时数据区域,还有两组成部分:堆和方法区,和栈、程序计数器不同,它们是线程共享的

在这里插入图片描述

一、堆

1、堆heap

  • 堆内存是线程共享的
  • 创建出来的对象存于堆内存

如图:栈里的局部变量中存了堆上对象的引用:

在这里插入图片描述

2、堆溢出

ArrayList<Object> list = new ArrayList<>();
while (true) {list.add(new byte[1024 * 1024]);
}

一直new对象往堆里放,最终达到堆内存上限值后堆内存溢出OutOfMemory:Java heap space

在这里插入图片描述

3、used、total、max

  • used:已使用的堆内存
  • total:可用堆内存大小
  • max:最大可分配的堆内存
    在这里插入图片描述

调整下上面的代码:

ArrayList<Object> list = new ArrayList<>();
while (true) {System.in.read();System.out.println("往堆中放入一次...");list.add(new byte[1024 * 1024 * 10]);
}

使用阿尔萨斯工具来看JVM信息:

dashboard -i 刷新频率(毫秒)

或者直接使用memory只查看内存:

memory

随着堆中对象变多,used即将达到total时,total值变大,但最大只能到与max相等:

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

并不是当used = max = total的时候,堆内存就溢出了!! 这和垃圾回收有关。

4、设置堆内存大小

添加虚拟机参数:

-Xmx-Xms//eg:
-Xmx1g -Xms1g

在Dockerfile中可写:

ENV JAVA_OPTS="-Xms512m -Xmx512m "

其中:

  • –Xmx是max最大值,-Xms 是初始的total
  • 单位默认字节byte且是1024的倍数,可k或者K(KB)、m或者M(MB)、g或者G(GB)
  • 限制Xmx必须大于 2 MB,Xms必须大于1MB

在这里插入图片描述
开发中,把-Xmx和-Xms设为相同的值,如此,程序启动后的可用内存就是最大内存,无需向JVM频繁申请,以减少申请内存的时间开销。

二、直接内存

直接内存不属于Java运行时的内存区域,用途:

  • Java堆中的对象如果不再使用要回收,回收时会影响对象的创建和使用

  • 普通IO,是文件先读到内存(缓存区),再复制到JVM堆中。引入直接内存则不用复制这一步,直接让堆中存一个引用
    在这里插入图片描述

  • JDK8及以后,存方法区的数据

使用ByteBuffer创建直接内存上的数据:

public class Demo2 {public static int size = 1024 * 1024 * 100;public static List<ByteBuffer> list = new ArrayList<>();public static int count = 0;public static void main(String[] args) throws Exception {System.in.read();while(true){ByteBuffer directSpace = ByteBuffer.allocateDirect(size);list.add(directSpace);System.out.println(++count);Thread.sleep(5000);}}
}

阿尔萨斯查看:

在这里插入图片描述

修改直接内存的上限:

-XX:MaxDirectMemorySize=大小//eg:-XX:MaxDirectMemorySize=300m

出现直接内存溢出:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bert-vits2最终版Bert-vits2-2.3云端训练和推理(Colab免费GPU算力平台)

对于深度学习初学者来说&#xff0c;JupyterNoteBook的脚本运行形式显然更加友好&#xff0c;依托Python语言的跨平台特性&#xff0c;JupyterNoteBook既可以在本地线下环境运行&#xff0c;也可以在线上服务器上运行。GoogleColab作为免费GPU算力平台的执牛耳者&#xff0c;更…

数据库-MySQL 启动方式

以管理员身份运行命令行 或者Shell net start //查看所有服务 net start MYSQL80 //启动服务 net stop MYSQL80 //停止服务完整安装MySQL社区版本的 会有这个 启动服务 停止服务 重启服务

软件测试之测试用例和缺陷报告模板分享

对于测试工程师&#xff0c;必备技能之一便是测试用例的编写和软件缺陷报告的编写啦~下面提供一些模板还有项目实战样例供大家参考参考&#xff0c; 1.通过Excel表格编写测试用例 2. 缺陷报告模板 下面来个实战案例 3.在线课程作业管理系统项目测试用例&#xff08;部分&…

2023,解析新能源动力电池这一年,谁最赚钱?谁在海外最吃香?

算力说&#xff1a; 每一年都有每一年的里程碑时刻&#xff0c;每一年也都有每一年的产业高光&#xff0c;2023依然是知识点密集、变化丛生的一年&#xff0c;新能源汽车和动力电池发展之势不减&#xff0c;一路出海奔袭&#xff0c;成为高质、创新和低碳的经典范本&#xff1b…

【Unity嵌入Android原生工程】

Unity嵌入Android原生工程 本章学习,Unity模块嵌入Android## 标题Unity导出Android工程创建Android Studio工程Unity嵌入到Andorid StudioAndroid原生代码跳转到Unity场景工作需要嵌入原生工程,并实现热更,记录一下 工具,Unity2023.3.14,Android Studio 2022.3.1 patch3 Un…

Tabs组件的使用

概述 在我们常用的应用中&#xff0c;经常会有视图内容切换的场景&#xff0c;来展示更加丰富的内容。比如下面这个页面&#xff0c;点击底部的页签的选项&#xff0c;可以实现“首页”和“我的” 两个内容视图的切换。 ArkUI开发框架提供了一种页签容器组件Tabs&#xff0c;…

【Hotspot源码】揭秘Java线程创建过程中的各种细节

近期准备给大家分享专题系列文章&#xff0c;聚焦Java多线程机制。会从hotspot源码角度&#xff0c;给大家揭秘平时学习多线程那些从来没有想过的问题&#xff0c;或者存在疑虑却又无法证明的理论。 今天是系列文章首篇&#xff0c;咱们来谈谈Java线程创建的一些细节问题&#…

实战环境搭建-安装Linux

打开VMware如下图: 点击“创建新的虚拟机”如下图: 选择自定义(高级选项),点击“下一步”,如下图: 点击“下一步” 点击“浏览”选择下载好的镜像文件,如下图:

阿里云服务器系统盘扩容后,宝塔面板不显示新容量的问题

最近因项目需求&#xff0c;服务系系统内存不够使用了&#xff0c;就在阿里云后台扩容&#xff0c; 但是扩容后&#xff0c;宝塔面板上看不到新的容量&#xff0c;重启后还是看不见。 首先&#xff0c;要备份数据库和重要文件的备份&#xff0c;创建快照&#xff0c;以防在硬盘…

C# halcon 工业产品尺寸测量

产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序&#xff0c;主要用于图像处理和测量。以下是对代码的一些总结&#xff1a; 1. **图像显示与加载&#xff1a;** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …

Python爬虫中的协程

协程 基本概念 协程&#xff1a;当程序执行的某一个任务遇到了IO操作时&#xff08;处于阻塞状态&#xff09;&#xff0c;不让CPU切换走&#xff08;就是不让CPU去执行其他程序&#xff09;&#xff0c;而是选择性的切换到其他任务上&#xff0c;让CPU执行新的任务&#xff…