系列七、JVM的内存结构【堆(Heap)】

一、概述

        一个JVM实例只存在一个堆内存,堆内存的大小是可以手动调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分,即:新生区、养老区、永久区(Java7)/元空间(Java8)

1.1、新生区

        新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分为2部分,即:伊甸区(Eden space)和幸存者区(Survivor space),所有的类都是在伊甸区被new出来的。幸存区有2个:0区(Survivor 0 space)和1区(Survivor 1 space)。当伊甸区的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸区的垃圾进行回收(Minor GC),将伊甸区中的不再被其他对象所引用的对象进行销毁。
   如果出现了java.lang.OutOfMemoryError:Java heap space异常,说明java虚拟机的堆内存不够,原因有二:
   1、java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整;
   2、代码中创建了大量大对象,并且长时间不能被垃圾回收器收集(该对象还被引用着);

1.1.1、Minor GC的过程

复制===>清空===》交换 

1、eden、from区中的对象复制到to区,年龄+1

        首先,当eden区满的时候会触发第一次GC,把还活着的对象拷贝到from区,当eden区再次满的时候会扫描eden区和from区,对这两个区域的对象进行垃圾回收,经过这次回收后还存活着的对象,则直接复制到to区(如果有对象的年龄已经达到了老年的标准,则复制到老年代),同时把这些对象的年龄+1;

2、清空eden、from区

        然后清空eden区和from区中的的对象,原来的from区变to区,to区变为新一轮的from区,也即复制之后有交换,谁空谁是to;

3、进入老年代

        部分对象会在from区和to区中复制来复制去,如此交换15次(由JVM的参数MaxTenuringThreshold决定,这个参数默认值为15)之后,如果还活着将进入老年代。

1.2、养老区

存放的是经历过15次完整垃圾回收的对象。

1.3、元空间

         实际而言,方法区(Method Area)和堆一样,是各个线程共享的内存区域,用于存储虚拟机加载的:类信息+普通常量+静态常量+编译器编译后的代码等等,虽然JVM规范将方法区描述为堆的一个逻辑部分,但它却还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。   


        对于HotSpot虚拟机,很多开发者习惯将方法区称之为“永久代(Parmanent Gen)” ,但严格本质上说两者不同,或者说使用永久代来实现方法区而已,永久代是方法区(相当于是一个接口interface)的一个实现,jdk1.7的版本中,已经将原本放在永久代的字符串常量池移走。

        永久存储区是一个常驻内存区域,用于存放JDK自身所携带的 Class,Interface 的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭 JVM 才会释放此区域所占用的内存。

 

二、堆内存参数调优

2.1、堆内存参数调优调哪些参数

-Xms堆空间的最小值,默认为物理内存的1/64
-Xmx堆空间的最大值,默认为物理内存的1/4
-XX:+PrintGCDetails输出详细的GC处理日志

 

 

 

2.2、堆内存的默认物理内存 

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/16 14:50
 * @Description: 获取堆内存的默认物理内存大小
 */
public class HeapMainApp {
 
    public static void main(String[] args) {
        // Java虚拟机试图使用的最大内存
        long maxMemory = Runtime.getRuntime().maxMemory();
        // 当前Java虚拟机中的内存总量
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println("【-Xmx】最大内存 = " + maxMemory + " (字节)、" + (maxMemory / (double) 1024 / 1024) + " (MB)");
        System.out.println("【-Xms】总内存 = " + totalMemory + " (字节)、" + (totalMemory / (double) 1024 / 1024) + " (MB)");
    }
 
}

2.3、修改堆内存大小

-Xms1024m -Xmx1024m -XX:+PrintGCDetails

 

三、OOM异常演示

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/16 15:31
 * @Description: 修改堆内存的最大值和最小值为10m,方便观察GC的回收过程
 * -Xms10m -Xmx10m -XX:+PrintGCDetails
 */
public class OomMainApp {
 
    public static void main(String[] args) {
        String message = "欧耶,今天星期五!";
        while (true) {
            message += message + new Random().nextInt(88888888) + new Random(99999999);
        }
    }
 
}

四、获取本机的cpu核数

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/16 14:39
 * @Description: 获取本机的电脑核数
 */
public class CpuMainApp {
 
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
 
}

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

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

相关文章

EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 字10-63邮箱、EEPROM信息 1.1 字10-63组成规范 字10-63虽然包含的空间区域很大,但实际上仅包含引导状态下邮箱配置、标准邮箱配置、EEPROM大小、执行的SII标准版本…

相机突然断电,保存的DAT视频文件如何修复

3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频,比如用单反相机、无人机拍摄视频的时候,如果电池突然断电,或者突然炸机了,就非常有可能会得到一个损坏的视频文件,比如会产生…

网络安全(黑客技术)—高效自学

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…

udp多点通信-广播-组播

单播 每次只有两个实体相互通信,发送端和接收端都是唯一确定的。 广播 主机之间的一对多的通信所有的主机都可以接收到广播消息(不管你是否需要)广播禁止穿过路由器(只能做局域网通信)只有UDP可以广播广播地址 有效网络号全是1的主机号 192.1…

卷积神经网络(CNN)多种图片分类的实现

文章目录 前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)我的环境: 2. 导入数据3.归一化4.可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU(如果使用的是CPU可以忽略这步&#…

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍: Elasticsearch 是一个开源的分布式搜索和分析引擎,Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析:一旦数据被索引&#…

Python Numpy.einsum

、 见 https://zhuanlan.zhihu.com/p/27739282

Resolume Arena 7.15.0(VJ音视频软件)

Resolume Arena 7是一款专业的实时视觉效果软件,用于创造引人入胜的视频演出和灯光秀。它提供了丰富多样的功能和工具,可以将音频、视频和图像合成在一起,创造出令人惊叹的视觉效果。 Resolume Arena 7支持多种媒体格式,包括视频文…

微信@all bug复现及原理分析

1、复现 条件: 1、Windows PC 端微信 2、自建一个群聊拥有群管权限可以所有人 废话不多说,直接上图 所有人 剪切后,到另一个群中,引用任意一个群里成员的消息,并将刚才剪切的粘贴至此,发送 便可完成非群…

LeetCode之二叉树

发现更多计算机知识,欢迎访问Cr不是铬的个人网站 最近数据结构学到二叉树,就刷了刷力扣,写这篇文章也是辅助记忆。 103二叉树锯齿形遍历 要解出本道题,首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里…

重磅 | 进一步夯实生态建设,朗思科技与阿里龙蜥完成兼容性认证

近日,北京朗思智能科技有限公司(以下简称“朗思科技”)自主研发的数字员工产品与OpenAnolis龙蜥社区龙蜥操作系统(Anolis OS)8完成兼容性认证。测试结果显示,双方产品相互兼容,功能正常&#xf…

【window 10】开启加速器,连接外网 打开外网链接

打开网页 链接 https://steampp.net/,点击下载 下载 我选的是 微软商店 安装 打开后界面是这样,先注册个用户登录 选择 需要加速的内容 先选中下面的复选框 再点击 ‘一键加速’ 按钮,出现下面的界面 打开外网的链接 直接访问 就好了&#xf…

【算法每日一练]-图论(保姆级教程 篇3(遍历))#图的遍历 #奶牛牧场 #杂务

今天讲图的遍历 目录 题目:图的遍历 思路: 题目:奶牛牧场 思路: 题目:杂务 思路: 题目:图的遍历 思路: 正向建边需要跑O(N^2)会超时,所以反向建边,先从最大的点出发&#x…

解锁编程潜能:探索亚马逊CodeWhisperer,打造编程世界的声音引导者

文章目录 前言一、什么是 Amazon CodeWhisperer?二、如何使用CodeWhisperer?安装CodeWhisperer插件配置CodeWhisperer生成注释和文档 总结 前言 随着CHATGPT的一声巨响,大语言模型已经成为了一个备受瞩目的创新应用。亚马逊云科技作为全球领…

Java常用命令行指令有哪些?Java指令分享!

在Java开发中,命令行工具是非常重要的,它们允许开发人员执行各种任务,从编译和运行Java程序到管理Java虚拟机。本文将介绍一些常用的Java命令行指令,并通过具体实例演示它们的用法。 1. 编译Java源代码 使用javac命令可以将Java源…

贪吃蛇基础知识铺垫2(c语言)

宽字符的打印 那如果想在屏幕上打印宽字符,怎么打印呢? 宽字符的字⾯量必须加上前缀“L”,否则 C 语⾔会把字⾯量当作窄字符类型处理。前缀“L”在单引 号前⾯,表⽰宽字符,对应 wprintf() 的占位符为 %lc &#xff1b…

[Linux]NFS文件共享服务

一、NFS 1.1 NFS的简介 NFS(Network File System 网络文件服务),是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。 NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用&#x…

Hacker 资讯|11 月中下旬区块链黑客松活动汇总

「TinTin Hacker 快讯」是 TinTinLand 建立的一个资讯专栏,汇集近期线上线下的黑客松及 Grant,旨在帮助开发者和区块链爱好者获取最新的黑客松资讯,鼓励他们了解并根据自身情况参与不同的黑客松,更好地建设 Web3 生态。 2023 Wint…

被保留的IP地址:潜在用途和管理策略

在互联网的底层,存在一些特定范围的IP地址被保留,不分配给特定的设备或组织。这些被保留的IP地址有着特殊的用途,涉及网络通信、安全性和私有网络等方面。本文将深入探讨被保留的IP地址的潜在用途以及管理策略。 1. 被保留的IP地址范围 被保留…

【算法基础】分解质因数

文章目录 什么是分解质因数具体案例输入格式输出格式数据范围 原理讲解原始方法转换思路利用试除法判定质数的思路为什么不需要单独判断是否为质数 什么是分解质因数 分解质因数是指将一个合数用质因数相乘的形式表示出来,即将一个合数分解为若干个质数的乘积。其中…