JVM系统优化实践(6):年轻代、老年代与数据计算

news2024/11/15 21:54:54

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~


上回说道如果当前Survivor区中年龄相同的一批对象总大小 ≥ Survivor总数 × 50%,那么这批对象及比它们年龄更大的对象,就都直接进入老年代。但是也有可能在Minor GC之后,发现剩余的存活对象太多,导致其大小总和超过Survivor区域,那么就会把这些对象直接转移到老年代,也不计算所谓的50%。

在JDK1.6以前,老年代空间分配担保流程是这样的:

而在JDK1.6之后,它做了些微调:

老年代的垃圾回收算法和年轻代不同,对老年代触发垃圾回收的时机是:

1、在Minor GC之前:清理老年代空间;

2、在Minor GC之后:剩余对象太多会导致老年代空间不足;

而老年代的标记整理算法比年轻代回收算法慢10倍,它是这么运行的:

1、标记出老年代当前存活的对象;

2、移动对象,避免碎片化;

3、回收垃圾对象。

JDK1.6之后,-XX:HandlePromotionFailure参数已废弃,且JDK1.8无法使用。所以在知道了老年代的GC之后,如果需要做JVM性能调优,那么需要做的就是:

1、尽可能让对象在年轻代中分配和回收;

2、要极力避免年轻代频繁地进垃圾回收。

一次数据计算的案例分享:

1、一套自研的分布式数据计算系统;

2、单台机器负责100次/分钟的数据提取和计算;

3、每次提取10000条数据到内存,计算耗费10秒/次;

4、每条数据包含20个字段,平均在1K大小,10000条=10MB;

5、4C8G;

6、JVM参数:-Xms4096M -Xmn1500M;

7、年轻代和老年代的内存空间都为1500MB。

那么,这种配置下的计算任务,它多久会填满JVM?

1、年轻代为1500M(8:1:1划分,Eden区1200M,Survivor1区150M,Survivor2区150M)

2、老年代为1500M;

3、每次计算分配10M,每分钟执行100次,Eden很快被填满;

4、假设每次Minor GC时还有20个计算任务无法结束,也就是说每次有200M的空间无法回收;

5、200M > Survivor(150M),Minor GC后进入老年代;

6、每次都走担保流程,7次之后,老年代空间也会被填满;

7、如此循环往复,每隔7~8分钟就执行一次Full GC。

那么结合实际业务场景,主要问题在于每次Survivor放不下存活对象。因此优化方式也比较简单直接:

1、增加年轻代内存比例(调至2048M),老年代适度降低;

2、Full GC从7~8分钟/次,降至几小时一次,大幅提升性能;

3、还可以通过调整-XX:SurvivorRatio=8这个默认值,实现:将Eden区比例适当调低,避免通过动态判断对象年龄而进入老年代。

常见的GC垃圾回收器(型号):

1、Serial和Serial Old:分别用来回收年轻代和老年代的垃圾对象;

2、ParNew:一般用在年轻代;

3、CMS:一般用在老年代;

4、G1:统一收集年轻代和老年代。

最后说一个GC中最恐怖的现象:STW(Stop the World,类似于《斗罗》中菊鬼斗罗的「两级静止领域」)。

当Full GC时,JVM会直接停止所有系统线程,系统卡顿,不接受也不处理任何请求,直到Full GC执行完毕。这种现象,就是Stop the World。有的STW比较短,几毫秒就完了。如果在负担不重的情况下,这没什么问题。但如果在双十一的秒杀系统中发生的话,那么......

FAQ:

1、如果每次Minor GC之后,另一块Survivor区可以放下全部存活对象,那么根本不会进入老年代,也就几乎不会引起Full GC,关键问题是如何让Survivor能放下全部存活对象;

2、JVM最大内存 * N = 栈内存 + 年轻代 + 方法区 * N(N为机器数量)

栈内存 = QPS估值 * 1M * 20(倍数);

年轻代 = 30分钟(估算) * 60 * QPS估值 * 接口内存估值;

方法区 = 200M~500M。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

三八女神节有哪些数码好物?2023年三八女神节数码好物清单

2023年的三八女神节就快到了,大家还在烦恼,不知道有哪些数码好物?在此,我来给大家分享几款三八女神节实用性强的数码好物,一起来看看吧。 一、蓝牙耳机:南卡小音舱 参考价:239 推荐理由&…

flutter window安装过程

这里写自定义目录标题#下载相关官网地址:https://flutter.cn/docs/get-started/install/windows 根据官网下载相关包flutter_windows_3.7.5-stable.zip 解压到c盘,在path配置相关解压路径(c:\flutter)。 执行 where flutter dart ,发现没有提…

Pytorch深度学习实战3-5:详解计算图与自动微分机(附实例)

目录1 计算图原理2 基于计算图的传播3 神经网络计算图4 自动微分机5 Pytorch中的自动微分5.1 梯度缓存5.2 参数冻结1 计算图原理 计算图(Computational Graph)是机器学习领域中推导神经网络和其他模型算法,以及软件编程实现的有效工具。 计算图的核心是将模型表示…

Vue3 企业级项目实战:项目须知与课程约定

本节内容很重要,希望大家能够耐心看完。 Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发,升职加薪,快人一步。。「Vue3 企业级项目实战」由程序员十三撰写,2744人购买https://s.ju…

解决方案| anyRTC 融合其他厂商视频会议系统方案

背景 视频会议市场经历疫情后,不管是硬件视频会议还是云视频会议已经在各行各业铺开使用,特别是政府行业,职能部门除了几大硬件视频会议外,也开始逐渐尝试云视频会议,视频会议的场景运用除了日常的交流、沟通、学习外…

开启互联网赚钱模式

随着互联网的发展,现在几乎会玩手机和电脑的都离不开网络,自然出现了很多网络赚钱的项目,受到了很多新人创业者和做副业兼职者的欢迎。很多朋友都想利用电脑或手机在网上赚钱。其实不管做什么项目,都有一个过程,没有什…

【监控】Linux部署postgres_exporter及PG配置(非Docker)

目录一、下载及部署二、postgres_exporter配置1. 停止脚本stop.sh2. 启动脚本start.sh3. queries.yaml三、PostgreSQL数据库配置1. 修改postgresql.conf配置文件2. 创建用户、表、扩展等四、参考一、下载及部署 下载地址 选一个amd64下载 上传至服务器,解压 tax…

$ 6 :选择、循环

if-else语句 #include <stdio.h> //判断输入值是否大于0 int main() {int i;while (scanf("%d",&i)){if (i > 0)//不要在括号后加分号{printf("i is bigger than O\n");}else {printf("i is not bigger than O\n");}}return O; } …

cglib代理解析

工作原理 使用 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>对类和接口分别进行代理 DemoService package com.fanqiechaodan.user.service;/*** author fa…

itop-3568 开发板系统编程学习笔记(3)目录 IO

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录mkdir() 函数opendir() 和 closedir() 函数readdir() 函数综合实验mkdir() 函数 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h&g…

linux代码调试-gdb

在windows调试各类代码经常依托相关便利的IDE工具&#xff0c;如Microsoft的Visual Studio,TI的Code Composer Studio,ADI的CrossCore Embedded Studio ,ADI的VisualDSP&#xff0c;Renesas的CS for CC,NXP的S32 Design Studio…这些调试&#xff0c;或借助软、硬件仿真&#x…

JPA 之 Hibernate EntityManager 使用指南

Hibernate EntityManager 专题 参考&#xff1a; JPA – EntityManager常用API详解EntityManager基本概念 基本概念及获得 EntityManager 对象 基本概念 在使用持久化工具的时候&#xff0c;一般都有一个对象来操作数据库&#xff0c;在原生的Hibernate中叫做Session&…

排序之损失函数List-wise loss(系列3)

排序系列篇&#xff1a; 排序之指标集锦(系列1)原创 排序之损失函数pair-wise loss(系列2)排序之损失函数List-wise loss(系列3) 最早的关于list-wise的文章发表在Learning to Rank: From Pairwise Approach to Listwise Approach中&#xff0c;后面陆陆续续出了各种变形&#…

SpringBoot入门 - SpringBoot HelloWorld

我们了解了SpringBoot和SpringFramework的关系之后&#xff0c;我们可以开始创建一个Hello World级别的项目了。创建 SpringBoot Web 应用为快速进行开发&#xff0c;推荐你使用IDEA这类开发工具&#xff0c;它将大大提升你学习和开发的效率。选择 Spring InitializeSpring提供…

开源的 OA 办公系统 — 勾股 OA 4.3.01 发布

勾股 OA 办公系统是一款简单实用的开源的企业办公系统。系统集成了系统设置、人事管理、行政管理、消息管理、企业公告、知识库、审批流程设置、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等功能模块。系统简约&#xff0c;易于功能扩展&#xff0…

【vue】图标选择(elementUI和svg结合)

目标&#xff1a;在做菜单权限的时候需要选择图标&#xff0c;如果既想要用elementUI自带的图标&#xff0c;还想要自定义的图标&#xff0c;这时就需要二者结合一下如果用的是vue-admin-template&#xff0c;那svg组件和引入elementUI是不需要操作的&#xff0c;直接使用即可。…

pytest学习和使用17-Pytest如何重复执行用例?(pytest-repeat)

17-Pytest如何重复执行用例&#xff1f;&#xff08;pytest-repeat&#xff09;1 使用场景2 pytest-repeat插件2.1 环境要求2.2 插件安装3 pytest-repeat使用3.1 重复测试直到失败3.2 用例标记执行重复多次3.3 命令行参数--repeat-scope详解3.3.1 class示例3.3.2 module示例1 使…

如何在软件测试面试中脱颖而出?(附教程)天花板都这样回答

面试软件测试工程师岗位&#xff0c;是否真的如网上所说&#xff0c;需要不停刷面试题?面试题可能掌握的技巧实际是一样的&#xff0c;只是题目形式不一样&#xff0c;那么应该如何在面试中脱颖而出呢?今天我们就来聊一聊。 我录制了一整套完整的软件测试面试的话术教程&…

拿下32k成功入职阿里软件测试面试常见问题及回答技巧

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容…

测试结束参考标准

在软件消亡之前&#xff0c;如果没有测试的结束点&#xff0c;那么软件测试就永无休止&#xff0c;永远不可能结束。软件测试的结束点&#xff0c;要依据自己公司具体情况来制定&#xff0c;不能一概而论!个人认为测试结束点由以下几个条件决定&#xff1a; 1.基于“测试阶段”…