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)] 110

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

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

相关文章

VisaulStudio2022下用VB.net实现socket与西门子PLC进行通讯案例(优化版)

前言 对于电气工程师来说,不仅要会PLC,还要会上位机。 此前,我写过一个VB.net下雨西门子PLC通讯案例的博文: VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例 但当时很多东西都理解不深,博文也写的比较浅,但我看有不少收藏,也有些朋友在底下询问,所以,…

第4章——深度学习入门(鱼书)

第4章 神经网络的学习 本章的主题是神经网络的学习。这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。本章中,为了使神经网络能进行学习,将导入损失函数这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最…

一些常见的电源方案

开关电源: RM C 板:(24V电压,10A电流) SMBJ30CA:静电和浪涌保护(TVS/ESD) 一般使用NMOS管,因为PMOS管导通电阻与NMOS管比较会较大 模电非基础01——从一种常见的防反接,上电缓启…

Mysql大表添加字段失败解决方案

背景 最近遇到一个问题,需要在user用户表千万级别数据中添加两个字段,发现老是加不上去,一直卡死。表数据量不仅大,而且是一个热点表,访问频率特别高,而且该表的访问是在一个大事务中。加字段的时候一直在…

深度解析与推荐:主流Web前端开发框架

一、引言 在信息化社会中,Web前端开发的重要性日益凸显。作为连接用户与后台服务的关键桥梁,前端界面不仅直接影响用户体验,更是企业品牌形象、产品价值传递的重要载体。随着互联网技术的飞速发展,用户对于网站和应用的交互性、响应速度以及视觉效果等方面的要求越来越高,…

【Android】手机端使用NanoHTTPD搭建服务器

序言 NanoHTTPD 是一个轻量级的 Java HTTP 服务器库&#xff0c;可以在应用程序中快速搭建一个简单的 HTTP 服务器。 准备工作 引入依赖 implementation org.nanohttpd:nanohttpd:2.3.1添加网络访问权限 <uses-permission android:name"android.permission.INTERN…

挑战杯 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)

什么是嵌入&#xff1f; OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于&#xff1a; Search 搜索&#xff08;结果按与查询字符串的相关性排序&#xff09;Clustering 聚类&#xff08;文本字符串按相似性分组&#xff09;Recommendations 推荐&#xff08;推荐具有…

SIMD学习笔记1

参考 http://const.me/articles/simd/simd.pdf https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#catsArithmetic&expand3904,3913,4011,34,4014,4602,4011&techsMMX,AVX_512,AMX,SVML,Other&ig_expand11 示例&#xff1a;对4个数字求平…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA和CAN协议2.0B的总线控制器研究与设计(续)

目录 3.2 寄存器管理模块 3.2.1寄存器规划及设计 3.2.2 BasicCAN模式 3.2.3 PeliCAN模式

【Scala 】3. 类和对象

3. 类和对象 scala是一种面向对象的函数&#xff0c;其中一部分就是scala语言中支持类的实现。 3.1 类的继承 &#xff08;1&#xff09;基类&#xff08;父类&#xff09; 类中包含实现面积的计算方法 class Shape { def getArea():Float { return 0 } }&#xff0…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之RichText组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RichText组件 鸿蒙&#xff08;HarmonyOS&#xff09;富文本组件&#xff0c;…

【学习心得】Python好库推荐——tqdm

在很多时候&#xff0c;你都需要一个进度条来告知当前程序的运行状况和进展。tqdm 是一个在Python中广泛使用的命令行进度条工具库&#xff01;下面是这个库的主页&#xff1a;https://tqdm.github.io/ 一、快速入门 &#xff08;1&#xff09;for循环中 代码&#xff1a; …

句子嵌入: 交叉编码和重排序

这个系列目的是揭开嵌入的神秘面纱&#xff0c;并展示如何在你的项目中使用它们。第一篇博客介绍了如何使用和扩展开源嵌入模型&#xff0c;选择现有的模型&#xff0c;当前的评价方法&#xff0c;以及生态系统的发展状态。第二篇博客将会更一步深入嵌入并解释双向编码和交叉编…

C语言的起源

1940年代&#xff0c;最早的开始&#xff0c;编程语言是机器语言&#xff0c;用0/1表示的、计算机能直接识别和执行的一种机器指令的集合。最早的编程方式&#xff0c;就是给纸带打孔或者卡片机打孔。机器语言直接与硬件沟通&#xff0c;极具针对性&#xff0c;但是非常难于理解…

企业微信会话存档:大文件拉取、加密、上传

承接之前的文章企业微信会话存档sdk报错&#xff1a;A fatal error has been detected by the Java Runtime Environment 在之前的那篇文章结尾&#xff0c;我说发现了系统另外一个隐含的bug&#xff1a;企业微信会话存档拉取媒体文件是分片拉取&#xff0c;我的处理方式有问题…

IP地址如何保护网络安全

面对网络攻击时&#xff0c;仅依靠常态化的网络安全防御系统已捉襟见肘&#xff0c;如联合使用IP地址数据可以形成多元化的安全解决方案&#xff0c;全面监控网络活动&#xff0c;发现潜在威胁&#xff0c;制定有针对性的应对措施。 网络攻击追踪 当网站或应用遭受DDoS等网络攻…

Helm 简介:Kubernetes 的包管理器

简介 将应用程序部署到 Kubernetes&#xff08;一个功能强大且流行的容器编排系统&#xff09;可能会很复杂。设置单个应用程序可能涉及创建多个相互依赖的 Kubernetes 资源&#xff0c;例如 pods、services、deployments 和 replicasets&#xff0c;每个资源都需要编写详细的…

基于YOLOv8的暗光低光环境下(ExDark数据集)检测,加入多种优化方式---DCNv4结合SPPF ,助力自动驾驶(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了暗光低光数据集检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入 DCNv4结合SPPF mAP0.5由原始的0.682提升至…

在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程

一、前期准备&#xff1a; 1.安装VMware 虚拟机软件&#xff08;不在讲解&#xff0c;可自行去下载安装&#xff09;。官网&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-PLAYER-1750&productId1377&rPId111471 2.下载iso…