JVM的内存分区以及垃圾收集

1.JVM的内存分区

1.1方法区

方法区(永久代)主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的

1.2虚拟机栈

虚拟机栈也就是我们平时说的栈内存,它是为java方法服务的。每个方法在执行的 时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。虚拟机栈是线程私有的,它的生命周期与线程相同。

1.3本地方法栈

本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务

1.4堆

java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。堆区由可划分为新生代、老年代和元空间三个区域。新生代是所有java对象出生的地方,也是垃圾回收最频繁的区域,新生代的对象大多都朝生夕灭,且Eden区和From、To区三个的比例为8:1:1。老年代是存储被长期使用的对象,元空间存储一些方法中操作的临时对象。

1.5程序计数器

内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数 器完成。该内存区域是唯一一个 java 虚拟机规范规定不会抛 OOM 错误的区域(OOM:Out Of Memory,内存用完)。

2.内存的回收策略

  1. 对象优先在Eden区分配
  2. 大对象由于需要大量连续的内存因此直接进入老年代
  3. 长期存活的对象直接进入老年代

3.垃圾收集方式

GC是garbage collection的缩写,意思是垃圾回收,把堆内存中不再使用的空间释放掉,清理不再使用的对象。

内存泄露:对象不被使用且没有被回收

内存溢出:申请内存时没有足够内存使用

3.1从范围上可划分为:

  • Minor GC:发生在新生代的垃圾收集动作
  • Major GC: 回收老年代垃圾
  • Full GC:收集整个java堆和方法区的垃圾

3.2具体的垃圾收集算法

(1)复制算法:

Minor GC一般就是使用复制算法,具体过程就是:把存活的对象复制到另外一块区域,然后把原来区域所有对象全部清除。

优点:效率高     缺点:需要内存容量大,比较耗内存,适用于占用空间小、刷新次数多的新生区

(2)标记清理:

具体操作就是将未使用的对象进行标记然后回收。但是收集效率比较低且容易产生内存碎片。

(3)标记整理:

标记整理就是在标记清理的基础上将内存碎片进行整理,虽然不会产生碎片,但是需要移动对象导致效率低速度慢。并且标记整理一般会和标记清理混合使用在老年代用于回收垃圾。

总的来说java回收垃圾采用了分区分代回收思想。

4.垃圾的判定

如何判定在内存中哪些对象是垃圾?

4.1引用计数器

简单来说就是看一个对象还有没有人用它。有地方用它计数器加一,用完了计数器减一,如果一个计数器为0说明是个死对象,就可以被回收了。有个缺陷就是无法解决循环引用问题,就是A引用了B,B也引用了A,直接套娃上了,计数器都为1无法进行垃圾回收,所以主流虚拟机一般不用这种算法

4.2可达性算法

从GCroot到一个对象间没有可到达的路径,则认为该对象不可访问,就可以进行垃圾回收,比如obj5和obj6

哪些对象可以作为GC Roots:

  • 栈中引用的对象
  • 类静态属性引用的对象
  • 常量引用的对象
  • Native方法引用的对象

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

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

相关文章

vue2项目vue-qrcode-reader 扫一扫二维码插件

vue2项目 vue-qrcode-reader 扫一扫二维码插件 问题所在解决办法成功展示 问题所在 今天在引导师弟做扫二维码功能,发现通过npm install --save vue-qrcode-reade安装死活就是报错TypeError: Object...) is not a function 解决办法 百度了很多大牛的博客&#…

LeetCode(61)删除链表的倒数第 N 个结点【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 删除链表的倒数第 N 个结点 1.题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例…

如何用Adobe Audition 检测波形的pop和卡顿

在Adobe Audition中,检测卡顿和pop的方法各有不同: 1. **检测卡顿**: - 使用“诊断”面板中的“删除静音”或“标记音频”选项可以帮助识别音频中的静音段落,这可能表明存在卡顿。 - 配置诊断设置,指定静音的振…

做数据分析为何要学统计学(10)——如何进行回归分析

​回归分析(regression analysis)是量化两种或两种以上因素/变量间相互依赖关系的统计分析方法。回归分析根据因素的数量,分为一元回归和多元回归分析;按因素之间依赖关系的复杂程度,可分为线性回归分析和非线性回归分析。我们通过…

VRP的优质解与劣质解的区别分析

关键词 数据挖掘 启发式 车辆路由问题 问题特定知识 文章概述 启发式算法是解决复杂组合优化问题时的首选武器。尽管大量的研究集中在对特定问题调整启发式,但很少有研究来研究问题本身的结构特征。 文章认为,关于区分组合优化问题的好解和不那么好解…

【面试】测试/测开(NIG2)

145. linux打印前row行日志 参考&#xff1a;linux日志打印 前10行日志 head -n 10 xx.log后10行日志 tail -n 10 xx.log tail -10f xx.log使用sed命令 sed -n 9,10p xx.log #打印第9、10行使用awk命令 awk NR10 xx.log #打印第10行 awk NR>7 && NR<10 xx.log …

【EI会议征稿】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2024&#xff09; 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;…

任务调度系统就该这么设计(万能通用),稳的一批!

今天来扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 核心概念 这里还是老样子&#xff0c;为了保证文章的完整性和连贯性&#xff0c;方便那些没有使用过的小伙伴更加容易接受文章的内容&#xff0c;快速讲一讲Xxl-Job中的概念和使用 如果你已经使用过了&#xf…

知识付费平台选择指南:如何找到最适合你的学习平台?

在当今的知识付费市场中&#xff0c;用户面临的选择越来越多&#xff0c;如何从众多知识付费平台中正确选择属于自己的平台呢&#xff1f;下面&#xff0c;我们将为您介绍我有才知识付费平台相比同行的优势&#xff0c;帮助您做出明智的选择。 一、创新的技术架构&#xff0c;…

【Spark精讲】Spark与MapReduce对比

目录 对比总结 MapReduce流程 ​编辑 MapTask流程 ReduceTask流程 MapReduce原理 阶段划分 Map shuffle Partition Collector Sort Spill Merge Reduce shuffle Copy Merge Sort 对比总结 Map端读取文件&#xff1a;都是需要通过split概念来进行逻辑切片&…

C++中的多态你真的了解吗?多态原理全面具体讲解

目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 C11 override 和 final 2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类 3.1 概念 4. 多态的原理 4.1 虚函数表 4.2多态的原理 4.3 动态绑定与静态绑定 5. 单继…

vscode的文件和文件夹的警告标志如何消去

由于平时用vscode写一些java的小demo, 但是这个vscode的警告和错误管理很奇怪, 这个警告信息会显示在这个侧边的文件和文件夹中, 我上网上找能不能把这个给去掉的办法, 找了半天没找到。 于是我就自己去查了一下这个vscode的设置, 真让我找到了这方面的开关, 把下面的这个关闭…