JVM的内存模型和垃圾回收

news2024/11/17 23:36:41

JVM内存区域

内存模型图:


线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。

它的目的是存放对象实例。同时它也是GC所管理的主要区域,因此常被称为GC堆,又由于现在收集器常使用分代算法,Java堆中还可以细分为新生代和老年代

Java堆可以存在物理上不连续的内存空间,就像磁盘空间只要逻辑是连续的即可。它的内存大小可以设为固定大小,也可以扩展。

主流的虚拟机如HotPot都能按扩展实现(通过设置 -Xmx和-Xms),如果堆中没有内存,完成实例分配,而且堆无法扩展将报OOM错误(OutOfMemoryError)


方法区

存储类对象

方法区是被所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。

什么是JIT-CSDN博客

通过反射获取到的类型、方法名、字段名称、访问修饰符等信息就是从方法区获取到的。在使用到CGLib对类进行增强时,增强的类越多,就需要越大的方法区类存储动态生成的Class信息,当存放方法区数据的内存溢出时,会报OutOfMemoryError异常。


栈区,在方法结束自动清空,又可细分为:

程序计数器

程序计数器,又叫PC寄存器,是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器

程序计数器?

为了线程切换可以恢复到正确执行位置,每个线程都需有独立的一个程序计数器,不同线程之间的程序计数器互不影响,独立存储。

虚拟机栈

线程私有,生命周期与线程相同,就是我们平时说的栈,栈描述的是Java方法执行的内存模型。

每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接(对象的内存地址),方法出口(返回值的内存)等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈(JVM执行本地方法)

本地方法栈是与虚拟机栈发挥的作用十分相似,区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++,我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。

  • 动态链接: 每个栈帧都保存了 一个 可以指向当前方法所在类的 运行时常量池, 目的是: 当前方法中如果需要调用其他方法的时候, 能够从运行时常量池中找到对应的符号引用, 然后将符号引用转换为直接引用,然后就能直接调用对应方法, 这就是动态链接
  • 不是所有方法调用都需要动态链接的, 有一部分符号引用会在类加载解析阶段, 将符号引用转换为直接引用, 这部分操作称之为: 静态解析. 就是编译期间就能确定调用的版本, 包括: 调用静态方法, 调用实例的私有构造器, 私有方法, 父类方法

垃圾回收

Garbage Collection(GC)

判断对象已死

1.引用计数算法

引用计数算法是在对象中加入一个计数器,当对象被引用,计数器+1,当引用失效,计数器-1,当计数器的值编程0,就是没有任何一个变量来引用这个对象,那么这个对象就是垃圾

这种算法实现简单,效率高,但是有一个严重的问题会导致内存泄漏,那就是对象之间循环引用,比如说A对象持有B对象的引用,B对象持有A对象的引用,那么A和B的计数器值永远>=1,也就是说这两个对象永远不会被回收,这是一堆垃圾。

内存溢出:指程序在运行过程中,因为申请的内存超过了可用的内存空间而导致程序崩溃或异常结束。java程序内存不够,程序就结束了,OOM

内存泄漏:指程序在运行过程中,申请的内存空间无法被回收或释放,导致系统中的可用内存逐渐减少,最终耗尽可用内存。

2.可达性分析算法(Java使用的这一种)

Java中定义了一些起始点,称为GC Root(正在使用的对象或量),当有对象引用它的时候,就把对象挂载在它下面,形成一个树状结构,当一个对象处于一个这样的树里时,就认为此对象是可达的,反之是不可达

GC ROOT 四种对象:

  1. 虚拟机栈中引用的对象
  2. 方法区类的静态成员引用的对象
  3. 方法区常量引用的对象
  4. 本地方法栈中JNI(Java Native Interface的缩写)引用的对象

垃圾收集算法

1.标记清除(Mark-Sweep)

算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象(引用计数法或者可达性分析),在标记完成后统一回收掉所有被标记的对象。它是最基础的收集算法,后续的收集算法都是基于这种思路并对其缺点进行改进而得到的

它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。


2.标记复制(Copying)

复制算法在标记清除算法的基础上,针对内存碎片问题做了一下优化,此算法把内存分为大小相同的两块,每次在使用的时候只使用其中的一块。当一块内存用完的时候。把存活对象复制到另外的一块中,然后清除当前这块中的所有的对象,如此反复。

缺点:使用当前算法,解决了内存碎片化严重的问题,但是存在缺陷就是每次只使用一半的空间,空间利用率受到影响。同时对于存活周期长的对象,复制次数多

复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。


3.标记整理(Mark-Compact)

也叫标记压缩法

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,缺点是时间稍慢


4.分代收集算法(Generational Collection)

GC分代的基于一个假设:绝大部分对象的生命周期都非常短暂,存活时间短。

“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

永久代,指方法区,这里不做讨论。

新生代,又分为伊甸园区和幸存区,使用标记复制算法。所有new出来的对象,都先存入伊甸园区,较大的对象伊甸园区可能没有足够的空间,可能会直接放到老年代区。

幸存区又可分为工作区和等待区,当伊甸园区存满垃圾回收(minorGC),会将伊甸园区域和幸存区的工作区A进行标记,将不是垃圾的对象,复制到幸存区的等待区B,之后B区就是工作区,A区变成等待区。

当对象经过多次(15次)新生代垃圾回收,依然存活,这个对象就会存入老年代。

如果老年代满了(触发FullGC,将老年代和新生代一起GC),会进行垃圾回收,使用标记整理(压缩)算法。

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

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

相关文章

纷享销客AI能力在线索精细化管理中的应用与实践

1、智能评分提高线索转换效率 企业可以经过后台模型配置,和对近1-2年内线索的相关属性进行整理分析,纷享销客AI可以总结出历史相似线索的转换概率,使销售人员可以集中精力在更容易转换的线索上,提高转化效率。 纷享销客AI的智能…

pdf如何转换为jpg图片?这几种转换方法简单又实用!

pdf如何转换为jpg图片?PDF,这一广泛应用于文档传输与存储的格式,虽极大地促进了信息的电子化流通,但在日常办公实践中,也逐渐显露出其局限性,尤其是在文件管理与网络分享方面,PDF的庞大体积常导…

fastadmin 时间选择器可选择具体的时分秒

预期要达到的样式,时间区间可以直接选择具体的时分秒 找到这个文件require-form.js 在pulic/assets/js 下面 找到datetimepicker 属性 设置为true var options {timePicker: true,autoUpdateInput: false,timePickerSeconds: true,timePicker24Hour: true,autoApply: true,lo…

Llama 3.1 70B与Mistral Large 2 128B深度对比

在人工智能的浩瀚宇宙中,两颗新星正在引发行业内的轰动。Meta 的 Llama-3.1-70B 和Mistral Large-2-128B,这两大 AI 巨头以其前所未有的计算能力和复杂性,正引领着智能算法的新浪潮。它们不仅仅是技术的集大成者,更是未来可能性的…

基于微信小程序的点餐小程序/基于微信小程序的订餐系统设计与实现

微信点餐小程序 摘 要 随着互联网技术不断地发展,网络成为了人们生活的一部分,而点餐系统作为网上应用的一个全新的体现,由于其特有的便捷性,已经被人们所接受。目前主流的点餐服务不仅不明确并且管理员管理起来不容易&#xff0…

公司最大的内卷,偷偷做单元测试

一位读者在看过我的《理解这八大优势,才算精通单元测试》后,问我:知道单元测试有好处,但实在没空写。看完文章后又想重新落实一下,有没有啥写好单元测试的技巧? 这位读者绝对不是第一个和我抱怨单元测试的…

安卓窗口window无法移除屏幕外超过屏幕边界?-wms源码层面深入剖析

背景 学习了上一节的窗口位置变化相关的内容后,在窗口移动过程过程中发现有一个限制问题,大家可以看一下如下动态图: 已经尽力把窗口想要拖到屏幕外面,但是一直拖到不生效,只能在屏幕内部进行移动,这个到…

智能叮咚门铃的功能,开启未来家居安全新篇章

在科技日新月异的今天,智能家居产品正逐步渗透到我们生活的每一个角落,其中,智能叮咚门铃作为家庭安防与便捷生活的重要一环,正经历着前所未有的功能升级与变革。 一、高清夜视,全天候守护 全新智能叮咚门铃配备了高清…

芒果/充电桩系统云快充1.5底层协议源码(源码)

充电桩系统云快充1.5底层协议源码(源码) 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议,版本为云快充1.5,对于没有对接过…

网上都是Python淘汰了!Python没用了!为什么都看不上Python?

最近,看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣,劝小白学这个语言别学那个语言,这对小白来说是毫无意义的。 但是它又具有极强的一个误导性。 针对“Python没用了?马上就要被淘汰啦?为什么这么多…

8月22日笔记

解决centos7本地服务器刚安装之后yum install -y wget出现问题情况 首先网络能ping得通,然后就是yum命令会出问题,网上很多方法都是用wget命令来解决的,但是本身就没有wget,我怎么解决😅。还有就是改/etc/sysconfig/n…

推荐并整理一波vscode插件(哪些内置了,哪些好用)

文章目录 背景现在还在用的(21款)Chinese(Simplified)简体中文Chinese LoremLorem ipsumCode Runner(很推荐)Codeium: AI Coding Autocomplete(推荐)Draw.io IntegrationESLintHighlight Matching TagJavaS…

Window访问Linux目录权限问题

Linux 上已经安装 了 samba 服务,但有时会发现从window上无法打开一些目录,点击后没有反应也没有弹窗提示,如: 而且当用 sourceinsight 添加文件时,这些目录下也搜索不到任何文件,其原因是目录权限问题。注…

AI绘图 | Stable Diffusion教程,零基础上手(附最新最全安装包)

前言 通过Stable Diffusion技术,一个人可以毫不费力地实现令人惊叹的AI绘图,让创意和想象力跃然纸上。这项技术运用先进的深度学习模型,将简单的文字描述转化为精美绝伦的艺术作品。无需深厚的绘画功底或昂贵的设备,只需输入一段…

开放式耳机哪个品牌好?分享四款开放式蓝牙耳机排行榜前十名

我相信很多人都会有这些问题,不知道入手什么蓝牙耳机品牌、有线耳机不好收纳、有线耳机不方便携带、蓝牙耳机听歌的音质怎么样、蓝牙耳机是否会对大脑有危害、蓝牙耳机有什么品牌型号推荐以及想要不同价位的蓝牙耳机品牌推荐参考,okok问题也是很多&#…

【数据结构】关于快速排序,归并排序,计数排序,基数排序,你到底了解多少???(超详解)

前言: 🌟🌟Hello家人们,这期继续讲解排序算法的原理,希望你能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/g7PyB 🌈感兴趣的小伙伴看一看小编主页:GGBondlct…

每日OJ_牛客_因子个数(简单模拟)

目录 牛客_因子个数(简单模拟) 解析代码 牛客_因子个数(简单模拟) 因子个数__牛客网 解析代码 题意就是求一个数字的因子(>2的最小不能整除数字)个数:可以从最小因子2到数字的最大因子数&…

Git基础学习(二)

文章目录 一. Git方式的基本概念二. Git的使用方式三. Git的常规操作1. 创建版本库(本地仓库)2. 设置用户信息配置1> 查看git的配置列表a. 全局变量b. 局部变量c. 修改对应文件进行配置d. 有个别仓库需要配置成其他用户信息,可进入目标仓库所在文件,e…

Python 如何使用 itertools 模块

itertools 是 Python 中一个非常有用的模块,它提供了许多用于处理迭代器的函数工具。itertools 模块中的函数可以用于生成复杂的迭代器,以支持各种组合、排列和计数操作。 1. 什么是 itertools? itertools 是 Python 的标准库模块&#xff…

自闭症学校收多大儿童?让每个孩子都能获得关爱

在星贝育园,我们深知每一个自闭症儿童都是家庭的希望与未来,他们虽然面临独特的挑战,但同样值得拥有爱与关怀。因此,我们敞开怀抱,欢迎2至20岁的自闭症儿童加入我们的大家庭,让每个孩子都能在这里找到属于自…