Jvm参数优化

news/2024/11/28 8:44:31/

Jvm参数优化

    • 背景
    • 1. 系统上线规划容量
      • - 分析
    • 2. 垃圾回收器选择
      • 吞吐量和响应时间
      • 垃圾回收器选择
    • 3. 规划各个分区的比例大小
    • 4. 对象年龄对少移动到老年代合适
    • 5. 对象多大放到老年代
    • 6. 垃圾回收器CMS老年代参数优化
    • 7. 配置OOM时的内存dump文件和GC日志
    • 8. 通用JVM参数模板

背景

假设项目每天100w次登陆请求,一个服务器节点8G内存,如何设置JVM参数?
在这里插入图片描述

1. 系统上线规划容量

- 分析

  1. 100W请求登录峰值在早上,预估峰值每秒100次登录请求
  2. 假设部署3台服务器.每台处理30次请求,假设登录请求处理需要1s,JVM新生代里每秒就要产生30个登陆对象,1s之后请求完毕的这些对象成为垃圾.
  3. 一个登陆请求对象假设20个字段,一个对象估算500字节,30个登陆佔用大约15kb,考虑到RPC和DB操作,网络通信、写库、写缓存一顿操作下来,可以扩大到20-50倍,大约1s产生几百k-1M数据。
  4. 假设2C4G机器部署,分配2G堆内存,新生代则只有几百M,按照1s1M的垃圾产生速度,几百秒就会触发一次MinorGC了
  5. 假设4C8G机器部署,分配4G堆内存,新生代分配2G,如此需要几个小时才会触发一次MinorGC。
    可以粗略的推断出来一个每天100w次请求的登录系统,按照4C8G的3实例集群配置,分配4G堆内存、2G新生代的JVM,可以保障系统的一个正常负载

2. 垃圾回收器选择

吞吐量和响应时间

吞吐量 = CPU在用户应用程序运行的时间 / (CPU在用户应用程序运行的时间 + CPU垃圾回收的时间)
响应时间 = 平均每次的GC的耗时
通常,吞吐优先还是响应优先这个在JVM中是一个两难之选,无法同时兼顾。

垃圾回收器选择

目前主流垃圾回收器CMS或者G1
G1是官方维护和推荐的垃圾回收器
在这里插入图片描述
系统对延迟敏感的推荐CMS
系统大内存,要求高吞吐的,采用G1回收器

3. 规划各个分区的比例大小

  • 指定堆内存的大小,这是系统上线必须要做的,-Xms初始堆大小,-Xmx 最大堆大小,一般指定为系统内存的一半.
  • 指定新生代大小-Xmn,官方推荐为3/8大小,根据业务场景去区分,无状态服务一般给到堆内存的3/4大小,有状态的服务(IM,网关)堆内存的1/3大小
  • 栈内存-Xss,设置单个线程栈的大小,默认值和JDK版本有关,一般默认512-1024kb
    在这里插入图片描述
    如果采用正常的JVM参数配置如下
-Xms3072M 
-Xmx3072M 
-Xss1M 
-XX:MetaspaceSize=256M 
-XX:MaxMetaspaceSize=256M 
-XX:SurvivorRatio=8 

这样设置可能会由于动态对象年龄判断原则导致频繁full gc
压测过程中,短时间(比如20S后)Eden区就满了,此时再运行的时候对象已经无法分配,会触发MinorGC,
假设在这次GC后S1装入100M,马上过20S又会触发一次MinorGC,多出来的100M存活对象+S1区的100M已经无法顺利放入到S2区,此时就会触发JVM的动态年龄机制,将一批100M左右的对象推到老年代保存,持续运行一段时间,系统可能一个小时候内就会触发一次FullGC。
按照默认8:1:1的比例来分配时, survivor区只有 1G的 10%左右,也就是几十到100M.
将JVM参数更改为下面参数

-Xms3072M   
-Xmx3072M   
-Xmn2048M   
-Xss1M   
-XX:MetaspaceSize=256M   
-XX:MaxMetaspaceSize=256M    
-XX:SurvivorRatio=8
  • 年轻代大小2G, eden与survivor的比例1.6g:0.2g
    这样可以防止每次垃圾回收过后,survivor对象太早超过 50% ,
    就可以降低因为对象动态年龄判断原则导致的对象频繁进入老年代的问题,
    在这里插入图片描述

4. 对象年龄对少移动到老年代合适

如果对象这么长时间都没被回收,比如2分钟没有回收,可以认为这些对象是会存活的比较长的对象,从而移动到老年代,而不是继续一直占用survivor区空间。
默认值是15, 意味着对象要经过15次minor GC才会进入老年代
调整参数如下:

‐Xms3072M   
‐Xmx3072M   
‐Xmn2048M   
‐Xss1M   
‐XX:MetaspaceSize=256M   
‐XX:MaxMetaspaceSize=256M   
‐XX:SurvivorRatio=8   
‐XX:MaxTenuringThreshold=5  

5. 对象多大放到老年代

对象直接进入老年代参数-XX:PretenureSizeThreshold

‐Xms3072M   
‐Xmx3072M   
‐Xmn2048M   
‐Xss1M   
‐XX:MetaspaceSize=256M   
‐XX:MaxMetaspaceSize=256M   
‐XX:SurvivorRatio=8   
‐XX:MaxTenuringThreshold=5   
‐XX:PretenureSizeThreshold=1M 

6. 垃圾回收器CMS老年代参数优化

JDK8默认的垃圾回收器是-XX:+UseParallelGC(年轻代)和-XX:+UseParallelOldGC(老年代).
如果内存比较大,建议使用G1

‐Xms3072M   
‐Xmx3072M   
‐Xmn2048M   
‐Xss1M   
‐XX:MetaspaceSize=256M   
‐XX:MaxMetaspaceSize=256M   
‐XX:SurvivorRatio=8    
‐XX:MaxTenuringThreshold=5   
‐XX:PretenureSizeThreshold=1M   
‐XX:+UseParNewGC   
‐XX:+UseConcMarkSweepGC   
‐XX:CMSInitiatingOccupancyFraction=70   
‐XX:+UseCMSInitiatingOccupancyOnly   
‐XX:+AlwaysPreTouch 

参数说明
1.‐Xms3072M ‐Xmx3072M 最小最大堆设置为3g,最大最小设置为一致防止内存抖动
2.‐Xss1M 线程栈1m
3.‐Xmn2048M ‐XX:SurvivorRatio=8 年轻代大小2g,eden与survivor的比例为8:1:1,也就是1.6g:0.2g:0.2g
4.-XX:MaxTenuringThreshold=5 年龄为5进入老年代 5.‐XX:PretenureSizeThreshold=1M 大于1m的大对象直接在老年代生成
6.‐XX:+UseParNewGC ‐XX:+UseConcMarkSweepGC 使用ParNew+cms垃圾回收器组合
7.‐XX:CMSInitiatingOccupancyFraction=70 老年代中对象达到这个比例后触发fullgc
8.‐XX:+UseCMSInitiatinpOccupancyOnly 老年代中对象达到这个比例后触发fullgc,每次
9.‐XX:+AlwaysPreTouch 强制操作系统把内存真正分配给IVM,而不是用时才分配。

7. 配置OOM时的内存dump文件和GC日志

增加了GC日志打印、OOM自动dump等配置内容

  • dump配置
-XX:+HeapDumpOnOutOfMemoryError 
-XX:+HeapDumpOnOutOfMemoryError   
-XX:HeapDumpPath=${LOGDIR}/  
  • GC日志配置
-Xloggc:/log/xxx/gc.log   
-XX:+PrintGCDateStamps   
-XX:+PrintGCDetails 

8. 通用JVM参数模板

  • CMS回收器参数模板
-Xms4g  
-Xmx4g  
-Xmn2g  
-Xss1m  
-XX:SurvivorRatio=8  
-XX:MaxTenuringThreshold=10  
-XX:+UseConcMarkSweepGC  
-XX:CMSInitiatingOccupancyFraction=70  
-XX:+UseCMSInitiatingOccupancyOnly  
-XX:+AlwaysPreTouch  
-XX:+HeapDumpOnOutOfMemoryError  
-verbose:gc  
-XX:+PrintGCDetails  
-XX:+PrintGCDateStamps  
-XX:+PrintGCTimeStamps  
-Xloggc:gc.log 
  • G1回收器参数模板
-Xms8g  
-Xmx8g  
-Xss1m  
-XX:+UseG1GC  
-XX:MaxGCPauseMillis=150  
-XX:InitiatingHeapOccupancyPercent=40  
-XX:+HeapDumpOnOutOfMemoryError  
-verbose:gc  
-XX:+PrintGCDetails  
-XX:+PrintGCDateStamps  
-XX:+PrintGCTimeStamps  
-Xloggc:gc.log

在这里插入图片描述


http://www.ppmy.cn/news/978072.html

相关文章

CMS指纹识别是什么?

CMS(Content Management System)指的是内容管理系统,如WordPress、Joomla等。CMS系统非常常见,几乎所有大型网站都使用CMS来管理其网站的内容。由于常见CMS的漏洞较多,因此黑客将不断尝试利用这些漏洞攻击CMS系统,导致网站的安全问题。为了保护网站的安全,可以使用CMS指…

【Koa】[NoSQL] Koa中相关介绍和使用Redis MongoDB增删改查

目录 NoSQL非关系型数据库关系型数据库(RMDB)介绍非关系型数据库(NoSQL)介绍Redis & MongoDB 在 Koa 中使用 Redis (了解)Redis 的安装和使用在 Koa 中连接 和 调用 Redis 在 Koa 中使用 MongoDBMongoDB 的安装MongoShell 操作…

未来行星探索希望:新型多脚机器人-团队版

机器人正在探索一个模拟的外星环境 即使一个机器人失败了,其余的团队成员也可以抵消它的损失。 背景 虽然探测器取得了令人难以置信的发现,但它们的轮子可能会拖慢它们的速度,而不稳定的地形可能会导致损坏。虽然没有东西可以取代“毅力号”…

PyTorch Lightning快速学习教程一:快速训练一个基础模型

粉丝量突破1200了!找到了喜欢的岗位,毕业上班刚好也有20天,为了督促自己终身学习的态度,继续开始坚持写写博客,沉淀并总结知识! 介绍:PyTorch Lightning是针对科研人员、机器学习开发者专门设计…

leetcode 面试题 判定是否互为字符重排

⭐️ 题目描述 🌟 leetcode链接:判定是否互为字符重排 思路: 两个字符串的每个字母和数量都相等。那么 s2 一定可以排成 s1 字符串。 代码: bool CheckPermutation(char* s1, char* s2){char hash1[26] {0};char hash2[26] {…

华为OD机试真题100分题 C/C++/Java/Python/Js/Go【补种未成活胡杨】

题目描述: 【补种未成活胡杨】 近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树? 输入描述: N 总种植数量 M 未成活胡杨数…

基于OpenCV的红绿灯识别

基于OpenCV的红绿灯识别 技术背景 为了实现轻舟航天机器人实现红绿灯的识别,决定采用传统算法OpenCV视觉技术。 技术介绍 航天机器人的红绿灯识别主要基于传统计算机视觉技术,利用OpenCV算法对视频流进行处理,以获取红绿灯的状态信息。具…

draw.io画图时,用一个箭头(线段)连结一个矩形和直线时,发现,无论怎么调节,都无法使其无缝连接。

问题描述:draw.io画图时,用一个箭头(线段)连结一个矩形和直线时,发现,无论怎么调节,都无法使其无缝连接。要么少一段,如图1所示。要么多一段,如图2所示。 图1&#xff0c…