GC调优

news2024/11/16 5:53:10

GC调优

    • 一、新生代调优
    • 二、幸存区调优
    • 三、老年代调优
    • 四、GC调优案例
      • 案例一:Full GC和Minor GC频繁
      • 案例二:请求高峰期发生Full GC,单次暂停时间特别长(CMS)
      • 案例三:老年代充裕情况下,发生Full GC(CMS 1.7)

预备知识
● 掌握GC相关的JVM参数,会基本的空间调整
● 掌握相关工具
● 明白一点:调优跟应用、环境有关,没有放之四海而皆准的法则(具体到实际应用需要根据实际情况进行调整)

JVM参数可通过oracle官网查看也可通过命令查看当前环境下虚拟机运行参数
"D:\Java\jdk1.8\bin\java" -XX:+PrintFlagsFinal -version | findstr "GC" ( findstr “GC”===>找到与GC相关的参数)
在这里插入图片描述

调优领域
● 内存
● 锁竞争
● CPU占用
● IO
● GC
垃圾回收的调优仅仅是众多调优其中的一个方向,若要使应用程序的性能有全面的提升需从各个领域深入分析进而调优

确定目标
低延迟/高吞吐量? 选择合适的GC
● CMS G1 ZGC
● ParallelGC
● Zing

最快的GC是不发生GC
首先排除减少因为自身编写的代码而引发的内存问题

● 查看Full GC前后的内存占用,考虑以下几个问题
数据是不是太多?
数据表示是否太臃肿?
——对象图
——对象大小
是否存在内存泄漏?

一、新生代调优

● 新生代的特点

所有的new操作分配内存都是非常廉价的
————TLAB
死亡对象回收零代价
大部分对象用过即死(朝生夕死)
MInor GC 所用时间远小于Full GC
TLAB===>thread-local allocation buffer 【每个线程都会在伊甸园中分配一块私有区域TLAB),当new一个对象时首先会检查TLAB缓冲区中有无可用内存,若有,则优先会在此区域进行对象分配;为什么会如此分配?===>对象分配也存在线程安全的问题,例如线程1在分配内存还未结束过程中线程2不能也来分配这块内存,否则会造成内存分配混乱,因此在做对象的内存分配时,也要做线程并发安全的保护,这个过程是由JVM来实现的===>TLAB会让每个线程用自己私有的伊甸园内存来进行分配(此时即使多个线程同时创建对象也不会产生内存占用干扰)】

● 增大新生代内存是新生代调优的最有效方式。那么新生代内存越大越好么?
在这里插入图片描述
oracle官方建议:young generation greater than 25% and less than 50% of the overall heap size===>大于堆的25%以上小于堆的50%

不是
——新生代内存太小:频繁触发Minor GC,会STW,会使得吞吐量下降
——新生代内存太大:老年代内存占比有所降低,会更频繁地触发Full GC。而且触发Minor GC时,清理新生代所花费的时间会更长
新生代内存设置为能容纳所有 [并发量*(请求——响应)] 的数据为宜

在这里插入图片描述
为什么设置为并发量并发量*(请求——响应)可称为理想状态?
一次请求响应的过程以后其中大部分对象都会被回收,而只要一次请求+并发量占用的内存不超过新生代内存就不会触发或较少触发新生代的垃圾回收

二、幸存区调优

● 幸存区大到能够保存 【当前活跃对象+需要晋升的对象】
● 晋升阈值配置得当,让长时间存活的对象尽快晋升
-XX:MaxTenuringThreshold=threshold
-XX:+PrintTenuringDistribution

三、老年代调优

以CMS为例
● CMS的老年代内存越大越好(预留更多空间,避免浮动垃圾引起的并发失败)
● 先尝试不做调优,如果没有Full GC则说明老年代空间很充裕,否则先尝试调优新生代
● 观察发生Full GC时老年代内存占用,将老年代内存预设调大1/4~1/3
—— -XX:CMSInitiatingOccupancyFraction=percent【老年代空间占用达到老年代总内存多少时使用CMS进行垃圾回收】

浮动垃圾:垃圾回收的同时其他用户线程也在运行就会产生新的垃圾,这些新的垃圾称为浮动垃圾

四、GC调优案例

案例一:Full GC和Minor GC频繁

GC频繁说明空间紧张,若是新生代的空间紧张,当业务高峰期时大量对象被创建将新生代的空间很快占满,这时幸存区空间紧张使对象晋升预值降低,导致很多本来生存周期很短的对象也会被晋升到老年代,进一步触发老年代Full GC 的频繁发生

案例二:请求高峰期发生Full GC,单次暂停时间特别长(CMS)

CMS垃圾回收器在初始及并发标记耗时较短,而重新标记阶段较慢(CMS在重新标记时需要扫描整个堆内存)。使用-XX:+CMScavengeBeforeRemark调优参数在重新标记发生之前先对新生代的对象做一次垃圾清理,清理之后存活对象即可减少,此时重新标记时需要标记和查找的对象也随之减少

案例三:老年代充裕情况下,发生Full GC(CMS 1.7)

由于永久代内存不足导致(1.7以前永久代内存不足会触发整个堆的Full GC)

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

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

相关文章

SQL中灵活的视图

文章目录视图的创建、嵌套及特性创建视图查询视图视图的嵌套常见的8个使用场景场景一:仅提供需要的数据场景二:对特定的用户仅开放特定的数据,达到保护敏感数据的目的,提升了数据安全性;仅筛选需要的数据场景四&#x…

迭代器模式 实现ES大量数据查询

目录 项目需求 要求 普通策略 升级策略:使用迭代器模式 迭代器模式组成 代码实现 查询实体 返回实体 实现类 代码测试 mock的ES返回结果json数据 第一次返回结果 第二次返回结果 第三次返回结果 postMan请求, 控制台打印结果 项目需求 数据从Mysq…

云计算服务安全指南

声明 本文是学习GB-T 31167-2014 信息安全技术 云计算服务安全指南. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 云计算服务安全退出服务 9.1退出要求 合同到期或其他原因都可能导致客户退出云计算服务,或将数据和业务系统迁…

植物大战僵尸:代码实现自动收集阳光

通过阳光增加的值为切入点,找到自动收集阳光的关键判断并实现自动收集阳光,首先我们猜测当阳光出现后,我们是否会去点击,这个过程必然是由一个判断和一个时钟周期事件来控制的,那么当我们点击下落的阳光以后&#xff0…

DC-UNet:重新思考UNet架构和双通道高效CNN医学图像

摘要 经典UNet的体系架构在某些方面存在着局限性。因此本文对其结构提出了改进。1)设计高效的CNN架构来取代编码器和解码器;2)在最先进的U-Net模型的基础上,应用残差模块来取代编码器和解码器之间的跳过连接来进行改进。 医学图像分割是通过一些自动和半自动的方法…

linux系统中块设备的基本实现方法

大家好,今天主要和大家聊一聊,如何使用linux系统中的块设备的实现方法。 目录 第一:块设备基本简介 第二:块设备驱动框架 第三:实现程序代码实现 第一:块设备基本简介 块设备驱动与字符设备驱动之间的主…

双指针:环形链表II

题目:142. 环形链表 II 我们知道,判断一个链表是否为环是这样的: public boolean hasCycle(ListNode head) {ListNode slow head,quickly head;while(quickly ! null && quickly.next ! null){slow slow.next;quickly quickly.n…

【javaSE】中异常如何处理

目录 文章目录 一、异常的初识 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 二、异常的处理和抛出 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.4异常的处理流程 三、自定义异常类 3.1举例:实现一个用户登录功能 一、异常的初识 1.1异常的概念 在…

Perl语法

Perl从许多语言中借用了语法和概念:awk,sed,C,Bourne Shell,Smalltalk,Lisp甚至是英语。每个简单的语句必须以分号(;)结尾,和Java类似,与Python不同。 一、扩…

【苹果推群发iMessage推】软件安装它起首将消息发送到Apple Push服务器,而后Apple Push服务器将消息发送到装配了应用程序的手机

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

《小猫猫大课堂》——数组,操作符,常见关键字

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发, 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我…

Java--方法重写

1)概念 重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据…

VUE动态组件,插槽和自定义指令

文章目录动态组件1.component组件的使用-keep-alive的使用keep-alive生命周期学习keep-alive组件的include和exclude属性include(指定keep-alive的哪些组件可以被缓存,不指定的话默认所有都会被缓存)exclude(排除项,与include刚好相反,二者不能同时使用)插槽v-slot指令v-slot的…

NodeJS - Express使用

文章目录1. 参数1.1 获取URL中的动态参数2. 静态资源2.1 挂载路径前缀3. nodemon4.1路由4.1 路由的匹配过程4.2 模块化路由4.3 为路由模块添加前缀5. 中间件5.1 全局生效的中间件5.2 全局生效中间件的简化形式5.3 中间件的作用5.4 局部生效的中间件5.5 定义多个局部中间件5.6 使…

计算机xxxxxxx

文章目录1.互联网的两大组成部分(边缘部分与核心部分)的特点是什么?它们的工作方式各有什么特点?2.简述分组交换的要点。3.试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。4.网络协议的三个要素是什么?各…

十二、生产者和消费者问题、队列、线程池

内容 理解消费者、生产者的案例执行过程, 理解用队列方式做消费者、生产者的案例 会使用线程池运行任务, 理解ThreadPoolExecutor7个参数的含义(会根据需要 通过参数控制线程池的总数量) 匿名内部类里的异常处理 Thread 使用匿名内部类…

VScode中不同目录间python库函数的调用

问题描述 vscode中跨目录的模块调用远不如pycharm中的来的简单,在pycharm中即使是不同库文件夹中子函数也可以进行互相调用。而在VScode中则需要我们手动向其中添加依赖路径。如下相同的文件结构,在pycharm中可以简单的在model_arc_pesudo中导入model中的…

HTTP传输过程

简介 HTTPS是在HTTP的基础上和ssl/tls证书结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能.很好的解决了解决了http的三个缺点(被监听、被篡改、被伪装) 对称加密和非对称加密 对称加密 即加密的密钥和解密的密钥相同, 非对称加…

1801. 积压订单中的订单总数

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个二维整数数组 orders &…

【HTMLCSS】运维、后端你该会的前端基本内容

文章目录前言一、HTML5基础1.1、前端开发的核心技术1.2、Web组成标准1.3、HTML 实例1.3.1、第一个网页1.4、 文本标签1.5、转义字符1.6、图片1.7、超链接1.8、列表1.8.1、无序列表1.8.2、有序列表1.8.3、自定义列表1.9、表格1.9.1、合并单元格1.10、表单二、CSS基础2.1、入门2.…