JVM运行数据区-Java堆

在这里插入图片描述

Java堆

堆区(Heap区)是JVM运行时数据区占用内存最大的一块区域,每一个JVM进程只存在一个堆区,它在JVM启动时被创建,JVM规范中规定堆区可以是物理上不连续的内存,但必须是逻辑上连续的内存。

1、堆区是线程共享共享的区域,同时也是JVM管理最大的内存区域。
2、JVM规范中描述,所有的对象实例及数组都应该在运行时分配在堆上。而他们的引用会被保存在虚拟机栈中,当方法结束,这些实例不会被立即清除,而是等待垃圾回收。
3、由于堆占用内存大,所以是垃圾回收的重点区域。

堆区的组成

在这里插入图片描述
堆区的组成分为年轻代(Young Generation)、老年代(Old Generation),年轻代被分为伊甸区和幸存者区,幸存区又被分为Survivor 0(S0)和Survivor 1(S1)。年轻代和老年代比例为1:2,伊甸区和S0、S1比例为8:1:1,当然这个比例都是可以通过JVM参数设置,不同区域存放的对象不同:

1、伊甸区(Eden) :存放大部分新创建对象。
2、幸存区(Survivor):存放Minor GC 之后,Eden区和幸存区(Survivor)本身没有被回收的对象。
3、老年代:存放Minor GC之后且年龄计数器达到15依然存活的对象、Major GC和Full GC之后仍然存活的对象。

堆空间的大小设置

1、-Xms、-Xmx和-Xmn
Java堆的内存大小是可修改的,默认情况下,初始堆内存为物理内存的1/64,最大为物理内存的1/4。

-Xms:设置初始堆内存,如-Xms64m
-Xmx: 设置最大堆内存,如-Xmx64m
—Xmn: 设置年轻代内存,如-Xmx32m
2、各内存区域比例
年轻代与老年代默认为1:2,可通过-XX:NewRatio参数修改,如-XX:NewRatio=4,即为1:4
伊甸区和S0、S1区默认为8:1:1,可通过-XX:SurvivorRatio参数修改,如-XX:SurvivorRatio=6,通过监测发现设置,以后并不是6:1:1,这是因为Java堆的内存分配策略,关闭内存分配策略,-XX:-UseAdaptiveSizePolicy

3、内存溢出
当JVM无法申请到足够内存给堆空间或者没有足够的空间存储当前堆中的对象,就会出现java.lang.OutOfMemoryError。

验证内存溢出

设置-Xmx128m -XX:+PrintGCDetails(打印GC日志),执行如下程序,创建一个128M数组,该数组既无法在eden区存放,也无法在老年代存放,同时,也会触发一次Full GC,Full GC之后,依然无法存放,抛出OMM异常。

public class HeapSetDemo {public static void main(String[] args) {byte[] b = new byte[1024 * 1024 * 128];}
}
[GC (Allocation Failure) [PSYoungGen: 2007K->856K(38400K)] 2007K->864K(125952K), 0.0007477 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 856K->808K(38400K)] 864K->816K(125952K), 0.0005979 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 808K->0K(38400K)] [ParOldGen: 8K->611K(87552K)] 816K->611K(125952K), [Metaspace: 3210K->3210K(1056768K)], 0.0040897 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 0K->0K(38400K)] 611K->611K(125952K), 0.0002508 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(38400K)] [ParOldGen: 611K->593K(87552K)] 611K->593K(125952K), [Metaspace: 3210K->3210K(1056768K)], 0.0042290 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat heap.HeapSetDemo.main(HeapSetDemo.java:13)```

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

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

相关文章

R语言探索与分析17-CPI的分析和研究

一、选题背景 CPI(居民消费价格指数)作为一个重要的宏观经济指标,扮演着评估通货膨胀和居民生活水平的关键角色。在湖北省这个经济活跃的地区,CPI的波动对于居民生活、企业经营以及政府宏观经济政策制定都具有重要的影响。因此&a…

【MATLAB】概述1

非 ~ 注释 % 定义 >> 数组 赋值 赋值:>> x1 函数 数组 x[x1,x2] 行向量(,or ) x[x1;x2] 列向量 x. 转置等间隔向量 1-10 向量:>>xlinspace(1,10,10) 矩阵 矩阵:>>A[1,2,3;4,5,6;7,8,9] …

容器中运行ip addr提示bash: ip: command not found【笔记】

容器中运行ip addr提示bash: ip: command not found 原因没有安装ip命令。 rootdocker-desktop:/# ip addr bash: ip: command not found rootdocker-desktop:/# apt-get install -y iproute2

设计模式20——职责链模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 职责链模式(Chain …

使用耳机,如何避免听力受损?

使用耳机,如何避免听力受损? 随着数字时代生活方式的改变,无线耳机近年来成为消费者智慧生活的新宠。不少人会在上班通勤的路上习惯性地戴上耳机,打开播客或聆听音乐。工作中戴上耳机视频会议。午休的时候戴上耳机看视频。但你知…

设计模式23——状态模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 状态模式(State&am…

【场景题】如何排查CPU偏高的问题

为了解决CPU偏高的问题,我们首先看一下每一个进程的CPU占用情况,使用命令Top 可以看见是进程id为2266的进程里面的java程序,占用了CPU90%使用情况 所以我们需要找到是哪一个代码导致的这样的情况,由于代码是线程执行的&#xff…

Three.js 研究:4、创建设备底部旋转的科技感圆环

1、实现效果 2、PNG转SVG 2.1、原始物料 使用网站工具https://convertio.co/zh/png-svg/进行PNG转SVG 3、导入SVG至Blender 4、制作旋转动画 4.1、给圆环着色 4.2、修改圆环中心位置 4.3、让圆环旋转起来 参考一下文章 Three.js 研究:1、如何让物体动起来 Thre…

解决 DataGrip 2024.1.3 连接 Tdengine 时timestamp字段显示时区不正确问题

设置中找到该设置,将原来的设置 yyyy-MM-dd HH:mm:ss 修改为: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意:只能修改第一个,修改后提示错误,但是查询数据时能成功格式化时间,修改第二个不生效,可能是 bug 具体格式见: Date…

macOS上用Qt creator编译并跑shotcut

1 简介 Shotcut是一个开源的跨平台的视频编辑软件,支持WIN/MACOS/LINUX等平台,由于该项目的编译较为麻烦,踩坑几许,因此写此文章记录完整编译构建过程,后续按此法编译,可减少走弯路,提高生产力。…

软件质量保障——三、四

三、黑盒测试 1.黑盒测试概述 1.1 如何理解黑盒测试? 1.2 黑盒测试有什么特点? 1.3 如何实施黑盒测试? 2. 黑盒测试用例设计和生成方法(这里还是要自己找题做) 2.1 等价类划分法 步骤: 1.选择划分准…

亚信安慧AntDB数据库与华为数据存储完成兼容性互认证

迎接数智时代,供给核心科技。日前,湖南亚信安慧科技有限公司(简称:亚信安慧)与华为技术有限公司(简称:华为),完成了AntDB数据库产品与OceanProtect备份一体机及Oceanstor…

python学习笔记-04

高级数据类型 一组按照顺序排列的值称为序列,python中存在三种内置的序列类型:字符串、列表和元组。序列可以支持索引和切片的操作,第一个索引值为0表示从左向右找,第一个索引值为负数表示从右找。 1.字符串操作 1.1 切片 切片…

目标检测数据集 - 智能零售柜商品检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:智能零售柜商品检测数据集,真实智能零售柜监控场景采集高质量商品图片数据,数据集含常见智能零售柜商品图片,包括罐装饮料类、袋装零食类等等。数据标注标签包含 113 个商品类别;适用实际项目应用&#xff…

云数融合与大数据技术在日常生活中的创新应用探索

前言 移动云模型服务产品在中国移动旗下主要包括云计算、大数据、人工智能等服务,它依托广泛的算力资源(4N31X)、丰富的网络接入资源和高品质云专网,实现算网端资源一站式开通,构建企业级一体化解决方案。 文章目录 前言云计算的日常应用智…

Kafka自定义分区器编写教程

1.创建java类MyPartitioner并实现Partitioner接口 点击灯泡选择实现方法,导入需要实现的抽象方法 2.实现方法 3.自定义分区器的使用 在自定义生产者消息发送时,属性配置上加入自定义分区器 properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,&q…

蓝桥杯物联网竞赛_STM32L071_20_用printf将数据显示在OLED上

需求: 第十五届国赛确实有点变态,显示部分大概有6个所以需要大量将sprintf与OLED_ShowString配合使用才能显示相应格式的数据,所以我在想能不能简化一下这一部分直接用写好的printf语句将数据显示到显示屏上呢? 代码&#xff1a…

李廉洋:6.4黄金原油今日行情价格涨跌趋势分析及最新操作建议多空布局;

黄金消息面分析:全球债券周二上涨,呼应美债隔夜的涨势。美联储或早降息的押注增强了主权债务的吸引力。澳大利亚和新西兰10年期债券收益率下跌至少8个基点,先前数据显示,美国5月份工厂活动萎缩的速度加快。日本10年期债券收益率下…

数字塔问题

#include<iostream> using namespace std; //从下向上得到最优值 void dtower(int a[][100],int s[][100],int n) {for(int in; i>1; i--){for(int j1; j<i; j){if(in)s[i][j]a[i][j];else{int ts[i1][j];if(t<s[i1][j1])ts[i1][j1];s[i][j]a[i][j]t;}}} } void…

工业楼控暖通组态恒温检测控制大屏前端UI案例

工业楼控暖通组态恒温检测控制大屏前端UI案例