Jvm知识点

新生代 老年代 元空间

在Java虚拟机(JVM)中,“新生代”和“老年代”是堆内存的两个不同区域,而“元空间”则是一个用于存储类元数据的区域。

  • 新生代(Young Generation):

新生代主要存放的是新创建的对象。它又分为三个部分:
Eden区:大部分新对象会首先分配在这里。
两个Survivor区:它们被称为S0和S1,在垃圾回收过程中用来存放从Eden区复制过来的存活对象。
新生代的特点是对象存活时间较短,垃圾回收频繁,使用的是Minor GC(小型垃圾回收)。

  • 老年代(Old Generation):

老年代存放的是生命周期较长的对象。经过多次垃圾回收后,存活下来的对象会被移动到老年代。
当老年代的内存空间不足时,会触发Major GC或Full GC(完全垃圾回收)。老年代的垃圾回收次数较少,但每次回收都可能更加耗时。

  • 元空间(Metaspace):

元空间存储的是类的元数据,比如类的结构信息、方法信息等。元空间取代了JVM早期的永久代(PermGen),它不再使用堆内存,而是直接使用本地内存。
元空间的大小默认是动态调整的,但也可以通过JVM参数进行限制。

垃圾回收算法

  1. 标记-清除算法(Mark-and-Sweep)

标记阶段:遍历堆中的所有对象,标记出哪些对象是可达的(即程序中仍然被引用的对象)。
清除阶段:清理掉所有未被标记的对象,即不再使用的对象。
缺点:
可能会产生内存碎片,因为清除后的空间并不连续。
需要额外的时间来遍历整个堆和清理无用对象。

  1. 复制算法(Copying)

将内存分为两个区域(通常是“From”和“To”区),每次只使用一个区域。当一个区域满了时,复制存活的对象到另一个区域,并清空当前区域。
复制算法解决了标记-清除算法的内存碎片问题。
优点:
没有内存碎片。
复制时速度较快。
缺点:
需要两倍的内存空间,因为需要维护两个区域。
对象复制操作会带来额外的性能开销。

  1. 标记-整理算法(Mark-Compact)

标记阶段:与标记-清除算法相同,标记出可达对象。
整理阶段:对标记的存活对象进行压缩,所有存活对象移动到堆的一端,腾出的空间将被回收。
优点:
解决了内存碎片的问题。
缺点:
移动对象会带来一定的性能开销,尤其是在老年代中对象比较多时。

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

这是Java垃圾回收中最常用的算法。它基于对象的生命周期分为新生代和老年代。
新生代:大多数对象很快会变得不可达,因此使用复制算法(如Minor GC)来回收新生代。
老年代:较少的对象会存活较长时间,因此使用标记-整理算法或标记-清除算法来回收老年代。
优点:
通过将对象分代来提高效率,因为大多数对象会在新生代中快速死亡,减少了垃圾回收的开销。
新生代和老年代分别采用不同的回收策略,优化了内存使用。

  1. 垃圾回收器的种类

Serial GC:单线程的垃圾回收器,适合单核处理器或低内存的环境,采用复制算法。
Parallel GC:多线程的垃圾回收器,适用于多核处理器,使用并行方式处理新生代的垃圾回收。
CMS (Concurrent Mark-Sweep) GC:并发标记-清除算法,能够在应用程序运行时进行垃圾回收,减少停顿时间,但会导致内存碎片问题。
G1 (Garbage-First) GC:相较于CMS,G1 GC采用分区化的方式进行垃圾回收,能够更精确地控制停顿时间,适合大内存环境。
ZGC和Shenandoah GC:这些是低延迟的垃圾回收器,旨在最大限度地减少GC暂停时间,适用于低延迟要求较高的应用。

通过这些算法的结合使用,JVM可以在执行期间自动进行垃圾回收,优化内存管理和程序性能。

两个Survivor区的区别

在Java虚拟机(JVM)中新生代(Young Generation)内存区域中,有两个Survivor区,分别称为S0(Survivor 0)和S1(Survivor 1)。这两个区域的作用基本相同,它们之间的区别在于它们的用途和在垃圾回收过程中的角色。

Survivor区的基本概念

新生代的内存划分包括以下三个区域:
Eden区:新创建的对象首先分配到Eden区。
Survivor 0区(S0):存放从Eden区存活下来的对象。
Survivor 1区(S1):存放经过多次垃圾回收后仍然存活的对象。
在一次垃圾回收周期中,Eden区中的存活对象会被复制到Survivor 0区(S0),而S0区中的存活对象在下一轮回收时会被复制到S1区,依此类推。

S0区和S1区的区别

  • 用途:

S0区和S1区都是用来存放从Eden区存活下来的对象的。
在每次Minor GC(新生代垃圾回收)时,这两个Survivor区会交替作为存储区域。

  • 角色交替:

在一次垃圾回收后,S0区中的存活对象会被复制到S1区,并且下一次垃圾回收时,S1区会充当"From"区,S0区会作为"To"区,存放存活的对象。
每次垃圾回收后,S0和S1会交换角色,确保对象在这些区之间轮换,以避免内存碎片。

  • 内存分配:

S0区和S1区的大小在JVM启动时通常是相等的,可以通过JVM参数进行调整。具体的分配和使用策略取决于JVM实现。

  • 垃圾回收过程:

Minor GC:新生代的垃圾回收过程通常涉及Eden区和其中一个Survivor区(比如S0)的交替使用。存活的对象会被复制到另一个Survivor区(S1)。这样可以减少对象的复制和内存碎片。
老年代的回收(Major GC):老年代的垃圾回收不会涉及这两个Survivor区,而是会处理长时间存活的对象。

  • 总结

S0和S1的主要区别在于它们在不同的垃圾回收周期中分别作为存活对象的存储区域,它们的角色是交替的。
在垃圾回收中,Eden区的存活对象会被复制到一个Survivor区,下一次回收时,另一个Survivor区会变成目标区,这样通过交替的方式管理对象的生命周期。
这种设计使得新生代中的对象在回收时更加高效,并且避免了较大的内存碎片问题

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

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

相关文章

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一,Maven的概述 Maven的作用:专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提…

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上,给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上,打开 服务,找到VMware DHCP和VMware NAT,把这两个服务打开,专一般问题就…

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的:学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号:这是电子元器件的图形表示,用于在原理图中表示特定的元器件。例…

向量数据库FAISS之一:官方简单教程

1.安装 1.conda安装 # CPU-only version --> Linux (x86_64 and arm64), OSX (arm64 only), and Windows (x86_64) $ conda install -c pytorch faiss-cpu1.8.0# GPU(CPU) version --> Linux (x86_64 only) for CUDA 11.4 and 12.1 $ conda install -c pytorch -c nvid…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1: 本月11号官宣:针对所有人免费提供,包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后,双击默认安装即可: 一路单击下一步按钮: 等待…

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…

transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景

随着大模型的广泛应用,越来越多的开发者希望在前端直接运行机器学习模型,从而减少对后端的依赖,并提升用户体验。Transformer.js 是一个专为前端环境设计的框架,它支持运行基于 Transformer 架构的深度学习模型,尤其是…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么? HTTP 是超文本传输协议(HyperText Transfer Protocol),一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些? …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式?二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图: 模板方法设计模式类图 一.什么是模板方法模…

力扣 LeetCode 235. 二叉搜索树的最近公共祖先(Day10:二叉树)

解题思路: 方法一:递归 递归法没有中的逻辑 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return recur(root, p, q);}public TreeNode recur(TreeNode root, TreeNode p, TreeNode q) {if (root…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限,并且插入和删除操作效率低的问题 1.2概念 链表:链式存储的线性表,使用随机物理内存存储逻辑上连续的数据 链表的组成:由一个个结点组成 结点:由数据域和链接域组成&a…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

Flink Lookup Join(维表 Join)

Lookup Join 定义(支持 Batch\Streaming) Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维…

LeetCode 101题集(随时更新)

题集来源:GitHub - changgyhub/leetcode_101: LeetCode 101:力扣刷题指南 使用C完成相关题目,以训练笔试 贪心 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候,需要用到百度站长平台(资源平台)的工具,在站长工具中【普通收录】-【资源提交】-【API提交】这个功能,对网站的抓取进行一个提交。 这里估计很多站长就有疑问,如果我主动推送&#xf…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具,是由JAVA开发而成 2. Jenkins是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature,AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了,这次瞄准了量子计算领域。 今天凌晨,新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中,提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途,提取声音都能为我们带来诸多便利。怎么只提取视频中的声音?本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好,我是小徐啊。我们在开发Java项目(Springboot)的时候,一般都是会设置好对应的编码格式的。如果设置的不恰当,容易造成乱码的问题,这是要避免的。今天,小徐就来介绍下我们如何在IDEA…