【JVM】jvm虚拟机中的堆

news2024/11/19 8:40:58

jvm虚拟机中的堆

  • 一、JVM体系结构
  • 二、Java堆简介
    • 2.1 堆的特点
    • 2.2 堆空间细分
    • 2.3 堆空间的分代思想
    • 2.4 堆的默认大小
  • 三、JVM堆内存常用参数
  • 四、垃圾回收算法(GC,Garbage Collection)
    • 4.1 标记-清除(Mark-Sweep)
    • 4.2 复制(Copy)
    • 4.3 标记-整理(Mark-Compact)
  • 五、常见错误
    • 5.1 为什么会堆内存溢出?

一、JVM体系结构

在这里插入图片描述我们接下来说的JVM中运行时数据区中的堆区(Heap Area)。

二、Java堆简介

对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块区域,在虚拟机启动时创建。此内存区域的唯一的目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。在《Java虚拟机规范》中对Java堆的描述是:“所有的对象实例以及数组都应当在堆上分配”。

2.1 堆的特点

  1. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域
  2. Java堆区在JVM启动的时候被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。但是堆内存的大小是可以调节的
  3. 《Java虚拟机规范》规定,堆可以处于 **物理上不连续** 的内存空间中,但是 **逻辑上** 它应该是被视为 连续的
  4. 堆针对一个 JVM 进程 来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的
  5. 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区**Thread Local Allocation Buffer, TLAB**

2.2 堆空间细分

在这里插入图片描述从上图中我们可以知道,堆的空间可以被细分为很多区:

  1. 年轻代(Young Gen)
  2. 老年代(Old Gen)
  3. 永久代(Perm Gen)

其中年轻代被分为 Eden 空间Survivor 1空间From区)、Survivor 0空间To 区),备注:谁空谁就是 To区

  • 所有对象一出生都会在Eden区,并且对象年龄为0。Eden区满了之后会触发minor GC, minor GC只回收年轻代中需要回收的对象。每一次minor GC,若该对象没有被回收,那么对象的年龄就会 + 1。对象到达阈值以后该对象会进入老年代(android阈值为6)。
  • 当老年代空间满了以后会触发full GC,full GC会同时回收年轻代和老年代中所有需要回收的对象。

2.3 堆空间的分代思想

年轻代、老年代、永久代

  • 年轻代用于放置临时对象或者生命周期短的对象
  • 老年代用于放置生命周期长的对象
  • 永久代或者元空间,用于存放常量
  • minor GC (轻GC)只管年轻代,Full GC(重GC) 同时管理年轻代和老年代

为什么要分代?有什么好处?

  • 经研究表明,不同对象的生命周期是不一致的,但是在具体的使用过程中,70%–90%的对象都是临时对象
  • 分代唯一的理由就是优化GC的性能,如果没有分代,那么所有对象都处于一块空间,GC想要回收,则GC需要描述所有的对象,分代之后,长期持有的对象可以被挑出,短期持有的对象可以固定在一个位置回收,省掉很大一部分空间利用。

2.4 堆的默认大小

  • 初始大小:电脑物理内存的 1/64
  • 最大内存大小:电脑物理内存的 1/4

Runtime类:该类对应的JVM运行时数据区

long initialMemory = Runtime.getRuntime().totalMemory();
long maxMemory = Runtime.getRuntime().maxMemory();
long freeMemory = Runtime.getRuntime().freeMemory();

三、JVM堆内存常用参数

参数说明
-Xms堆内存初始大小,单位m(兆)、g(G)
-Xmx(MaxHeapSize)堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize非堆内存最大允许大小
-XX:NewSize(-Xns)年轻代内存初始大小
-XX:MaxNewSize(-Xmn)年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1
-Xss堆栈内存大小

四、垃圾回收算法(GC,Garbage Collection)

以下几种垃圾回收算法只是抛砖引玉,具体详细的算法说明还需要自行搜索并加以学习,算法还有很多,所以学习的东西有很多哦。

红色是标记的非活动对象,绿色是活动对象。

4.1 标记-清除(Mark-Sweep)

GC分为两个阶段,标记和清除。首先标记所有可回收的对象,在标记完成后统一回收所有被标记的对象。同时会产生不连续的内存碎片。碎片过多会导致以后程序运行时需要分配较大对象时,无法找到足够的连续内存,而不得已再次触发GC。
在这里插入图片描述

4.2 复制(Copy)

将内存按容量划分为两块,每次只使用其中一块。当这一块内存用完了,就将存活的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。这样使得每次都是对半个内存区回收,也不用考虑内存碎片问题,简单高效。缺点需要两倍的内存空间。
在这里插入图片描述

4.3 标记-整理(Mark-Compact)

也分为两个阶段,首先标记可回收的对象,再将存活的对象都向一端移动,然后清理掉边界以外的内存。此方法避免标记-清除算法的碎片问题,同时也避免了复制算法的空间问题。

一般年轻代中执行GC后,会有少量的对象存活,就会选用复制算法,只要付出少量的存活对象复制成本就可以完成收集。

而老年代中因为对象存活率高,没有额外过多内存空间分配,就需要使用标记-清理或者标记-整理算法来进行回收。
在这里插入图片描述

五、常见错误

5.1 为什么会堆内存溢出?

在年轻代中经过GC后还存活的对象会被复制到老年代中。当老年代空间不足时,JVM会对老年代进行完全的垃圾回收(Full GC)。如果GC后,还是无法存放从Survivor区复制过来的对象,就会出现OOM(Out of Memory)。
OOM(Out Of Memory)异常常见有以下几个原因:

  1. 老年代内存不足:java.lang.OutOfMemoryError:Javaheapspace
  2. 永久代内存不足:java.lang.OutOfMemoryError:PermGenspace
  3. 代码bug,占用内存无法及时回收

OOM在这几个内存区都有可能出现,实际遇到OOM时,能根据异常信息定位到哪个区的内存溢出。

可以通过添加个参数 -XX:+HeapDumpOnOutMemoryError,让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后分析。

熟悉了JAVA内存管理机制及配置参数,下面是对JAVA应用启动选项调优配置:

JAVA_OPTS=“-server -Xms512m -Xmx2g -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:MaxGCPauseMillis=400 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:
ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:…/logs/gc.log”

设置堆内存最小和最大值,最大值参考历史利用率设置

设置GC垃圾收集器为G1

启用GC日志,方便后期分析

完结!

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

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

相关文章

【代码审计-1】PHP无框架项目SQL注入

代码审计 教学计划:审计项目漏洞Demo->审计思路->完整源码框架->验证并利用漏洞 教学内容:PHP,JAVA网站应用,引入框架类开发源码,相关审计工具及插件使用 必备知识点:环境安装搭建使用&#xff0c…

python是什么鬼?为什么学会他就能月入过万,它真的这么牛吗?

为什么那么多人选择学习python? Python在人工智能、大数据、自动化运维、全栈开发等方面具有独特的优势。随着Python继续占据编程语言主流的趋势,全国各城市的招聘岗位和薪酬将大幅增加。此外,随着人工智能在中国的投资和规划,对…

使用docker compose一键部署多个服务

docker compose 是 docker 官方的开源项目,用来实现对 docker 容器集群的快速编排 下载安装 官网下载地址:点这里 我用的是云服务器,所以就直接用yum安装了,直接执行这两条命令,等安装结束后查看版本,看到…

SpringCloud系列(六)Feign 客户端的配置及使用

❓Feign 是什么? 🙊Feign 是一个声明式的 http 客户端, 其主要的作用就是帮助我们实现 http 的请求发送, 正如官网所说, Feign使编写Java http客户端更容易; ❓❓为什么要用 Feign? 🙊🙊如在未学习 Feign 之前, 我们利用的是 RestTemplate …

2022年宜春市职业院校技能大赛中职组“网络搭建与应用”赛项任务书

2022年宜春市职业院校技能大赛中职组“网络搭建与应用”赛项任务书 (总分1000分) 赛题说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分二个部分,其中: 第一部分:网络搭建及安全部署项目 第二部分:服务器…

【实时数仓】DWS层访客主题计算(续)、商品主题计算

文章目录一 DWS层-访客主题计算1 写入OLAP数据库&#xff08;1&#xff09;增加ClickhouseUtila JdbcSink.<T>sink( )的四个参数说明b ClickhouseUtil中获取JdbcSink函数的实现c 构造者设计模式d 赋值给问号占位符并创建TransientSink注解e 在GmallConfig中配置ClickHous…

SWRM(2022)

论文题目&#xff08;Title&#xff09;&#xff1a;Sentiment Word Aware Multimodal Refinement for Multimodal Sentiment Analysis with ASR Errors 研究问题&#xff08;Question&#xff09;&#xff1a;具有语音识别错误的多模态情感分析的情感词感知多模态细化 研究动…

位 字节 字符

位 字节 字符 比特位(bit)→【百度百科】 字节(Byte)→【百度百科】 字符 →【百度百科】 位(bit,简写为b)&#xff1a;&#xff1a; 1、计算机 最小的存储单位&#xff1b; 2、比特位上的值只能存 0 或 1&#xff1b; 3、数据传输大多是以 位 为单位。 字节(Byte,简写为B)&…

SQL | 你必须知道的一些 SELECT 查询

数据是许多大小企业的核心部分。例如&#xff0c;Facebook 存储每个用户的个人资料信息&#xff0c;数据库系统内的数据包括他们的朋友和帖子。SQL&#xff08;Structured Query Language 的缩写&#xff09;是一种编程语言&#xff0c;使开发人员和数据库管理员能够使用那些数…

云、数、智“三江并流”,亚马逊云科技将把数字化航船带向何方?

科技云报道原创。 数流和智流融合不仅仅是趋势&#xff0c;而是正在发生的事情。 从国家层面“十四五”规划为数字化转型高度定调&#xff0c;到各行业内外部刚需推进&#xff0c;数字化转型是千行百业必然发展趋势。 如果说过去两年是数字化转型的试验阶段&#xff0c;进行…

打开远程会议模式新篇章,华为云会议让沟通更高效!

当下&#xff0c;“降本增效”似乎已成诸多公司的战略选择&#xff0c;不少企业希望能够借助借数字化的转型&#xff0c;对办公方式以及远程会议模式进行升级。在这一市场需求的推动下&#xff0c;不少云服务厂商都针对办公推出了全新的会议模式&#xff0c;比如我们熟悉的华为…

ArcGIS基础:拓扑工具编辑面要素的公共边

需求&#xff1a;在普通的面要素数据中&#xff0c;存在很多相邻面要素&#xff0c;其一大特点就是存在公共边和公共顶点&#xff0c;如下所示&#xff1a; 如果对其中的一个公共边或者公共顶点进行编辑&#xff0c;必须保证相邻的面要素在数据的编辑前后保持拓扑关系不变。 …

搭建基于 Python+Flask+MySQL 的学生培养计划管理系统(附源码)

大家好&#xff0c;今天给大家分析一款 PythonFlaskMySQL 实现的学生培养计划管理系统&#xff0c;项目包括课程推荐、课程评分、交流论坛和模拟退选课模块。 文章目录项目功能项目目录项目环境使用方法源码项目展示项目功能 学生培养计划可视化&#xff0c;学生能够直观地了解…

转行前端一年大概是什么水平

水平“仅供参考” 你很可能是通过搜索找到这篇文章的。 刚入行那会儿&#xff0c;整个小团队就我一只前端。我没有参考坐标系&#xff0c;不知道自己水平是什么程度&#xff0c;不知道大家是什么水平&#xff0c;更不知道就业市场对一年工作经验的要求是怎样的。那种感觉&…

推荐8个提高工作效率的IntelliJ插件

前言 欢迎关注个人公众号——JAVA旭阳 IntelliJ目前已经成为市面上最受欢迎的Java开发工具&#xff0c;这得益于里面非常丰富的插件机制。本文我将分享在日常开发中我经常使用的5个插件&#xff0c;它们可以帮助您提高工作效率。 1. GenerateAllSetter 作为开发人员&#xff…

美国物理学会Physics网站公布“年度亮点”工作,AlphaFold和潘建伟团队成果等入选

凭借詹姆斯韦伯太空望远镜拍摄的令人惊叹的图像、激光聚变的突破、升级后的大型强子对撞机的启动以及小行星防御系统的首次测试&#xff0c;2022 年提供了大量的宏伟成果。 在生物、量子和凝聚态物理学方面也有重要的小规模努力&#xff0c;以及在多样性、公平性和包容性方面的…

图片颜色处理

目录背景任务需求思考过程背景 背景叙述的是我为什么要做颜色处理以及整个思考过程&#xff0c;有些流水账&#xff0c;可不看。 任务需求 拍照&#xff0c;获取图片中固定一块区域的颜色&#xff0c;判断是不是红色。 思考过程 知道这个任务的时候&#xff0c;首先对图像…

深入理解Self-attention

概述 输入的特点 是一个向量序列序列的长度是可变的例如&#xff1a;对于音频数据&#xff0c;STFT之后&#xff0c;得到每个帧的特征&#xff0c;这些帧在时间维度上构成序列 输出类型有三种 对序列中的每一个向量&#xff0c;都有一个对应的输出&#xff0c;比如说要对一段…

活动星投票国潮大秀东方网络评选投票怎么做的免费微信投票活动

如果通过一个小程序免费制作一个微信投票活动呢&#xff1f;文章详细讲解如何利用一款免费好用的微信小程序“活动星投票”小程序来制作投票活动&#xff0c;无需注册即可免费制作&#xff0c;非常的方便快捷&#xff0c;可以实现视频投票、分组投票、隐藏选手票数、导出投票数…

Feign作为HTTP客户端调用远程服务

前言 在分布式微服务的机构体系下&#xff0c;我们日常开发调用内部微服务的方式通常是Feign调用&#xff0c;grpc、dubbo&#xff0c;大部分的公司后端架构基本是以Spring Cloud 体系下的&#xff0c;所以基本会用到Feign&#xff0c;Feign是 Netflix开发的声明式、模板化的H…