【JavaEE 初阶】 JVM内存区域划分与GC垃圾回收机制

news2025/1/11 23:46:01

尽力做到十全十美~~

文章目录

  • 1. JVM内存区域划分
  • 2. 垃圾回收机制
    • 2.1 内存溢出与内存泄漏
    • 2.2 判断是否是垃圾
      • 2.2.1 引用计数
      • 2.2.2 可达性分析
    • 2.3 垃圾清理算法
      • 2.3.1 标记清除
      • 2.3.2 复制算法
      • 2.3.3 标记整理算法
      • 2.3.4 分代回收



1. JVM内存区域划分

JVM运行时数据区域,也叫内存布局。如下图,它由五大部分组成。
在这里插入图片描述

  1. 本地方法栈,native指的是JVM内部的C++代码,这块空间是给调用native方法准备的栈空间,每个线程有一个自己的本地方法栈.
  2. 程序计数器,记录当前线程执行到了哪条指令.每个线程都有自己的一份程序计数器.
  3. 虚拟机栈,给Java代码使用的栈,每个线程都有一个自己的虚拟机栈.线程中的每个方法作为一个元素,称为一个栈桢.这个栈帧,包含方法的入口地址,返回地址,局部变量等.每调用一个方法,就会创建一个栈帧,方法执行结束,栈帧自动销毁.
  4. 堆,是整个JVM空间最大的区域,new出来的对象,类的成员变量,都在堆中.堆是每个进程有一个自己的堆
  5. 元数据区,之前也叫方法区,包含常量池,静态成员,一个进程有一块,进程中的多个线程公用这块空间.常量池中包含字面量及符号引用。字面量包括字符串,final常量及基本数据类型的值。符号引用包含在该类中,出现过的各类包,类,接口,字段,方法等元素的全限定名,符号引用,只是一个符号而已,只是告知jvm,此类需要哪些调用方法,引用或者继承哪些类等等信息.但要使用的时候,只知道名字是不行的,还需要知道符号的地址,直接引用就是这种指针,指向目标地址,类加载的解析阶段就是将符号引用转为直接引用。

2. 垃圾回收机制

2.1 内存溢出与内存泄漏

首先,我们来简单了解一下内存溢出与内存泄漏。

内存泄漏:我们在栈上占用的空间,方法结束,栈会自动销毁。但我们在堆上申请的空间(使用new,或者C++的malloc开辟的空间),如果没有手动释放,这块空间就会一直被占用,我们也用不了,相当于荒废了,这就可能导致一个严重的问题- - -内存泄漏。若程序24小时运转,这种内存泄漏越来越多,最终没有可用的空间,后果会非常严重。什么是垃圾呢,垃圾指的是不再使用的内容,垃圾回收就是不用的内容帮我们自动释放了。

内存溢出:程序在申请内存时,没有足够的内存空间供其使用,以下是有可能引起内存溢出的原因。

  1. 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  2. 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收,这是上面内存泄漏导致的问题。
  3. 代码中存在死循环或循环产生过多重复的对象实体;
  4. 使用的第三方软件中的BUG;
  5. 启动参数内存值设定的过小,如给一个Integer类型的数字存了long长度的值,存不下。

2.2 判断是否是垃圾

JVM虚拟机中虚拟机栈,程序计数器等是每个线程有一份,线程结束,内存空间会自动回收,这里的垃圾回收,我们主要针对堆上的内容。系统是怎么判断一个对象是否是垃圾的呢?当一块内存的内容我们不再使用,这个内存的内容就是垃圾了。GC回收以对象为单位。

那么GC是通过怎样的方法来判断一个对象是否是垃圾的呢?
关键看,这个对象有没有引用指向它,如果没有引用指向它,这个对象也找不到,没办法再使用了,就可以当作垃圾进行回收。

2.2.1 引用计数

这种办法是Python,PHP的做法,Java没有使用。
JVM给每一个对象分配了一个计数器,没有一个引用指向它,计数器加一。当计数器为0时,这个对象就可以被回收了。如下图所示.

Test t1 = new Test();//Test对象计数1
Test t2 = t1;//Test对象计数2
Test t3 = t2;//Test对象计数3

一旦对象超出作用域,失效了,计数就会减1.当计数器为0时,回收Test对象.
这种方法虽简单有效,但缺点也很明显,每一个对象都分配计数器,当对象很多的时候,就会占用大量空间.当同一个类里的两个对象互相引用,它们的计数器最少为1,无法被正确释放.

2.2.2 可达性分析

Java中的对象都是通过引用来访问的,经常一个引用,指向一个对象,这个对象的成员又指向别的对象.这种关系,JVM通过链式或者树将他们串起来.
每隔一段时间,从根节点遍历一次,没办法遍历到的,就作为垃圾处理.
在Java中,GCroot对象包含以下几种,方法区的静态成员变量,常量池中的对象,栈上的局部变量.一个代码中有很多这样的起点,把每个起点都往下遍历一遍,就完成了一次扫描.

2.3 垃圾清理算法

2.3.1 标记清除

标记所有不再使用的对象,标记完成后,统一回收.
如下图,回收之前
在这里插入图片描述
回收之后,有很多无法使用的内存碎片.长时间后,会有大量的内存小碎片,如果申请大一点的内存空间,就会失败.
在这里插入图片描述

2.3.2 复制算法

这种算法是把内存分成大小相等的两部分,只用某一半,当内存需要垃圾回收时,把还存活的对象复制到另一半,之后,把这块空间全部释放.
如下图,这是释放之前的
在这里插入图片描述
将存货对象复制到右半块,然后,将这左半块空间整个释放掉.
在这里插入图片描述
优点是防止了内存碎片,缺点是,每一次只能使用一半的内存空间,空间利用率低,并且,在垃圾少,存活对象多时,需要搬运大量的存活对象,效率低.

2.3.3 标记整理算法

为了优化复制算法,标记整理算法的做法是,先标记需要回收的对象,之后,再把存活的对象都移向一端,之后,清理边界之外的内存,如下图所示.
在这里插入图片描述
优点是避免内存碎片,但效率依旧不是很高

2.3.4 分代回收

分代回收,是基于不同类型的对象,来进行不同方法的回收.JVM有一个规律,一个对象,它的生命周期,要么特别短,要么特别长.如果,一个对象它存在的时间很长,那么,他大概率会继续长时间存在下去.
依此,我们给对象引入一个概念- - -年龄,以熬过GC的轮次为单位,经过一轮可达性的遍历,这个对象仍然存在,它的年龄就加1.
如下图,是堆的区域划分.
在这里插入图片描述

  1. 刚new出来的对象,是年龄为0的对象,放到伊甸区(是西方神话中造小人的地方)
  2. 若熬过一轮GC,对象经复制算法放到幸存区.
    在幸存区,要接受两个幸存区周期性的GC检验,每一轮GC,若是垃圾,就释放掉,不是垃圾,就经复制算法,拷贝到另一个幸存区.同一时间,只能使用一个幸存区.
    若一个对象,在幸存区被拷贝多次,就可以经复制算法进入老年区了
  3. 在老年区的对象,生命周期普遍更长,针对老年区的对象,也要进行GC可达性分析,但频率可以降低.若是垃圾,可通过标记清理的方式进行清除.

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

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

相关文章

5款非常好用的设计工具,推荐第一款在线设计工具

特别是在当今的UI设计领域,如果没有合适的UI设计工具,那么即使你的创作能力很强,工作也会有限,但许多软件需要会员使用,这不适合新设计师,所以有在线UI设计工具吗?关于这个问题,今天…

【翻译一下官方文档】学习uniCloud云数据库之前需要了解的传统api操作数据库(Command)

我将用图文的形式,把市面上优质的课程加以自己的理解,详细的把:创建一个uniCloud的应用,其中的每一步记录出来,方便大家写项目中,做到哪一步不会了,可以轻松翻看文章进行查阅。(此文…

STM32:GPIO配置和使用

目录 一、GPIO简介 1.1 GPIO的输入输出模式 1.1.1 输入模式 1.1.2 输出模式 二、GPIO的使用 2.1 引脚初始化 2.2 引脚使用 注:型号:STM32F407ZET6 一、GPIO简介 GPIO:通用输入输出接口 STM32上有A~H共8组,其中A~G7组每…

WPS作图常见问题

表格 1、打开WPS表格,切换至“开始”选项卡,单击“绘图边框”按钮,如下图。 2、鼠标变成如下图一样的笔后,按照斜线表头的方向拉动鼠标,然后就给单元格添加了一道斜线,如下图。 WPS表格如何随文字移动 1、…

java ssm成绩查询管理系统idea开发mysql数据库web结构计算机java编程

一、源码特点 idea ssm成绩查询管理系统是一套完善的web设计系统mysql数据库springMVC框架mybatis,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 java ssm成绩查询管理系统idea开发mysql数据…

智慧校园管理平台系统源码,云平台、人脸识别、物联网技术、信息发布技术

智慧校园云平台源码,智慧电子班牌源码 电子班牌系统是全功能智慧管理平台系统,电子班牌系统是以在校人员信息、出勤管理和班级信息展示为主体,为学校教育行业量身设计的一款集云平台、网络数据实时通信技术、物联网技术、智能控制技术、信息…

Google Sites快速做出一個簡單的網頁

新手網站架設的神器 Google Sites協作平台,為什麼這樣子說呢? 因為新手入門款以Google Sites協作平台練習,認識網站架設的基礎概念,接著再轉往進階班的Wordpress網頁設計。比較會循序漸進。 二來Google Sites協作平台網站架設費用…

使用docker搭建RocketMQ(非集群搭建官方镜像)

之前在使用 RocketMQ 官方的包在搭建的时候,发现好多问题,什么修改内存大小,然后启动 broker 报错,类似 service not available now, maybe disk full 等等… 最后决定还是重新用 docker 搭建下,感觉这样子玩坏了&…

MySQL数据库的数据备份与数据恢复

MySQL数据库的数据备份与恢复主要有3种方法,前两种都是MySQL dump命令,第三种则是用Navicat工具直接备份。相比而言,第三种方法更加简单! 1 方法一(MySQL dump命令) 1.1 登录MySQL [roothurys22 ~]# mysq…

优势分析- 性格测试

盖洛普 免费的人格测试 | 16Personalities [转][类似我] 某作者结合自己性格对盖洛普的推广_个人渣记录仅为自己搜索用的博客-CSDN博客 塞利格曼先生设计的优势测量表格.docx-全文可读 谁知道在哪里可以做盖洛普在线测试题? - 知乎 为什么强烈建议你做正版盖洛普…

【数据库数据恢复】raid5+Sql Server数据库数据恢复案例

数据库数据恢复环境: 5块磁盘组建RAID5,划分LUN供windows服务器使用; windows服务器上部署Sql Server数据库;操作系统层面划分了三个逻辑分区。 数据库故障&初检: 未知原因导致Sql Server数据库文件丢失&#xff…

【tippecanoe】Linux环境tippecanoe部署

Linux环境tippecanoe部署 1.简介2.安装部署2.1相关依赖2.2 sqlite 3.tippecanoe安装 1.简介 mapbox-gl支持矢量切片 ,其中tippecanoe是mapbox官方提供的一个开源矢量切片工具。tippecanoe支持mbtiles格式的数据生成。 工具tippecanoe的使用可以再linux进行&#xf…

优雅的接口防刷处理方案

前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 这里会通过逐步找问题,逐步去完善的形式展示 原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求,从Redis中统计用户访问接口次数从而达到接口防刷目的 …

《大师说栏目第一期》汽车以太网测试项那么多,到底该测啥呢?

#《大师说》栏目上线啦# 《大师说》栏目是怿星科技2023年推出的深度思考栏目,通过邀请内部专家,针对智能汽车行业发展、技术趋势等输出个性化的观点。每期一位大师,每位一个话题,本期由我们怿星以太网扛把子--邓伟,进行…

MetaERP系统主要干什么的,华为自研ERP的路子是否可以效仿?

近日,华为成功研发出自主可控的MetaERP系统,并完成了对旧有ERP系统的替换。该系统采用全栈自主可控技术,基于华为欧拉操作系统、GaussDB等根技术,采用云原生架构、元数据多租架构、实时智能技术等,提高业务效率&#x…

Trimble RealWorks处理点云数据(八)之点云导入houdini生成三维模型

步骤 1、las导入Trimble RealWorks 2、对点云数据预处理 可以参考这篇文章 TrimbleRealWorks点云数据预处理 我这边是做了一个新建坐标系以及0.02m的取样 3、导出pts格式 接下来的流程可以参考 https://learn.microsoft.com/zh-cn/dynamics365/mixed-reality/guides/3d-co…

5年测试老鸟总结,自动化测试的实施到落地,看这一篇足够...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

自然语言处理(NLP)在放射学报告评价中的应用:应用和技术进展

自然语言处理(NLP)在放射学报告评价中的应用:应用和技术进展 写在最前面摘要引言先进的技术BERT算法优点 Applications in Radiology 放射学应用Quality 质量将关键发现通知转诊临床医生放射科关键绩效指标和评估 个别放射科医生的表现同行学…

WRF模式的移植、运行、后处理及在多领域的应用

1、WRF模式的各个组成部分; 2、自主完成该模式的移植;3、自主完成模式运行; 4、自主完成模式后处理;5、通过多领域案例分析、实践,熟悉在多领域中的应用。 随着生态文明建设和“碳中和”战略的持续推进,我…

jmeter常用的命令行参数有哪些?常用的jmeter命令行如何编写

目录:导读 引言 一、JMete执行方式 二、JMete非GUI运行优点 三、jmeter非GUI运行参数 四、jmeter非GUI运行命令 4.1非GUI基本命令格式: 4.2非GUI并生成html报告基本命令格式 结语 引言 你是否在使用JMeter进行负载测试时感到手忙脚乱&#xff1…