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

【开发篇】十三、JVM基础参数设置与垃圾回收器的选择

文章目录

  • 1、-Xmx 和 –Xms
  • 2、-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize
  • 3、-Xss
  • 4、不建议改的参数
  • 5、其他参数
  • 6、选择GC回收器的调试思路
  • 7、CMS的并发模式失败现象的解决
  • 8、调优案例

GC问题解决方式:

  • 优化JVM基础参数,避免频繁Full GC
  • 减少对象的产生,以免对象产生速度过快导致频繁Full GC
  • 选择适合业务场景的垃圾回收器
  • 优化垃圾回收器的参数

1、-Xmx 和 –Xms

-Xmx设置最大堆内存(max),-Xms设置可用堆内存大(total)

在这里插入图片描述
计算理论最大可用堆空间,如服务器内存4G,操作系统自己使用的内存+元空间最大值+其它软件占用1.5G ⇒ 理论最大可用堆空间为2.5g,只是理论值。(减去元空间是因为,Java 8及以后,元空间使用的是直接内存)

在这里插入图片描述
最后设置的堆内存大小,应是按照系统最大并发估计,且小于上面的理论值。最后,将-Xms设置的和-Xmx一样大,理由:

  • 可用内存一开始就等于最大堆内存,避免堆扩容时频繁向操作系统申请内存,影响程序性能
  • 避免扩容时,因其他应用占用了操作系统内存而申请扩容失败
  • 服务启动速度更快,初始堆太小(Xms太小),Java应用启动会变慢,因为JVM会被迫频繁垃圾回收,直到堆增长到一个合理的大小

2、-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize

-XX:MaxMetaspaceSize :最大元空间。默认值比较大,万一元空间内存泄漏,会影响到操作系统(因为元空间用的直接内存)

–XX:MetaspaceSize:到这个值后,触发Full GC,后续什么值再触发,JVM自行计算。

在这里插入图片描述

3、-Xss

指定每个栈的大小,不指定取默认值,默认值取决于操作系统。如Linux x86 64bit 默认是1MB。如果没有方法的递归调用,可调小栈大小

//合理值为256k – 1m之间
-Xss256k

4、不建议改的参数

以下参数,调整可能会让某一个接口得益,但同时也会影响其他接口,不建议修改。

1-Xmn:年轻代的大小

年轻代的大小,默认为整个堆的1/3。可根据系统峰值计算年轻代大小,以尽量让对象只存在年轻代,不进入老年代(这样后面Young GC一下就行),但计算这个值的影响因素太多,不建议改。且G1垃圾回收器会动态调整年轻代的大小,更不建议改。

在这里插入图片描述

2)‐XX:SurvivorRatio 伊甸园区和幸存者区的大小比例,默认值为8

在这里插入图片描述

3)‐XX:MaxTenuringThreshold 最大晋升阈值

对象晋升有两个情况:

  • (GC一次,对象年龄+1)年龄 > 此值,进入老年代
  • 动态年龄判断机制:按年龄从小到大将对象空间加起来, > survivor区域的50%,就把大于等于该年龄的对象晋升到老年代

在这里插入图片描述

5、其他参数

-XX:+DisableExplicitGC作用:禁止在代码中调用System.gc()
-XX:+HeapDumpOnOutOfMemoryError作用:OOM时,生成hprof内存快照文件
-XX:HeapDumpPath=<path>作用:指定内存快照文件的生成路径
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:文件路径作用:JDK8及之前,打印GC日志
-Xlog:gc*:file=文件路径作用:JDK9及以后,打印GC日志


JVM参数模板总结:

-Xms1g
-Xmx1g
-Xss256k
-XX:MaxMetaspaceSize=512m 
-XX:+DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/my-service.hprof
# <=JDK8
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps# >=JDK9
-Xloggc:文件路径

6、选择GC回收器的调试思路

用以下代码模拟系统的业务代码进行压测:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.SneakyThrows;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;@RestController
@RequestMapping("/fullgc")
public class DemoController {private Cache cache = Caffeine.newBuilder().weakKeys().softValues().build();private List<Object> objs = new ArrayList<>();private static final int _1MB = 1024 * 1024;//FULLGC测试结果://ps + po 50并发 260ms  100并发 474ms  200并发 930ms//cms -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 50并发 157ms  200并发 833ms//g1 JDK11 并发200 248@GetMapping("/1")public void test() throws InterruptedException {cache.put(RandomStringUtils.randomAlphabetic(8),new byte[10 * _1MB]);}}

创建一个具有弱引用键(value不存在了,可被GC回收)和软引用值的缓存对象(内存不足时,可GC回收),接口往里面放10M的数据,如此,不会OOM,且会较多触发FULL GC。用Jmeter并发/1接口的同时,再调用一次接口/2,用这个接口模拟有突发大对象产生时,对系统响应时间的影响:

@GetMapping("/2")
public void test() throws InterruptedException {ArrayList<Object> objects = new ArrayList<>();for (int i = 0; i < 1024; i++) {objects.add(new byte[3 * _1MB]);}
}

步骤:

  • Jmeter脚本压测,添加RT响应时间组件
  • 选择不同的垃圾回收器组合,测试50、100、200并发下,FULL GC对RT的时间的影响

统一JVM参数设置:

-Xms8g -Xmx8g -Xss256k -XX:MaxMetaspaceSize=512m  -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

测试的垃圾回收器组合:

  • ps + po
  • cms
  • JDK11的默认回收器g1

测试场景:

  • 高并发(/1接口)
  • 大对象产生(/2接口)

观察RT的结果:查看最大值,即接口的最大响应时间。峰值的出现,即FULL GC对接口响应时间的影响
在这里插入图片描述

7、CMS的并发模式失败现象的解决

CMS的垃圾清理线程和用户线程并行

在这里插入图片描述

如果并行清理的过程中,老年代的空间,不足以容纳新晋升到老年代的对象,就发生并发模式失败:

在这里插入图片描述

出现并发模式失败时,会导致JVM使用Serial Old单线程进行FULLGC回收老年代,这样会产生较长时间的停顿,从而影响接口响应时间。解决思路:

  • 减少对象的产生以及晋升
  • 增加堆内存大小
  • -XX:CMSInitiatingOccupancyFraction=

关于垃圾回收器的参数CMSInitiatingOccupancyFraction,当老年代大小达到其值,会自动进行CMS老年代垃圾回收。JDK8中,该值为-1,计算公式:

((100 - MinHeapFreeRatio) + (double)(CMSTriggerRatio * MinHeapFreeRatio) / 100.0)

最后,这个参数想生效,必须先开启:

-XX:+UseCMSInitiatingOccupancyOnly

调小这个值,比如从默认的90%调到60%,早些进行老年代的回收,就不会出现并发模式失败,也就不会有后面的Serial Old单线程回收老年代。

8、调优案例

案例背景:

  • 系统的接口在平时响应较快,但高峰期会出现调用时间较长的现象,现需要优化性能

分析的方向:

  • GC问题:查看是否出现连续的Full GC或者单次GC时间过长
  • 内存问题

步骤:

  • 生成GC报告,GcEasy分析
  • GC有问题,就调整参数或者换垃圾回收器
  • 内存有问题就jmap或Arthas将堆内存快照保存
  • MAT或者heaphero在线分析内存
  • 修复

关于heaphero:https://heaphero.io/

调优案例:https://www.bilibili.com/video/BV1r94y1b7eS?p=68&vd_source=d86e858b4dfd8944a691759448d35279

相关文章:

【开发篇】十三、JVM基础参数设置与垃圾回收器的选择

文章目录 1、-Xmx 和 –Xms2、-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize3、-Xss4、不建议改的参数5、其他参数6、选择GC回收器的调试思路7、CMS的并发模式失败现象的解决8、调优案例 GC问题解决方式&#xff1a; 优化JVM基础参数&#xff0c;避免频繁Full GC减少对象的产生…...

多维 HighCharts

1&#xff1a;showHighChart.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><!-- js脚本都是官方的,后两个是highchart脚本 --><script type"text/javascript" src"jquery1.7.1.mi…...

单细胞RNA测序(scRNA-seq)cellranger count的细胞定量和aggr整合

单细胞RNA测序(scRNA-seq)基础知识可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分 单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控 细胞定量…...

Unity URP 2021 Release-Notes

&#x1f308;Unity URP 2021 Release-Notes 本文信息收集来自自动搜集工具&#x1f448; 版本更新内容2021.3.32URP: Vulkan URP will use MSAA samples count fallback from player settings. Prior to this x2 fallback would have been to upgrade to x4.(UUM-741)2021.3.…...

最新IntelliJ IDEA 2024.1 安装和快速配置教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…...

24应届生求职中QAQ

有没有大佬给个机会帮忙内推一下啊&#xff0c;找工作太难了QAQ。 最近一直在BOOS上找工作&#xff0c;但是结果不太理想&#xff0c;一直没有找到满意的工作&#xff0c;有没有大佬帮忙内推一下&#xff0c;有的话请私信我QAQ。...

centos7离线安装postgresql13

**一.**安装存储库RPM yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm二.使用yumdownloader下载安装包 mkdir pg_yum cd pg_yum yumdownloader --resolve postgresql13-server**三.**上传rpm包到安…...

【JavaSE】搞定String类

前言 本篇会细致讲解String类的常见用法&#xff0c;让小伙伴们搞定String类~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 常用的三种字符串构造 字符串长度length 字符串比较 比较 比较字符串的内容equals…...

数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活

目录 引言 一、数字乡村与农业现代化 1、智慧农业技术的应用 2、农业产业链的数字化转型 二、数字乡村与农村治理现代化 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民幸福生活 1、提升农业生产效益与农民收入 2、促进农村产业结构…...

【从零开始手搓12306项目】四、12306是如何成为全球最忙碌的网站之一?

4.1 12306有多忙碌 一天的请求量大概1600亿&#xff0c;平均180万/秒&#xff08;二八理论&#xff1a;20%的事件产生80%的请求&#xff09;&#xff0c;不适合二八理论&#xff0c;因为12306分时间放票 平均一年售出30亿张&#xff0c;高峰期日售票能力达到了2000万张 高峰期…...

WebKit简介及工作流程

文章目录 一、WebKit简介二、WebKit结构三、Webkit工作流程四、WebKit常见问题五、WebKit优点六、相关链接 一、WebKit简介 WebKit是一个开源的浏览器引擎&#xff0c;它的起源可以追溯到2001年&#xff0c;当时苹果公司推出了其首款基于Unix的操作系统Mac OS X。在2002年&…...

软考-系统集成项目管理中级--进度管理(输入输出很重要!!!本章占分较高,着重复习)

本章历年考题分值统计(16年11月及以后按新教材考的&#xff09; 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 12、参数估算:参数估算是一种基于历史数据和项目参数&#xff0c;使用某种算法来计算成本或持续时间的估算技术。参数估算是指利用历史数据之间的统计关系和…...

AndroidAutomotive模块介绍(一)整体介绍

前言 Android Automotive 是一个基本 Android 平台&#xff0c;可运行 IVI 系统中预安装的 Android 应用以及可选的第二方和第三方 Android 应用。 本系列文档将会系统的介绍 Android Automotive 的功能、架构、逻辑等。模块逻辑将从 应用api接口、系统服务、底层服务&#x…...

【开发问题记录】Nacos修改服务实例权重时报错

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 docker部署的nacos解决方案2.1.1 进入nacos容器2.1.2 查看当前目录2.1.3 进入data文件夹2.1.4 删除protocol文件2.2 本地部署的nacos 一、问题描述 1.1 产生原因 在运行项目时&#xff0c;在本地启动了一个服务…...

高级IO和5种IO模型

目录 1. 高级IO1.1 IO的基本概念1.2 OS如何得知外设当中有数据可读取1.3 OS如何处理从网卡中读取到的数据包1.4 IO的步骤 2. 五种IO模型2.1 利用钓鱼来理解2.2 阻塞IO2.3 非阻塞IO2.4 信号驱动IO2.5 IO多路转接2.6 异步IO 3. 高级IO的概念3.1 同步通信 VS 异步通信3.2 阻塞 VS …...

OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕

7.1实验效果 Hispark WiFi开发套件又提供一个oled屏幕&#xff0c;但是鸿蒙源码中没有这个屏幕的驱动&#xff0c;我们需要自己去移植。 以下是移植效果&#xff1a; 接口&#xff1a;I2C 使用引脚&#xff1a;HI_IO_NAME_GPIO_13 、 HI_IO_NAME_GPIO_14 7.2代码 这里我直…...

C#:循环中断

任务描述 实现九九乘法表&#xff0c;按照编程要求&#xff0c;使用break跳出循环 测试说明 测试过程&#xff1a; 平台将编译用户补全代码&#xff0c;并根据程序的输出判断程序是否正确。 以下是测试样例&#xff1a; 测试输入&#xff1a; 预期输出&#xff1a; we found…...

34. UE5 RPG实现鼠标点击移动

在前面&#xff0c;我们实现过使用键盘按键wasd去实现控制角色的移动&#xff0c;现在&#xff0c;我们实现了InputAction按键触发&#xff0c;后面&#xff0c;实现一下通过鼠标点击地面实现角色移动。 我们将实现两种效果的切换&#xff0c;如果你点击地面快速松开&#xff0…...

《二》Qt Creator工具介绍与使用

一、关于界面 点击文件--->新建文件或项目会出现如下图&#xff1a; 我们选择第一个 点击下一步下一步&#xff1a; 继续下一步直到结束&#xff1a; 二&#xff0c;具体文件介绍 我们点击pro查看以下 QT core gui第1行 表示使用qt的core和gui库&#xff0c;如果以后…...

20240415金融读报:市场信贷不能过于宽松声音碳领域新增文件

1、市场普遍认为&#xff0c;在经济转型背景下&#xff0c;当前的社会融资规模和信贷增长有助于经济高质量发展&#xff0c;过于宽松并不利于经济发展。&#xff08;已经有这个声音了&#xff0c;是不是说明我们已经脱离了U型曲线的最低点&#xff0c;在或快接近其后半段的1/2处…...

2024年第十五届蓝桥杯研究生组题目总结(Java、Python、C++)

2024年十五届蓝桥杯研究生组 今年的题较去年难度降低了很多&#xff0c;题量也少了2道。 Q1 劲舞团 读文件&#xff0c;找到最长的满足条件的子数组的长度 答案是&#xff1a;9 BufferedReader&#xff0c;fopen&#xff0c;open Q2 召唤数学精灵 找规律&#xff0c;周期…...

MindOpt APL向量化建模语法的介绍与应用(2)

前言 在数据科学、工程优化和其他科学计算领域中&#xff0c;向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言&#xff0c;为这些领域的专业人员提供了强大的工具&#xff0c;通过向量式和矩阵式变量声明以及丰富的内置数学运算支持&#xff0c;大大简化了数学建模…...

深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎

文章目录 1. 什么是GPU&#xff1f;2. GPU的工作原理3. GPU的应用领域4. GPU与CPU的比较参考与推荐 前言&#xff1a; 图形处理器&#xff08;GPU&#xff09;不再仅仅是用于图形渲染的硬件设备。如今&#xff0c;GPU已经成为加速人工智能、大数据计算和科学研究的关键引擎。本…...

【Java探索之旅】数组使用 初探JVM内存布局

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组的使用1.1 元素访问1.2 数组遍历 二、JVM的内存布局&#x1f324;️全篇总结 …...

RabbitMQ消息模型之Simple消息模型

simple消息模型 生产者 package com.example.demo02.mq.simple;import com.example.demo02.mq.util.ConnectionUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;import java.io.IOException;/*** author Allen* 4/10/2024 8:07 PM* versi…...

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS二次开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点…...

解决 windows+Ubuntu 时间不同步问题

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你的电脑装了 Windows Ubuntu 系统&#xff0c;肯定会遇到时间不同步的问题。那么如何解决呢&#xff1f;参考步骤如下&#xff1a; # 步骤一&#xff1a;进入到 Ubuntu 系统# 步骤二&#xff1a;执行如下三条命令即可 sud…...

Learn SRP 01

学习链接&#xff1a;Custom Render Pipeline (catlikecoding.com) 使用Unity版本&#xff1a;Unity 2022.3.5f1 1.A new Render Pipeline 1.1Project Setup 创建一个默认的3D项目&#xff0c;项目打开后可以到默认的包管理器删掉所有不需要的包&#xff0c;我们只使用Unit…...

NL2SQL进阶系列(4):ConvAI、DIN-SQL、C3-浙大、DAIL-SQL-阿里等16个业界开源应用实践详解[Text2SQL]

NL2SQL进阶系列(4)&#xff1a;ConvAI、DIN-SQL等16个业界开源应用实践详解[Text2SQL] NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2)&#xff1a…...

Python统计分析库之statsmodels使用详解

概要 Python statsmodels是一个强大的统计分析库,提供了丰富的统计模型和数据处理功能,可用于数据分析、预测建模等多个领域。本文将介绍statsmodels库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装statsmodels库非常简单,可以使用pip命令进行安装:…...

湛江市研发网站建设/网址如何被快速收录

成员函数的存储方式 学习C语言的变量定义时&#xff0c;我们就知道&#xff0c;定义一个变量&#xff0c;就需要在内存中申请空间&#xff0c;存放变量的数据。例如&#xff1a; double a; 此时&#xff0c;定义一个double类型的变量。double类型占据8个字节的内存空间&#x…...

昆山科技网站建设/刷评论网站推广

目录 流程管理项目流程 一、流程梳理&#xff08;以客户方内部团队&#xff0c;如部门经理为主&#xff09; 二、流程优化&#xff08;以顾问团队为主&#xff0c;内部团队确认&#xff09; 三、流程再造&#xff08;以双方团队合作为前提&#xff0c;公司级领导确认&#x…...

建筑网官网查询/seo计费怎么刷关键词的

距离上次写博客已经一周多时间了&#xff0c;上周在选择工作中&#xff0c;这周开始加入了新公司&#xff0c;开始了新项目的测试用例编写&#xff0c;此时将测试用例中的一些基本问题进行整理&#xff0c;有不足的地方后续继续进行修改&#xff0c;从最基础的开始写起。 进入新…...

网站开发投标书/今日新闻简讯30条

简单的局域网&#xff08;LAN&#xff09;通常由一台集线器&#xff08;或交换机&#xff09;和若干台微机组成。随着计算机数量的增加、网络规模的扩大&#xff0c;在越来越多的局域网环境中&#xff0c;交换机取代了集线器&#xff0c;多台交换机互连取代了单台交换机。在多交…...

新乡网站建设那家好/百度信息流投放

先把软件安装好&#xff0c;然后可以参考&#xff1a;srvctl常用命令分类&#xff1a;*增加 oracle asm/database/listener 注册信息eg&#xff1a;srvctl add asm -l LISTENER -p crs/dbserve-cluster/ASMPARAMETERFILE/registry.253.743836405eg: srvctl add database -d orc…...

网站的图片滚动怎么做的/重庆搜索引擎seo

这ListView真是麻烦&#xff0c;一个小小的FileBrowser废了将近2天。看来自己的功力还需要加强。 做FileBrowser中遇到几个ListView问题总结一下。 1、自定义样式 ListView其实和Asp.net里面的Repeater有点像&#xff0c;但是不同的是项的内容可以用一个layout文件来套用&#…...