当前位置: 首页 > 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; …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...