生产问题复盘!Swap对GC的影响

Swap

1. 什么是Swap

swap 是把一块磁盘空间或者一个本地文件当做内存来使用。可用内存无法满足内存分配请求的时候,把不常用的内存数据存储到磁盘,并在内存中释放这部分内存。当进程再次访问这部分内存的时候,再读取到内存中来。

2. 为什么要有swap

os面对物理内存申请不足的时候,一种方法是oom,另一种方法是回收内存。

内存回收也分成2种,一种就是直接回收,另一种是定期回收,swap就是定期回收的一种

所以,swap的出现主要是解决内存不足

3. 对于gc有没有影响

如果java进程用到了swap内存,那么在gc的时候是会有影响的,毕竟涉及到磁盘写入和读取,且这个是由os控制。换入到磁盘的是冷数据,那应该也就影响Full GC,由于内存不足导致的频繁清理也会影响Minor GC(猜的)。

出现这种问题最大的问题还是物理内存不足以满足进程所需内存。所以应该把着重点放在进程所需内存调整和物理内存扩容这两点上。

4. swap大致运行逻辑


前面提到os在回收内存有两种方式,一种就是直接回收,另一种是定期回收。定期回收由专门的内核线程来进行回收。

当 pages_min<剩余内存<pages_low,线程就会执行内存回收。

可以通过cat /proc/zoneinfo查看。

回收模式可以通过cat /proc/sys/vm/zone_reclaim_mode查看。

  • 0 意味着关闭zone_reclaim模式,可以从其他zone回收内存
  • 1 表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内
  • 2 在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。
  • 4 可以用swap方式回收内存。

简单实验

环境准备

  1. 开启Swap
# 创建Swap文件
$ fallocate -l 8G /mnt/swapfile
# 修改权限只有根用户可以访问
$ chmod 600 /mnt/swapfile
# 配置Swap文件
$ mkswap /mnt/swapfile
# 开启Swap
$ swapon /mnt/swapfile
# 关闭Swap
$ swapoff -a
  1. java文件准备
import java.lang.ref.SoftReference;class FullGCTest {public static void main(String[] args) {SoftReference<byte[]>[] list=new SoftReference[1000];for (int i = 0; i < 1000; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}list[i]= new SoftReference<>(new byte[1024 * 1024 * 10]);}System.out.println("程序执行完毕");}
}
  1. 启动命令
# Xms Xmx我这选择用的就是free的值
java -XX:+PrintGCDetails -Xms1398m -Xmx1398m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC FullGCTest
  1. gc情况查看(看日志也行)
    具体参数和其他命令可以参考:JVM命令行调优工具备忘录
jstat -gc 15198 100
  1. 清空缓存
sudo echo 3 > /proc/sys/vm/drop_caches

Swap未开启

当内存快满的时候,并未有明显的时间家具

Swap开启

加大堆内存

java -XX:+PrintGCDetails -Xms4096m -Xmx4096m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC FullGCTest

不太精确的总结

  • 前面2个对照组,当没有使用到swap空间的时候,gc时间差不多,当swap空间使用的时候,会有一个明显的增加
  • 最后一个是模拟大量使用swap的场景,gc时间都有一个明显的增加
    • 当然也可能和我阿里云服务器1核2G有关,又分配了4G的堆内存。
  • gc属于java进程管理,swap属于os管理。影响应该是有的,但是两者都不可控,不应该纠结于swap,而是研究物理内存是否充足,java进程分配是否合理

以上来自一次真实的生产事故排查

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

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

相关文章

使用Gin框架,快速开发高效的Go Web应用程序

推荐 海鲸AI-GPT4.0国内站点&#xff1a;https://www.atalk-ai.com 前言 在当今的软件开发领域&#xff0c;Go语言以其简洁的语法和出色的性能逐渐成为开发者们的新宠。而Gin框架&#xff0c;则是Go语言中最受欢迎的Web框架之一&#xff0c;它以高性能和易用性著称。本文将带你…

前端常用的时间格式处理

import { fillZero } from /utils/utils export const shortcuts [[最近一周, 7],[最近一个月, 30],[最近三个月, 90],[最近半年, 180],[最近一年, 365] ]/*** dateParams 获取时间对象 * param {Number} value 时间戳*/ export const dateParams (value) > {const …

详讲api网关之kong的基本概念及安装和使用(一)

什么是api网关 前面我们聊过sentinel&#xff0c;用来限流熔断和降级&#xff0c;如果你只有一个服务&#xff0c;用sentinel自然没有问题&#xff0c;但是如果是有多个服务&#xff0c;特别是微服务的兴起&#xff0c;那么每个服务都使用sentinel就给系统维护带来麻烦。那么网…

计数指针:shared_ptr (共享指针)与函数 笔记

推荐B站视频&#xff1a; 4.shared_ptr计数指针_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p4&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 5.shared_ptr与函数_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p5&vd_sourcea…

11Docker数据持久化

Docker数据持久化 容器中数据持久化主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;数据卷容器&#xff08;Data Volumes Dontainers&#xff09; 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;可以绕过UFS&#xff08;Unix F…

YOLOV5目标检测---labelimg图片标注工具(1)

前言&#xff1a;在使用YOLO训练自己模型的时候首先要学会对数据进行处理&#xff0c;这里介绍一个常用的本地打标签工具labelimg&#xff0c;如果不想按照的话也可以使用在线标签工具&#xff0c;因为害怕数据泄露&#xff0c;所以本人一直使用的是本地工具进行打标签。在线标…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

ppt作品展示能用二维码吗?文件二维码内容可替换怎么做?

当我们需要将自己的作品或者内容做成ppt文件之后&#xff0c;用二维码的方式来做展示&#xff0c;而且生成二维码还可以在图案不变的情况下&#xff0c;能够修改或者替换文件内容&#xff0c;实现二维码的长期使用。在遇到这种要求时&#xff0c;如何生成这种类型的二维码图片呢…

扫雷游戏——数组和函数实现

扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷可以排查雷如果位置不是雷&#xff0c;就显⽰周围有⼏个雷如果位置是雷&#xff0c;就炸死游戏结束把除10个雷之外的所有⾮雷都找出来&…

CSS--样式穿透

样式穿透具体可分为css、less以及scss&#xff0c;语法不同&#xff0c;具体语法如下所示。 css样式穿透&#xff1a; <style scoped>父元素 >>> 子元素 {color: red;} </style> less样式穿透&#xff1a; <style lang"less" scoped>父…

HFSS实战(三)——过孔via TDR仿真

文章目录 一、模型的处理二、TDR仿真2.1 修改求解模式2.2增加求解设置 三、查看仿真结果3.1 查看TDR结果3.2 查看S参数结果 四、结果分析4.1上升时间tr对仿真的影响 附&#xff1a;工程链接 在上一讲中&#xff0c;主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看…

k8s 安全机制

k8s的安全机制&#xff1a; 核心&#xff1a;分布式集群管理工具&#xff0c;就是容器编排&#xff0c;安全机制的核心&#xff1a;API server 作为整个集群内部通信的中介&#xff0c;也是外控控制的入口。实验的安全机制都是围绕api server来进行设计&#xff1a; 请求api资…

利用nginx宝塔免费防火墙实现禁止国外IP访问网站

本章教程&#xff0c;主要介绍&#xff0c;如何利用nginx宝塔面板中的插件免费防火墙&#xff0c;实现一键禁止国外IP访问网站。 目录 一、安装宝塔插件 二、 开启防火墙 一、安装宝塔插件 在宝塔面板中的软件商店&#xff0c;搜索防火墙关键词&#xff0c;找到Nginx免费防火…

myql入门

目录 安装修改密码学习资料个人git仓库文章视频官网 安装 #移除以前的mysql相关 sudo apt remove --purge mysql-\* #安装mysql sudo apt install mysql-server mysql-client #查看是否启动 systemctl status mysql #手动启动 systemctl start mysql #查看mysql版本 mysql --v…

(Unity)C#的预处理器指令和条件编译符号

C#的预处理器指令 预处理指令主要用于控制编译器的编译过程。它们在编译时被处理&#xff0c;而不是在运行时。这意味着预处理指令可以用来使编译器只编译满足特定条件的代码&#xff0c;或者在编译时输出特定的警告或错误。 #define&#xff1a;定义一个符号。#undef&#xff…

在线教育系统开发:构建现代化学习平台

随着科技的迅速发展&#xff0c;在线教育系统在教育领域扮演着越来越重要的角色。本文将深入探讨在线教育系统的开发过程&#xff0c;涉及关键技术和代码实现。 技术选型 在开始开发之前&#xff0c;我们首先需要选择适合在线教育系统的技术栈。以下是一些常见的技术选项&am…

常见的持久层框架包括

常见的持久层框架包括&#xff1a; Hibernate&#xff1a;Hibernate是Java的关系数据库持久化框架&#xff0c;通过对象关系映射&#xff08;ORM&#xff09;将对象和关系数据库进行映射。Hibernate提供了丰富的功能和灵活的查询语言&#xff0c;适用于复杂的数据模型和关系查询…

一些常用的数据备份脚本

Elasticsearch备份 #!/bin/shtodaydate %Y%m%dcurl --location --request PUT http://localhost:22063/_snapshot/es_bak --header Content-Type: application/json --data-raw {"type": "fs","settings":{"compress": true,"lo…

代码随想录算法训练营29期|day31 任务以及具体安排

理论基础 关于贪心算法&#xff0c;你该了解这些&#xff01; 题目分类大纲如下&#xff1a; #算法公开课 《代码随想录》算法视频公开课 (opens new window)&#xff1a;贪心算法理论基础&#xff01; (opens new window),相信结合视频再看本篇题解&#xff0c;更有助于大家…

tdesign的使用记录

1、复杂表单校验 复杂类型的数据&#xff08;两级数组&#xff09; const dataForm ref({configTalkTemplateProblemCoList: [{"id":"1744302859557920769","templateId":"1744302859511783426","parentId":null,"l…