当前位置: 首页 > news >正文

JVM 性能调优 - 常用的垃圾回收器(6)

垃圾收集器

在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。

JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以满足不同的性能和内存需求。以下是 JVM 中常见的垃圾收集器:

  1. Serial收集器:是最古老的垃圾收集器,使用单线程进行垃圾收集。它适用于小型应用程序或者客户端应用程序,具有简单、高效的特点。

  2. Parallel收集器:也称为吞吐量优先收集器,使用多线程进行垃圾收集。它适用于需要高吞吐量的应用程序,可以充分利用多核处理器的优势。

  3. CMS(Concurrent Mark Sweep)收集器:是一种并发收集器,它在垃圾收集过程中,尽可能减少应用程序的停顿时间。它适用于对响应时间有较高要求的应用程序。

  4. G1(Garbage-First)收集器:是一种面向服务器应用程序的垃圾收集器,它通过将堆内存划分为多个区域,并根据垃圾分布情况进行优化的方式,实现高效的垃圾收集。

除了以上列举的垃圾收集器,JVM还提供了其他一些垃圾收集器,如ZGC(Z Garbage Collector)和Shenandoah等,它们都具有不同的特点和适用场景。

然而,Java虚拟机规范(Java Virtual Machine Specification)并没有具体规定垃圾收集器的实现细节,它只定义了Java虚拟机的内存模型和垃圾收集的基本概念。具体的垃圾收集器的实现是由不同的JVM厂商根据规范进行开发和优化的。

Java虚拟机规范确实提供了一些关于垃圾收集器的建议和要求,例如:

  1. 垃圾收集器应该能够自动识别和回收不再使用的对象,以避免内存泄漏和内存溢出的问题。

  2. 垃圾收集器应该能够根据需要动态调整内存的分配和回收策略,以提高性能和效率。

  3. 垃圾收集器应该能够最小化应用程序的停顿时间,以提供更好的响应性能。

  4. 垃圾收集器应该能够处理不同类型的对象,包括普通对象、数组对象和本地对象等。

总之,虽然Java虚拟机规范没有具体规定垃圾收集器的实现细节,但它提供了一些关于垃圾收集器的建议和要求,以确保Java虚拟机能够提供高效、可靠的垃圾收集机制。具体的垃圾收集器的实现取决于不同的JVM厂商和版本。

七大经典垃圾收集器

  • 串行回收器:Serial、Serial Old。
  • 并行回收器:ParNew、Parallel Scavenge、Parallel Old。
  • 并发回收器:CMS、G1。

我们可以从下图中看到各大垃圾收集器的应用程序线程和垃圾回收线程的关系。

垃圾收集器和垃圾分代关系
  • 新生代收集器:Serial GC、ParNew GC、Parallel Scavenge GC。

  • 老年代收集器:CMS GC、Serial old、Parallel Old GC。

  • 整堆收集器:G1。

垃圾收集器和垃圾分代关系如下图所示:

垃圾回收算法
  • 引用计数(Java 中不使用)
  • 复制拷贝(新生代用)
  • 标记清除(用于老年代)
  • 标记整理(用于老年代)

垃圾收集器分类

按线程数分

可以分为串行回收并行回收

  • 串行回收器:同一时间段内只有一个 CPU 用于执行垃圾回收,应用程序线程将被暂停,直至收集。
  • 并行回收器:垃圾回收器的线程与应用程序线程可以交替运行,尽可能减少垃圾回收停顿的时间。
  • 串行和并行回收器的共同点:都会发生 Stop the world
  • 串行回收器应用场景:客户端的 Client 模式下的 JVM 中。
按工作模式分

可以分为串行并发式回收独占式回收

  • 并发式垃圾收集器:回收线程和应用程序线程交替工作,减少应用程序的停顿时间。
  • 独占式垃圾收集器:只要进行垃圾回收,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。
按碎片处理方式分

可以分为压缩式回收非压缩式回收

  • 压缩式回收:在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。
  • 非压缩式回收:不进行压缩处理。
垃圾收集器的性能
  • 吞吐量:CPU 运行用户代码的时间和 CPU 总消耗时间的比值。
  • 暂停时间:应用程序线程暂停,GC 线程执行。

其实没有一个完美的垃圾收集器,也没有万能的垃圾收集器。每个收集器都有最合适场景,按需结合使用才能发挥最大的功效。

垃圾收集器总结

编写代码

package com.test;public class TestJavaHeapSpace {public static void main(String[] args) {byte[] bytes1 = new byte[1 * 1024 * 1024];byte[] bytes2 = new byte[1 * 1024 * 1024];byte[] bytes3 = new byte[1 * 1024 * 1024];}
}

运行程序

$ java -Xms2M -Xmx2M -XX:+PrintCommandLineFlags -XX:+PrintGCDetails com.test.TestJavaHeapSpace

[GC (Allocation Failure) [PSYoungGen: 511K->488K(1024K)] 511K->504K(1536K), 0.0319948 secs] [Times: user=0.00 sys=0.00, real=0.04 secs] 
[GC (Allocation Failure) [PSYoungGen: 985K->504K(1024K)] 1001K->642K(1536K), 0.0007380 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1009K->509K(1024K)] 1148K->736K(1536K), 0.0007602 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1013K->509K(1024K)] 1240K->760K(1536K), 0.0005670 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1014K->509K(1024K)] 1265K->776K(1536K), 0.0006131 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1018K->509K(1024K)] 1285K->808K(1536K), 0.0005305 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) --[PSYoungGen: 1008K->1008K(1024K)] 1307K->1515K(1536K), 0.0336632 secs] [Times: user=0.00 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 1008K->266K(1024K)] [ParOldGen: 506K->421K(512K)] 1515K->688K(1536K), [Metaspace: 2525K->2525K(1056768K)], 0.0057810 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 764K->196K(1024K)] [ParOldGen: 421K->389K(512K)] 1186K->586K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0048920 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 698K->196K(1024K)] [ParOldGen: 389K->391K(512K)] 1088K->588K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0051047 secs] [Times: user=0.05 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 692K->196K(1024K)] [ParOldGen: 391K->392K(512K)] 1084K->589K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0053302 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 702K->196K(1024K)] [ParOldGen: 392K->394K(512K)] 1094K->591K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0050899 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 707K->196K(1024K)] [ParOldGen: 394K->395K(512K)] 1101K->592K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0049420 secs] [Times: user=0.06 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 707K->196K(1024K)] [ParOldGen: 395K->396K(512K)] 1103K->593K(1536

相关文章:

JVM 性能调优 - 常用的垃圾回收器(6)

垃圾收集器 在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。 JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以…...

【java】Hibernate访问数据库

一、Hibernate访问数据库案例 Hibernate 是一个在 Java 社区广泛使用的对象关系映射(ORM)工具。它简化了 Java 应用程序中数据库操作的复杂性,并提供了一个框架,用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使…...

从零开始手写mmo游戏从框架到爆炸(八)— byte数组传输

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 Netty帧解码器 Netty中,提供了几个重要的可以直接使用的帧解码器。 LineBasedFrameDecoder 行分割帧解码器。适用场景:每个上层数据包,使…...

Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器

本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例,我们将其用于 BM25 示例。 在这个例子中: 我们将摄取 LangChain 之外的电影样本数据集自定义 ElasticsearchStore 中的检索策略以仅使用 BM25使用自查询检索将问题转…...

uniapp的api用法大全

页面生命周期API uniApp中的页面生命周期API可以帮助开发者在页面的不同生命周期中执行相应的操作。常用的页面生命周期API包括:onLoad、onShow、onReady、onHide、onUnload等。其中,onLoad在页面加载时触发,onShow在页面显示时触发&#xf…...

笔记——asp.net core 中的 REST

REST(reprentational state transfer,表层状态转移) REST原则:提倡按照HTTP的语义使用HTTP。 如果一个系统符合REST原则,我们就说这个系统是Restful风格的。 在RPC风格的Web API系统中,我们把服务端的代码…...

排序算法---堆排序

原创不易,转载请注明出处。欢迎点赞收藏~ 堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆(或最小堆),然后逐步将堆顶元素与堆的最后一个元素交换位置&#xff0c…...

Java字符串(包含字母和数字)通用排序

说明:本文章是之前查到的一篇安卓版的,具体原文路径忘记了。稍微改了一点,挺符合业务使用的! 一、看代码 /*** 包含数字的字符串进行比较(按照从小到大排序)*/private static Integer compareString(Stri…...

【Spring】springmvc如何处理接受http请求

目录 ​编辑 1. 背景 2. web项目和非web项目 3. 环境准备 4. 分析链路 5. 总结 1. 背景 今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的?”;看完之后突然想到,在请求走到mvc 之前服务是怎么知道有请求进来…...

2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题是由安全生产模拟考试一点通提供,安全员-B证证模拟考试题库是根据安全员-B证最新版教材,安全员-B证大纲整理而成(含2024年…...

redis过期淘汰策略、数据过期策略与持久化方式

redis的过期淘汰策略 redis过期淘汰策略有很多,默认是no-eviction 不删除任何数据,内存不足存入会直接报错,可以在redis配置文件中进行设置,其中有两个非常重要的概念,LRU与LFU LRU表示最近最少使用,LFU为最少频率使用 又按照volatile已设置过期时间的数据集和allkeys所有数…...

Oracle Vagrant Box 扩展根文件系统

需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验,加之导入AWR dump数据,导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1:预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…...

TDengine用户权限管理

Background 官方文档关于用户管理没有很详细的介绍,只有零碎的几条,这里记录下方便后面使用。官方文档:https://docs.taosdata.com/taos-sql/show/#show-users 1、查看用户 show users;super 1,表示超级用户权限 0,表…...

推荐一款开源的跨平台划词翻译和OCR翻译软件:Pot

Pot简介 一款开源的跨平台划词翻译和OCR翻译软件 下载安装指南 根据你的机器型号下载对应版本,下载完成后双击安装即可。 使用教程 Pot具体功能如下: 划词翻译输入翻译外部调用鼠标选中需要翻译的文本,按下设置的划词翻译快捷键即可按下输…...

spring boot学习第十一篇:发邮件

1、pom.xml文件内容如下&#xff08;是我所有学习内容需要的&#xff0c;不再单独分出来&#xff0c;包不会冲突&#xff09;&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…...

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…...

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…...

【工作学习 day04】 9. uniapp 页面和组件的生命周期

问题描述 uniapp常用的有&#xff1a;页面和组件&#xff0c;并且页面和组件各自有各自的生命周期函数&#xff0c;那么在页面/组件请求数据时&#xff0c;是用created呢&#xff0c;还是用onLoad呢&#xff1f; 先说结论: 组件使用组件的生命周期&#xff0c;页面使用页面的…...

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...