Java虚拟机 -- 垃圾收集器

2023-11-10

介绍垃圾收集器之前先要了解三个知识点:

  • Stop-the-World
    • JVM由于要执行GC而停止应用程序的执行
    • 任何一种GC算法中都会发生
    • 多数GC优化通过减少Stop-the-world发生的时间来提高程序性能
  • Safepoint(安全点):程序执行时并非在所有的地方都能停顿下来开始GC,只有在到达安全点时才可以停止GC。
    • 分析过程中对象引用关系不会发生变化的点
    • 产生Safepoint的地方:方法调用,循环跳转,异常跳转
    • 安全点的数量要适中,不能太少而导致GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。
  • JVM的运行模式
    • Server:启动较慢,但是进入到运行稳定期后,运行速度更快,这是因为Server启动的是重量级的虚拟机,对程序进行了更多的优化
    • Client:启动较快,启动轻量级虚拟机
    • java -version 查看使用哪种虚拟机

 

新生代垃圾收集器

Serial收集器(-XX:+UseSerialGC,复制算法)可以指定年轻代的垃圾回收器

  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单而高效,Client模式下默认的年轻代收集器

ParNew收集器(-XX:+UseParNewGC,复制算法)

  • 多线程收集,其余行为,特点和Serial收集器一样
  • 单核执行效率不如Serial,在多核下执行才有优势
  • 默认开启的收集线程数与CPU数量相同

Parallel Scavenge收集器 -- 吞吐量优先收集器(-XX:UseParallelGC,复制算法)

  • 吞吐量 = 运行用户代码时间 /(运行用户代码时间+垃圾收集时间)
    • CPU用于运行用户代码的时间与CPU总消耗时间的比值,比如,虚拟机总共运行了100分钟,其中垃圾回收花费1分钟,那吞吐量就是99%。
  • 比起关注用户线程停顿时间(CMS等收集器,停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验),更关注系统的吞吐量(能更好的利用CPU,适合在后台运行,而不需要太多交互)
  • 在多核下执行才有优势,Server模式下默认的年轻代收集器
  • GC自适应调节策略
    • -XX:+UseAdaptiveSizePolicy 通过打开该参数可以让收集器根据当前系统的运行情况自适应的调节最合适的停顿时间或者最大吞吐量

老年代垃圾收集器

Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)

  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单高效,Client模式下默认的老年代收集器

Parallel Old收集器 JDK6 (-XX:+UseParallelOldGC,标记-整理算法)

  • 多线程,吞吐量优先
  • 经常与Parallel Scaveng配合使用与注重吞吐量以及CPU敏感的场合

CMS收集器 并发收集,低停顿(-XX:+UseConcMarkSweepGC,标记-清除算法) 注重服务器的响应速度

执行流程:

  • 初始标记:stop-the-world
  • 并发标记:并发追溯标记,程序不会停顿
  • 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
  • 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
  • 并发清理:清理垃圾对象,程序不会停顿
  • 并发重置:重置CMS收集器的数据结构

缺点:

  • 会产生空间碎片,CMS提供一个 -XX:+UseCMSCompactAtFullCollection 开关参数(默认是开启的),用于在CMS收集器不要进行FullGC时开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片问题没有,但停顿时间就会变长。
  • 浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然会有新垃圾产生,这部分垃圾得标记过程之后,所以CMS无法在当收集中处理掉他们,只好留待下一次GC清理掉,这一部分垃圾称为浮动垃圾。在jdk1.5默认设置下,CMS收集器当老年代使用了68%的空间就会被激活,可以通过-XX:CMSInitialOccupancyFraction的值来提高触发百分比,在jdk1.6中CMS启动阈值提升到了92%,要是CMS运行期间预留的内存无法满足程序的需要,就会出现”Concurrent Mode Failure“,然后降级临时启用Serial Old收集器进行老年代的垃圾收集,这样停顿时间就很长了,所以-XX:CMSInitialOccupancyFraction设置太高容易导致大量”Concurrent Mode Failure“,并发模式失败。
  • 对CPU资源敏感,CMS默认启动的回收线程数是(cpu数量+3)/4。所以CPU数量少会导致用户程序执行速度降低较多。

G1收集器:(-XX:+UseG1GC,复制+标记-整理算法)

  • 并发与并行
  • 分代收集
  • 空间整合
  • 可预测的停顿

    好文传送门 --->  G1收集器入门

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java虚拟机 -- 垃圾收集器 的相关文章

  • 五、Jvm调优

    Jvm调优调什么 这个疑问必须要有 当对一个技术或者系统调优的时候 我们一定要知道去调什么 这样有一个出发点 有一个目标 不能胡乱的调对吧 那么Jvm调优 主要调以下 1 减少Full GC 2 解决OOM 3 总的来说就是 使用较小的内存
  • 数据结构与算法 ---- 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础 大型的IT企业面试时也会出数据结构和算法的题目 它可以说明你是否有良好的逻辑思维 如果你具备良好的逻辑思维 即使技术存在某些缺陷 面试公司也会认为你很有培养价值 至少在一段时间之后 技术可以很快得到提高
  • Java类的加载机制

    一 类的生命周期 1 加载的生命周期 类从被加载到虚拟机内存中开始 到卸载出内存为止 它的整个生命周期包括 加载 Loading 验证 Verification 准备 Preparation 解析 Resolution 初始化 Intial
  • Java垃圾回收机制

    Java垃圾回收机制 Java垃圾回收机制是指一种自动化的内存管理方式 Java程序员无需手动管理内存 而是由JVM Java虚拟机 自动进行垃圾回收 下面是简要的Java垃圾回收机制 垃圾收集器 JVM中垃圾回收器 Garbage Col
  • 【JVM】手写Java虚拟机-01 命令行工具

    目录 介绍 环境 配置环境 可能遇到的问题 开始 命令行工具 执行 介绍 手写一个简单的Java虚拟机 参考了bugstack虫洞栈 声哥 自己动手写Java虚拟机 和JVM Demo 本系列文章尽可能按照保姆级呈现 如果有任何问题和建议
  • 【深入理解Java虚拟机】内存管理和对象访问

    一 JVM内存区域划分 1 程序计数器 线程私有 类似于eclipse中断点程序 行号指示器 记录了程序下一步需要执行的字节码指令 分支 循环等分支 线程私有 每个线程有一个程序计数器 程序计数器是为了多线程情况下 线程执行切换后 处理器回
  • JVM——8.调优工具1(jstat)

    文章目录 1 使用背景 2 jstat 的介绍及使用 2 1 jstat gc PID 介绍 2 2 其他的 jstat命令 2 3 jstat gc PID 使用 3 关注指标及计算分析 3 1 关注指标 3 2 计算分析 1 使用背景
  • java 内存分配策略

    1 对象优先在新生代Eden区中进行分配 当Eden区没有足够空间进行分配时 虚拟机进行一次Minor GC 2 大对象直接进入老年代 所谓大对象就是需要大量连续内存空间的java对象 最典型的大对象就是很长的字符串以及数组 3 长期存活的
  • IO和NIO

    什么是I O模型 通常情况下I O操作是比较耗时的 所以为了高效的使用硬件 应用程序可以专门设置一个线程进行I O操作 而另外一个线程则利用CPU的空闲去做其他计算 这种为提高应用执行效率而采用的I O操作方法称为I O模型 当然了 在网络
  • Java虚拟机 -- 垃圾收集器

    介绍垃圾收集器之前先要了解三个知识点 Stop the World JVM由于要执行GC而停止应用程序的执行 任何一种GC算法中都会发生 多数GC优化通过减少Stop the world发生的时间来提高程序性能 Safepoint 安全点
  • 学习Java虚拟机的正确的姿势?

    为什么要学习Java虚拟机 多线程和虚拟机 实际工作中 大部分程序员可能几乎不用 但这两项技能是你面试所谓高级工程师的敲门砖 也是你在机会到来的时候能否顶上去的弹药库 很多人 把这两部看的太高深 望而却步 我觉得一个重要原因就是大部分博客和
  • Java虚拟机——运行时数据区

    Java内存区域 一 介绍 Java内存区域不同于Java内存模型 JMM Java内存区域是指 JVM运行时将数据分区域存储 简单的说就是不同的数据放在不同的地方 通常又叫 运行时数据区域 Java内存模型 JMM 定义了程序中各个变量的
  • little endian && big-endian

    java 的ClassFile采用big endian存储数据 Intel x86 采用little endian Motorola采用big endian 0x1234 Intel 地址 0x4000 0000 0x34 0x4000 0
  • 学习黑马JVM的笔记

    JVM详解 一 JVM介绍 1 什么是JVM 2 有什么好处 3 学习路线 二 内存结构 1 程序计数器 Program Counter Registe 1 定义 2 作用 3 特点 4 演示 2 虚拟机栈 Java Virtual Mac
  • 我看Java虚拟机(2)---Java虚拟机内存区域详解

    虚拟机内存区域的组成 直接上图 程序计数器 对于Java方法 用来选取下一条要执行的字节码 对于本地方法 值为空 线程独有 虚拟机栈 执行Java方法 每一层都是一个栈帧 栈帧包括局部变量表 操作数栈 动态链接和方法出口等信息 线程独有 本
  • 【JVM】如何通俗地讲解JVM各个组成部分和其基本功能?

    类加载器 ClassLoader 运行时数据区 Runtime Data Area 执行引擎 Execution Engine 本地库接口 Native Interface 组件的作用 首先通过类加载器 ClassLoader 会把 Jav
  • 什么是新生代的复制算法

    https blog csdn net ooppookid article details 51523701 1 什么是新生代的复制算法 了解堆内存看这里 java堆内存是什么样的 了解java垃圾回收看这里 java垃圾回收机制是什么 所
  • Java虚拟机二:JVM性能调优

    堆空间的划分 Java中的堆是JVM所管理的最大的一块内存空间 主要用于存放各种类的实列对象 这样划分的目的是为了使JVM能够更好的管理堆内存中的对象 堆的内存划分如图 Java堆的内存划分如图所示 分别为年轻代 Old Memory 老年
  • OpenJDK源码阅读-Oop&Klass

    文章目录 oop klass OBJECT hierarchy metadata hierarchy klass hierarchy oop classDiagram description klass classDiagram descr
  • Class类文件结构

    Class文件是一组以8位字节为基础单位的二进制流 各个数据项目严格按照顺序紧凑地排列在Class文件中 中间没有添加任何分隔符 这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据 没有空隙存在 根据Java虚拟机规范的规定

随机推荐

  • 二进制颜色代码大全(含图)

    二进制颜色代码大全 可供大家开发时参考 FFFFFF DDDDDD AAAAAA 888888 666666 444444 000000 FFB7DD FF88C2 FF44AA FF0088 C10066 A20055 8C0044 FF
  • 如何证明凸函数的局部极小值为全局极小值

    最近上系统分析这门课的时候 老师提到了这个概念 当我们能够确定凸函数的局部最小值 这个最小值即为全局极小值 但并未给出证明 这里记录一下 主要用的还是凸函数的定义 凸函数区间任意位置的函数值小于两区间端点函数值之和
  • c#客户端Kafka的使用方法

    简介 Apache Kafka是一个分布式流处理平台 最初由LinkedIn开发 现在是Apache软件基金会的顶级项目之一 Kafka能够处理大规模的实时数据流 支持高可靠性 高可扩展性 低延迟和高吞吐量 它主要用于构建实时数据管道和流式
  • Pycharm debug 的使用

    Debug 作用的理解 若整个代码编写没有错误 且执行体没有设置断点时 Debug同正常运行模式 直接得到最终结果 当某一行代码设置断点后 在Debug模式下 代码会运行断点之前的所有程序 在断点处暂停 并在 变量窗口 可以查看所有主程序当
  • C#学习笔记:RadioButton控件与CheckBox控件的用法

    一 用途 1 RadioButton控件 单选按钮 当与其他单选按钮成对出现时 允许用户从一组选项中选择单个选项 也就是说 当同一个容器中 Form Panel GroupBox PictureBox等 存在两个以上的单选按钮时 只能有一个
  • C#对象和类--习题(1)

    1 一个景区根据游人的年龄收取不同价格的门票 请编写游人类 根据年龄段决定能够购买门票价格并输出 class XiTi string name int age void Xiti1 for 死循环 类似的while true Console
  • 代理模式——静态代理(贴近业务)

    静态代理概念 所谓静态也就是在程序运行前就已经存在代理类的字节码文件 代理类和委托类的关系在运行前就确定了 通常用于对原有业务逻辑的扩充 举例理解 以结婚为例 当事人只需要处理自己的主要事儿即可 比如典礼 洞房 其他的杂事儿可以交给代理公司
  • 乾坤实战教程

    一 什么是微前端架构 微前端不是单纯的前端框架或者工具 而是一套架构体系 这个概念最早在2016年底被提出 可以参考在Google上搜索Micro Frontends 排名靠前的http micro frontends org的博客文章 提
  • grpc arm 交叉编译(ubuntu 16.04)

    1 安装相关依赖工具 安装pkg config sudo apt get install pkg config 安装依赖文件 sudo apt get install autoconf automake libtool make g unz
  • Android:在争议中逃离Linux内核的GPL约束

    原文地址 http tech sina com cn s s 2012 05 28 09447177318 shtml 为这个题材起名 我思考了许久 GPL 是著名的开放源代码许可协议 Linux 内核开源项目正是在 GPL 的庇佑之下 十
  • 解读制造业数字化转型的现状及发展趋势

    智能制造系统现状 企业信息化建设三驾马车 ERP PDM与MES ERP管理的是企业的资源 比如人员 设备折旧等 PDM管理的是产品的设计过程 比如产品图纸 工艺等 MES管理的是制造的过程 比如生产计划 生产作业等 ERP是从客户开始 到
  • Python:后缀为whl的文件是什么?如何安装whl文件?

    whl格式本质上是一个压缩包 里面包含了py文件 以及经过编译的pyd文件 使得可以在不具备编译环境的情况下 选择合适自己的python环境进行安装 安装方法很简单 进入命令行输入 pip install xxxx whl 或者如果是升级
  • 有向图-邻接表

    有向图邻接表 自我感觉比邻接矩阵要理解复杂一点 但是节省的空间不是小数目 所以虽然复杂 但是我们还是要优先考虑邻接表吧 下面代码简单的写了邻接表 但是基本核心的代码全部包括了 之后图中加权的我也在代码中有所涉及 我们只要更一些参数就可以 基
  • 医学图像分辨率提高 FBPconvnet(Deep Convolutional Neural Network for Inverse Problems in Imaging 实现)

    这篇博客主要是实现论文 Deep Convolutional Neural Network for Inverse Problems in Imaging 这篇论文主要是用较少的回波信号对医学图像进行重建 用较多的回波信号进行医学图像重建
  • Source Insight 4.0 Monokai黑色主题

    比较喜欢Sublime text的Monokai主题 周末空闲时间在Source Insight上DIY一下 分享给大家 下载地址 https download csdn net download rockex 11712949 下载配置文
  • Windows server 2019搭建NFS服务器

    1 NFS服务端配置 安装服务 配置NFS共享文件夹 选择服务器和此共享的路径 选择我们创建的磁盘 创建共享名称 指定身份验证方法 设置共享权限 指定我要授权访问的主机 确认选择没有问题点击创建 可以看到我们刚才创建好的共享文件夹 2 NF
  • Linux-rpm命令-查看已安装软件包信息及未安装rpm包信息

    博文说明 前言 本文将通过个人口吻介绍rpm命令 包括查看已安装软件包信息及未安装rpm包信息 在目前时间点 2017年6月12号 下 所掌握的技术水平有限 可能会存在不少知识理解不够深入或全面 望大家指出问题共同交流 在后续工作及学习中如
  • 用Endnote在word中插入文献出现{Xu, 1997 #407}等样式的错误的解决方法如下

    1 将Instant Formatting 由Off设置为On 2 弹出的对话框 点击ignore all 参考 https blog csdn net coberup article details 82525988
  • oswatch

    作者 eygle English Version 转载时请以超链接形式标明文章 出处和作者信息及 本声明 链接 http www eygle com archives 2007 07 oracle os watcher html 站内相关文
  • Java虚拟机 -- 垃圾收集器

    介绍垃圾收集器之前先要了解三个知识点 Stop the World JVM由于要执行GC而停止应用程序的执行 任何一种GC算法中都会发生 多数GC优化通过减少Stop the world发生的时间来提高程序性能 Safepoint 安全点