服务高峰期gc,导致服务不可用

news/2024/7/21 23:33:21/文章来源:https://blog.csdn.net/migo_/article/details/139070485

随着应用程序的复杂性和负载的不断增加,对JVM进行调优,也是保障系统稳定性的一个重要方向。

需要注意,调优并非首选方案,一般来说解决性能问题还是要从应用程序本身入手(业务日志,慢请求等),只有在必要时才对jvm进行调优(gc日志和监控异常)。

下面会提供一个线上案例,说明gc调优的重要性。

02_jvm性能调优_垃圾收集器的实现-CSDN博客

调优关注指标

吞吐量

程序运行过程中执行两种任务,执行业务代码的任务和执行垃圾回收的任务;

吞吐量计算公式:CPU在用户应用程序的运行时间/(CPU在用户应用程序的运行时间+CPU在垃圾回收程序的运行时间)

简单理解就是,吞吐量大,意味着应用程序运行的时间越多,执行业务的任务越多。

那么吞吐量多大合适呢,对于我们业务系统来说,肯定是越大越好了,但吞吐量太大会导致什么问题呢?

停顿时间

因为JVM在进行垃圾回收的时候,有些特有的阶段需要停止业务程序的运行,只有这样它才能准确的找到所有可达的节点,确定哪些是垃圾对象并进行清理。

例如:gc停顿100ms,意味着在这100ms内应用程序无法运行。注意这里的停顿时长,只是JVM停止业务程序执行垃圾回收任务的时长,并不是总的垃圾回收时间(有的收集器是一个回收阶段是有多个停顿的)

堆内存大小

当gc完成后,通常会释放一大块内存空间,所以如果频繁的gc,但可用内存没有下降的趋势(或趋势比较小),通常暗示有内存泄漏的问题。

以上三者的关系

这3个指标不可能同时达到,因为他们是一个不可能的关系。

内存变大,要回收的东西肯定变多,停顿时间肯定也会延长。

吞吐量增加,必然要减少垃圾回收的频率,频率降低,垃圾回收停顿的时间也会延长。

停顿时间减少,需要增加gc的频率,导致吞吐量下降。

因此,目前的调优方向主要是吞吐量和暂停时间。(我们的目标是停顿时间竟可能小的情况下,达到最大的吞吐量)

案例-停顿时间过高

系统配置2c12g,默认使用并行回收器。

通过下图的监控,可以发现,gc频率低,但停顿时间比较长(通常停顿时间尽量不要超过300ms)

因为行回收器会导致暂停时间变长,可以考虑更换垃圾收集器(G1) -XX:+UseG1GC -XX:MaxGCPauseMillis=300 ,通过设置合理的暂停时间,减低停顿时间。

为什么没有使用cms呢?

在 JDK 1.8 中,G1 垃圾收集器(Garbage-First Garbage Collector)被引入作为一种新的选择,旨在替代老旧的 CMS(Concurrent Mark Sweep)收集器。随着 Java 平台的发展,CMS 逐渐退出了舞台,原因主要包括以下几点:

1. **停止更新和维护**:
   自 JDK 9 开始,CMS 收集器就被标记为不推荐使用(deprecated),并在后续的版本中被彻底移除。Oracle 宣布不再对 CMS 收集器进行更新和维护,这意味着任何新的性能改进或者 bug 修复都不会应用于 CMS。

2. **并发模式失败**:
   CMS 收集器在处理大量并发数据时可能会遇到 "并发模式失败"(Concurrent Mode Failure)的问题。这种情况发生时,CMS 收集器无法在用户线程运行的同时完成垃圾回收,导致它不得不进行一次完全的垃圾回收(Full GC),这将暂停所有用户线程,影响应用程序的响应时间。

3. **内存碎片问题**:
   CMS 是基于标记-清除算法的,这意味着它在回收内存时不会进行压缩,从而可能导致内存碎片。内存碎片会随着应用程序的运行逐渐累积,最终可能导致需要更大的连续内存空间时无法找到足够的空间,进而触发 Full GC。

4. **G1 收集器的优势**:
   G1 收集器被设计为一种服务器端的垃圾收集器,适用于多核处理器和大内存的机器。它具有以下优点:
   - **预测性停顿时间模型**:G1 收集器可以设置期望的停顿时间目标(Pause Time Goal),并尽可能地在这个时间内完成垃圾回收,从而提供更可控的停顿时间。
   - **并行和并发回收**:G1 能够充分利用多核处理器,同时在并发阶段减少应用程序的停顿时间。
   - **分区堆**:G1 将堆内存分割成多个区域(Region),这样可以更高效地进行垃圾回收,尤其是在处理大堆时。
   - **增量式清理**:G1 收集器可以逐步清理堆内存,而不需要一次性清理全部空间,这有助于避免长时间的停顿。
   - **压缩空间**:G1 在回收过程中可以进行空间压缩,从而减少内存碎片问题。

5. **社区和官方的推动**:
   Oracle 和 Java 社区推动使用更现代的垃圾收集器,如 G1 和后来的 ZGC(Z Garbage Collector)以及 Shenandoah,这些收集器旨在提供更低的停顿时间和更好的性能,特别是在大内存和多核心的环境中。

由于上述原因,G1 收集器成为了 JDK 9 及以后版本的默认垃圾收集器,并且随着 Java 平台的发展,G1 和其他新的垃圾收集器(如 ZGC 和 Shenandoah)继续得到改进,以满足现代应用程序对性能和响应时间的要求。

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

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

相关文章

[算法][数字][leetcode]2769.找出最大的可达成数字

题目地址 https://leetcode.cn/problems/find-the-maximum-achievable-number/description/ 题目描述 实现代码 class Solution {public int theMaximumAchievableX(int num, int t) {return num2*t;} }

记录一次安装k8s初始化失败

实例化 kubeadm init --configkubeadm.yaml --ignore-preflight-errorsSystemVerification报错 [init] Using Kubernetes version: v1.25.0 [preflight] Running pre-flight checks error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: co…

uniapp 使用vuex 在app上能获取到state,小程序获取不到

1. 在根目录下新建store目录, 在store目录下创建index.js定义状态值import Vue from vue; import Vuex from Vuex; import Vuex from vuex; Vue.use(Vuex);const store new Vuex.Store({ state: { login: false, token: , avatarUrl: , userName: }, mutations: { lo…

轻兔推荐 —— vfox

简介 vfox 是一个跨平台且可扩展的版本管理工具,终于有一个可以管理所有运行环境的工具了 - 支持一键安装 Java、Node.js、Flutter、.Net、Golang、PHP、Python等多种环境 - 支持一键切换不同版本 特点 支持Windows(非WSL)、Linux、macOS! 支持不同项目不同版本、…

Spark项目实训(一)

目录 实验任务一:计算级数 idea步骤分步: 完整代码: linux步骤分布: 实验任务二:统计学生成绩 idea步骤分布: 完整代码: linux步骤分步: 实验任务一:计算级数 请…

力扣106. 从中序与后序遍历序列构造二叉树

Problem: 106. 从中序与后序遍历序列构造二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 具体思路参考: Problem: 力扣105. 从前序与中序遍历序列构造二叉树 再后序遍历中:每次取int rootVal postorder[postEnd];构造根节点;左子树…

Pytorch环境配置2.0.1+ Cuda11.7

查找cuda、cudnn、Pytorch(GPU)及cuda和NVIDIA显卡驱动对应关系 查询可支持的最高cuda版本 nvidia-smi查看支持的cuda的版本 CUDA版本对应表 我的显卡驱动是Driver Version:535.40.,那么左边对应的CUDA都可以兼容 右上角为CUDA 版本,可以看…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

作为一名前端工程师,该如何控制高并发请求呢?「如果有更好的方案,欢迎讨论」

假如现在有几十、上百个请求,我们该如何去控制这么高的并发呢? 给你一分钟时间,稍作思考 ~ 🤔 此场景有很多,比如 图片或文件批量下载、RSSHub高速抓取内容。。。 第一想法是不是请求池!&…

虚拟化技术[1]之服务器虚拟化

文章目录 虚拟化技术简介数据中心虚拟化 服务器虚拟化服务器虚拟化层次寄居虚拟化裸机虚拟化VMM无法直接捕获特权指令解决方案 服务器虚拟化底层实现CPU虚拟化内存虚拟化I/O设备虚拟化 虚拟机迁移虚拟机动态迁移迁移内容:内存迁移迁移内容:网络资源迁移迁…

NSSCTF | [SWPUCTF 2021 新生赛]no_wakeup

打开题目后&#xff0c;点击三个&#xff1f;&#xff0c;发现是一个php序列化脚本 <?phpheader("Content-type:text/html;charsetutf-8"); error_reporting(0); show_source("class.php");class HaHaHa{public $admin;public $passwd;public function…

2024第三届AIGC开发者大会圆桌论坛:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

在2024年第三届AIGC开发者大会上&#xff0c;多位业内专家齐聚一堂&#xff0c;共同探讨了AI Agent在中国的落地发展现状以及多模态结合具身智能的发展前景。本次圆桌论坛的嘉宾包括&#xff1a; Fast JP作者于金龙Agent创始人莫西莫必胜作者秦瑞January Agent创始人李晨 多模…

Cesium For Unity 在Unity中无法下载的问题

Unity 下载失败&#xff0c;提供百度网盘“com.cesium.unity-1.10.0.tgz”下载链接 链接&#xff1a;https://pan.baidu.com/s/1PybXQ8EvkRofOKD6rSN66g?pwd1234 提取码&#xff1a;1234 导入方法&#xff1a; 1.打开PackageManager;Window-PackageManager 2.在PackageMan…

Vue3:封装Table 表格组件

组件官网 elementPlus : 点击跳转 封装组件 创建新的组件文件: Table.vue <!-- PropTableS &#xff1a; 父组件传递过来的数据 (对象)PropTableS.tables : 父组件传递的对象中 存放表格每行显示的数据PropTableS.keyS &#xff1a; 父组件传递过来的对象&#xff0c;里…

Golang实现递归复制文件夹

代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…

6岁开始学习打字,10岁学懂文字编程

​你们有没有想过打字速度会影响Coding 编程能力&#xff1f; 疫情期间&#xff0c;全国中小学均不定期停止面授课程&#xff0c;改为网上教学。顷刻之间&#xff0c;电脑、智能手机等即时通讯软件成为每日学习的「良师益友」&#xff0c;常伴左右。 同时&#xff0c;学生也由…

每天五分钟深度学习框架PyTorch:创建具有特殊值的tensor张量

本文重点 tensor张量是一个多维数组,本节课程我们将学习一些pytorch中已经封装好的方法,使用这些方法我们可以快速创建出具有特殊意义的tensor张量。 创建一个值为空的张量 import torch import numpy as np a=torch.empty(1) print(a) print(a.dim()) print(s.shape) 如图…

本地部署 MiniCPM-Llama3-V 2.5

本地部署 MiniCPM-Llama3-V 2.5 0. 引言1. 性能评估2. 典型示例3. 本地部署4. 运行 WebUI Demo5. vLLM 部署 0. 引言 MiniCPM-Llama3-V 2.5 是 MiniCPM-V 系列的最新版本模型&#xff0c;基于 SigLip-400M 和 Llama3-8B-Instruct 构建&#xff0c;共 8B 参数量&#xff0c;相较…

Linux java jni调用C++封装动态库

由于项目中java需要调用第三方提供的C动态库&#xff1b;由于第三方动态库传入的参数较多&#xff0c;还伴随着指针传入操作&#xff0c;导致java调用极为不便&#xff01;因此催生出对于第三方的C动态库进行二次封装。java调用只需按结构传入一个结构化的string即可。话不多说…

CSS文本粒子动画特效之爱心粒子文字特效-Canvas

1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…