JVM 内存模型,垃圾回收,垃圾收集器

JVM完整详解:内存模型+垃圾回收算法+垃圾收集器+GC参数等 当然,随着可以使用的CPU的数量增加,它对于GC时系统资源的利用还是很有好处的。在我们垃圾回收的时候,我们往往将堆内存分成新生代和老生代(大小比例1:2),新生代中由Eden和Survivor0,Survivor1组成,三者的比例是8:1:1,新生代的回收机制采用复制算法,在Minor GC的时候,我们都留一个存活区用来存放存活的对象,真正进行的区域是Eden+其中一个存活区,当我们的对象时长超过一定年龄时(默认15,可以通过参数设置),将会把对象放入老生代,当然大的对象会直接进入老生代。 阅读详情

运行时数据区域:

线程共有:方法区、堆

方法区:用于存放已被加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

堆:所有的对象都在这里分配内存,是垃圾收集的主要区域,现代的垃圾收集算法都采用分代收集算法,可以将堆分为两块,新生代,老生代。不需要连续的内存,可以动态增加,增加失败会抛OOM异常。

线程私有:程序计数器,虚拟机栈,本地方法栈

程序计数器:记录正在执行的虚拟机字节码指令的地址

虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

本地方法栈:本地方法栈与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。

垃圾回收主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,线程结束之后就会消失。

垃圾收集器:

  1. Serial 收集器:串行收集,用一个线程进行垃圾收集,收集新生代
  2. ParNew 收集器: 是Serial收集器的多线程版本,收集新生代
  3. Parallel Scavenge收集器
    与 ParNew 一样是多线程收集器。
    其它收集器目标是尽可能缩短垃圾收集时用户线程的停顿时间,而它的目标是达到一个可控制的吞吐量,因此它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户程序的时间占总时间的比值。
    停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。
    缩短停顿时间是以牺牲吞吐量和新生代空间来换取的:新生代空间变小,垃圾回收变得频繁,导致吞吐量下降。
    可以通过一个开关参数打开 GC 自适应的调节策略(GC Ergonomics),就不需要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 区的比例、晋升老年代对象年龄等细节参数了。虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。
  4. Serial Old 收集器
  5. Parallel Old 收集器
  6. CMS收集器,用标记清楚算法
  7. G1收集器:G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能,新生代和老生代一起收集

垃圾收集算法

  1. 标记-清除
    在标记阶段,程序会检查每个对象是否为活动对象,如果是活动对象,则程序会在对象头部打上标记。
    在清除阶段,会进行对象回收并取消标志位,另外,还会判断回收后的分块与前一个空闲分块是否连续,若连续,会合并这两个分块。回收对象就是把对象作为分块,连接到被称为 “空闲链表” 的单向链表,之后进行分配时只需要遍历这个空闲链表,就可以找到分块。
    在分配时,程序会搜索空闲链表寻找空间大于等于新对象大小 size 的块 block。如果它找到的块等于 size,会直接返回这个分块;如果找到的块大于 size,会将块分割成大小为 size 与 (block - size) 的两部分,返回大小为 size 的分块,并把大小为 (block - size) 的块返回给空闲链表。
    不足:
    • 标记和清除过程效率都不高;
    • 会产生大量不连续的内存碎片,导致无法给大对象分配内存。
  2. 标记-整理
    让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
    优点:
    • 不会产生内存碎片
      不足:
    • 需要移动大量对象,处理效率比较低
  3. 复制
    将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。
    主要不足是只使用了内存的一半。
    现在的商业虚拟机都采用这种收集算法回收新生代,但是并不是划分为大小相等的两块,而是一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象全部复制到另一块 Survivor 上,最后清理 Eden 和使用过的那一块 Survivor。
    HotSpot 虚拟机的 Eden 和 Survivor 大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 就不够用了,此时需要依赖于老年代进行空间分配担保,也就是借用老年代的空间存储放不下的对象。
  4. 分代收集
    现在的商业虚拟机采用分代收集算法,它根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。
    一般将堆分为新生代和老年代。
    • 新生代使用:复制算法
    • 老年代使用:标记 - 清除 或者 标记 - 整理 算法

回收策略:

Minor GC 与 Full GC

  • Minor GC:回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。
  • Full GC:回收老年代和新生代,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。
Java GC(垃圾回收)机制知识总结 Java GC系列本部分来自Java GC系列(1):Java垃圾回收简介Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。下面四篇教程是了解Java 垃圾回收(GC)的基础: 垃圾回收简介 圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 这篇教 阅读详情

相关推荐

从零到一:用ROS2和Gazebo搭建Franka机械臂仿真环境(避坑指南)

本文详细介绍了如何使用ROS2和Gazebo从零开始搭建Franka机械臂的仿真环境,包括环境准备、ROS2包安装、控制器配置及常见问题解决方案。特别针对关节位置控制等核心功能提供了实用代码示例和避坑指南,帮助开发者高效构建机器人算法验证平台。

weixin_29061465的博客 458

JVM内存模型及垃圾收集器介绍

一、JVM的内存模型 Metaspace:Class、Package、Method、Field、字节码、常量池、符号引用等 CCS:32位指针的Class,没开启短指针压缩的话不会有这个。-XX:+UseCompressedClassPointers CodeCache:JIT编译后的本地代码,JNI使用的C代码。开启编译执行才有。-Xint=解释执行。 运行时数据区 程序计数器PC Register JVM支持多线程同时执行,每一个线程都有自己的程序计数器,线程正在执行的方法叫做当前方法,如果是Java

叭嘣的博客 516

ANSYS Discovery 2023R1 保姆级教程:手把手教你玩转几何模型参数化(附避坑指南)

本文提供ANSYS Discovery 2023R1几何模型参数化的全面教程,涵盖基础环境搭建、核心操作解析及高级应用场景。重点讲解参数化建模中的常见问题与避坑方案,帮助用户高效掌握Workbench与Discovery的协同使用技巧,提升工程仿真效率。

weixin_29204205的博客 749

JVM知识梳理(三) JVM常见垃圾回收器解析

前言 什么是垃圾回收器? 之前我们介绍过JVM的垃圾回收算法,标记-清除、标记-压缩、复制算法,都是逻辑上能够实现的一些理论,而垃圾回收器就是这些算法的具体实现方案,真正回收垃圾也就是垃圾回收器,不同的JDK版本默认使用的垃圾回收器也存在不同。 常见的垃圾回收器有哪些? 共7个,Serial垃圾收集器、Serial Old垃圾收集器、ParNew垃圾收集器、Parallel Scavenge垃圾收集器、Parallel Old垃圾收集器、CMS垃圾收集器、G1垃圾收集器。 如何查看当前JDK版本的垃圾回收器

阳光大男孩!!!的博客 1702

UI渲染顺序:合批为何被拆碎?

在 Hierarchy 中,避免出现:Image(列表1) → Text(列表1) → 特效 → Image(列表2) → Text(列表2)…若可行,在逻辑上把布局组织成“同类元素集中”:例如:列表行中,Image 集中、Text 集中;或者接受 Text 本身就拆出一批,关键是不要在 Text 中间再插入别的材质。现实中不一定能做到完美的“所有 Image 连在一起”,但你会有一个意识:同一 Canvas 内,如果你把不同材质的元素交错穿插,

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 84

量化交易 米筐 多因子合成(回测中使用)

多因子合成 1、因子合成 将一些相关(高、低)的因子合成一个因子 方法: 使用PCA方式(使用于较强相关性) 2、核心代码 将因子 inc_revenue_ttm 和 operating_revenue_growth_ratio_ttm 合成为一个因子 inc_operating from sklearn.decomposition import PCA pca = PCA(n_components=1) # 因子合并 fund['inc_operating'] = pca.fit_transform(fu

廷益_飞鸟的博客 1062

JVM内存模型及垃圾回收器

JVM 什么是JVM? 定义: JVM - Java Virtual Machine (java程序的运行环境) 优点: 一次编译,到处运行,跨平台 自动内存管理,垃圾回收功能 数组下标越界检查 JVM,JRE.JDK 三者之间的关系 JDK JDK (Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm

my_air的博客 334

基于matlab的主成分分析的人脸二维码识别系统

人脸识别因其在系统安全验证、信用验证、刑侦跟踪、身份管理、视频会议、人机交互、智能家居等方面的巨大应用前景,成为当前模式识别和人工智能领域越来越热门的一个研究方向。随着安全入口控制和二维码智能扫描应用需求的快速增长,基于二维码识别的生物人脸统计识别技术也引起了人们的重视。本案例将详细讲解基于主成分分析的人脸特征提取的原理与方法,并将其与 QR 二维码的编解码进行结合,将 MATLAB 作为工具平台,调用 QR 二维码编解码应用程序,进而实现一个人脸二维码自动识别的系统原型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 976

JVM 常见垃圾收集器介绍

垃圾收集器如何演化的? 垃圾收集器的发展路线,简单来说是随着内存越来越大而发生变化。 从分代算法逐渐演化为不分代算法。 从serial的几十兆,逐渐演化到parallel的几个G,再到CMS的几十个G,也从此开始了并发回收。 年轻代收集器 Serial 特点:年轻代、串行回收、STW、简单高效 Serial(串行)收集器是最基本、发展历史最悠久的收集器,它是采用复制算法的新生代收集器,曾经(JDK 1.3.1之前)是虚拟机新生代收集的唯一选择。 在垃圾回收时,必须暂停其他所有线程的工作线..

m0_58554082的博客 323

YOLOv11 模型改进全流程:从代码修改到性能跃升,让你打造专属检测利器

无论是科研中需要发表创新点满满的论文,还是企业里要解决特定场景的检测难题,这套方法都能让你在YOLOv11的基础上打造出“量身定制”的检测模型。别再让通用模型的“平庸性能”限制你的项目上限——现在就动手修改代码,让你的YOLOv11模型在精度、速度或小样本适应能力上实现跨越式提升,用技术突破证明你的AI研发实力!本文将带你从代码层面入手,完成从骨干网络到损失函数的全维度改进,真正掌握让YOLOv11“为你所用”的技术实力。该改进对小样本类别(如数据集中仅占5%的“稀有缺陷”)的识别精度提升显著。

m0_71589036的博客 402

银行统一监管报送系统

依据《银行业金融机构数据治理指引》,银行业金融机构应当建立适应监管数据报送工作需要的信息系统,实现流程控制的程序化,提高监管数据加工的自动化程度。银行业金融机构应当将监管数据纳入数据治理,建立工作机制和流程,确保监管数据报送工作有效组织开展,监管数据质量持续提升。银行通常要对接报送EAST5.0、1104、CRSS等近40个监管应用,涉及近1000张报表。表13-01是主要的监管报送应用、报送依据、报送规范、监管机构名称。

银行信息系统应用架构详解 4347

JVM jvm内存模型 垃圾回收机制 垃圾收集器 jvm调优工具 GC日志 JVM调优实战

1、 (1)、JVM内存模型 1、程序计数器 程序计数器(Program CounterRegister)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器. 2、Java 虚拟机栈 重要 与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame①)用于存储局部变量表、操作栈、动态链接、方

AdamCafe的博客 273

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 303

JVM内存模型、垃圾回收算法、垃圾收集器

JVM内存模型、垃圾回收算法、垃圾收集器JVM内存模型程序计数器(PC寄存器,线程私有)虚拟机栈(线程私有)本地方法栈(线程私有)堆(Heap- 线程共享)新生代Eden 区From Survivor 区To Survivor 区MinorGC 的过程(采用复制算法,复制->清空->互换)老年代方法区(非堆,线程共享)垃圾回收与算法如何确定垃圾引用计数法可达性分析(根搜索法)垃圾回收算...

ma815841356的博客 630

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM的内存模型、对象创建、对象内存分配、对象内存回收、cms垃圾收集器

本文主要介绍JVM的内存模型、JVM对象创建、JVM对象内存分配、JVM对象回收本文主要讲解1.JVM的内存模型的概念和内存模型内各个分区的概念以及所存储的数据和JVM的参数设置。2.区分对象创建过程和类加载过程的关系3.对象内存分配的方法和对象内存分配节省空间的方法,以及内存分配流程及减少full gc的优化手段。4.对象内存回收的方法。

三旬的博客 351

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【死磕JVM】这可能是最全的JVM面试题了

1. 描述一下jvm内存模型,以及这些空间的存放的内容 ? 2.堆内存划分的空间,如何回收这些内存对象,有哪些回收算法? 垃圾回收算法: 标记清除、复制(多为新生代垃圾回收使用)、标记整理 3.如何解决线上gc频繁的问题? 查看监控,以了解出现问题的时间点以及当前FGC的频率(可对比正常情况看频率是否正常) 了解该时间点之前有没有程序上线、基础组件升级等情况。 了解JVM的参数设置,包括:堆空间各个区域的大小设置,新生代和老年代分别采用了哪些垃 圾收集器,然后分析JVM参数设置是否合理。

牧小农 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM——运行时数据区、双亲委派模型、垃圾回收算法、垃圾收集器、Java内存模型

JVM中,运行时数据区、双亲委派模型、垃圾回收算法、垃圾收集器、Java内存模型

weixin_54342360的博客 1138

JVM的垃圾回收机制

(默认的大小分配是8:1:1),其中,Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活的对象将被移动到老年代。这时因为并发标记与重新标记阶段都是从灰色对象开始遍历,而C没有与任何一个灰色对象连接,所以C不会被标记,会被当成垃圾回收,这时候问题就很严重了,应为A还引用了C呢,在业务层面需要C对象,这必然会导致严重的事故。

release_lonely的博客 2034

JVM——垃圾回收

在JVM中,“垃圾”指的是那些不再被使用的对象。具体来说,如果一个对象不能通过程序中的任何引用链从GC Roots到达,那么这个对象就被认为是垃圾。

weixin_69032308的博客 883

垃圾oracle_JVM 面试深入理解内存模型和垃圾回收(二)

JVM 面试深入理解内存模型和垃圾回收(二)1. 运行时数据区域1.1 The PC Register1.2 Java Virtual Machine Stacks1.3 Heap1.4 Method Area1.5 Run-Time Constant Pool1.6 Native Method Stacks2. 内存模型2.1 引用2.2 Java对象内存模型3. 垃圾回收3.1 如何...

weixin_39887961的博客 184

JVM 面试深入理解内存模型和垃圾回收(二)

JVM 面试深入理解内存模型和垃圾回收(二) 文章目录JVM 面试深入理解内存模型和垃圾回收(二)1. 运行时数据区域1.1 The PC Register1.2 Java Virtual Machine Stacks1.2.1 Frames1.2.2 结合字节码指令理解栈帧1.3 Heap1.4 Method Area1.5 Run-Time Constant Pool1.6 Native Method Stacks2. 内存模型2.1 引用2.2 Java对象内存模型2.2.1 对象创建的过程2.2.2

架构探险之道 992

JVM-内存模型与垃圾回收

本文转载:https://blog.youkuaiyun.com/weixin_45676630/article/details/105799329 但没有转载完全,gc算法之前已经写过了 1.内存模型 1.1 JVM 运行时内存 Java 堆从GC 的角度可以细分为: 新生代(Eden 区、From Survivor 区和To Survivor 区)和老年 代。 1.1.1 young区 是用来存放新生的对象。一般占据堆的1/3 空间。由于频繁创建对象,所以young区会频繁触发MinorGC 进行垃

a_higher的博客 233

JVM 性能调优与垃圾回收机制

在 Java 应用开发中,JVM(Java 虚拟机)如同幕后的 “大管家”,管理着内存分配、对象生命周期以及程序的执行效率。深入理解 JVM 的内存模型与垃圾回收机制,并掌握 JVM 性能调优的技巧,对于开发高效、稳定的 Java 应用至关重要。本文将全方位剖析 JVM 内存模型、垃圾回收算法、主流垃圾收集器,以及 JVM 调优的实战方法。

lrh35的博客 1684

JVM复习(一):JVM内存模型、HotSpot虚拟机对象、垃圾回收算法、垃圾收集器、内存分配与回收策略

一、JVM内存模型 JVM运行时数据区域分为线程独占区和线程共享区,线程独占区包括虚拟机栈、本地方法栈、程序计数器,线程共享区包括堆和方法区 1、堆 堆是JVM内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Survivor和To Survivor...

hxt的博客 1041

详解 JVM Garbage First(G1) 垃圾收集器

前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估。本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比;然后通过G1的内存模型、G1的活动周期,对G1的工作机制进行了介绍;同时还在介绍过程中,描述了可能需要引起注意的优化点。笔...

ChengYanan的博客 437
上一篇: LeetCode 面试金典 面试题 02.08. 环路检测
下一篇: Leetcode 201. 数字范围按位与
wenkun97
博客等级 码龄10年 15粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值