小工具      在线工具  汉语词典  css  js  c++  java

JVM调优

Java,算法 额外说明

收录于:42天前

由于GC操作会挂起所有应用程序线程,因此JVM必须利用尽可能多的CPU资源,以尽可能缩短暂停时间。

JVM调优主要涉及以下两个指标的调整:

  • 暂停时间:垃圾收集器在进行垃圾收集时中断应用程序执行的时间。 -XX:MaxGCPauseMillis
  • 吞吐量:垃圾收集时间与总时间的比值:1/(1+n),吞吐量为1-1/(1+n)。 -XX:GC时间比率=n

我们项目的配置API和MT层配置如下:

1. API配置(CMS标记清除算法)

-Xms3072m -Xmx3072m -Xmn1500m -XX:SurvivorRatio=8 -XX:元空间大小=512m -XX:MaxMetaspaceSize=512m -XX:+禁用ExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection-XX:CMSInitiatingOccupancyFraction=70

2. MT配置(G1GC算法)

-Xms3g -Xmx3g -XX:元空间大小=256m -XX:+使用G1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8

3、验证配置的JVM参数,可以在发布日志中看到,如下:

[2020-12-29 08:43:12] [INFO] JVM参数配置成功。当前 JVM 参数为:

#!/bin/sh

APPNAME=Api.jar

JAVA_OPTS =“-Xms3072m -Xmx3072m -Xmn1500m -XX:SurvivorRatio = 8 -XX:MetaspaceSize = 512m -XX:MaxMetaspaceSize = 512m -XX:+禁用

leExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70

导出JAVA_OPTS

导出应用程序名称

结论:上面的API和MT配置是不同的。对此不必太担心。主要原因是使用的垃圾收集器不同。同时需要注意-Xms、-Xmx、-Xmn、MetaspaceSize的大小配置。

CMS是一种优先考虑响应时间的垃圾收集器,适用于网络游戏、电子商务、电信领域等应用服务器。所以我们的底层服务(MT层)使用CMS收集器

G1 GC 旨在取代 CMS,避免 CMS 的垃圾碎片。这里有一个导出excel的操作,可以避免垃圾碎片。

4.CMS回收器

CMS(Concurrent Mark Sweep)并发标记清除收集器

CMS(-XX:+UseConcMarkSweepGC)收集器用于老年代,收集主收集中不太可能到达的老对象。它与应用程序并发执行,老年代始终有足够的空间,保证年轻代不会出现晋升失败的情况。

CMS是一个基于标记和清除算法的多线程老一代垃圾收集器。 CMS是一种优先考虑响应时间的垃圾收集器,适用于网络游戏、电子商务、电信领域等应用服务器。

CMS与应用程序并发执行,即当CMS对老年代进行垃圾回收时,应用程序大部分时间可以继续执行,应用程序只需要很短的暂停。

CMS垃圾收集的特点是应用程序可以并发执行,因此应用程序停顿时间短,达到高响应时间的目的。

缺点方面,除了消耗较多的CPU资源外,由于是基于mark-clear算法,所以会造成内存碎片。为了解决内存碎片问题,CMS提供了JVM参数:-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=1,来配置老年代在进行Full GC时进行压缩和排序,并将内存碎片处理掉,其中配置了 CMSFullGCsBeforeCompaction。在执行内存压缩之前应该执行多少次Full GC。

CMS执行流程:初始标记(应用程序需要暂停)、并发标记(与应用程序并发执行)、并发预清理、重新标记、并发清除(应用程序需要暂停)、并发重置。

5、G1 GC(全称Garbage-First垃圾收集器,通过-XX:+UseG1GC参数启用)

G1 GC 旨在取代 CMS。与CMS相比,G1具有以下优势:

1.可预测的暂停模型

2.避免CMS垃圾碎片

3、超大桩性能更好

G1收集器的亮点之一是它使用暂停预测模型,根据用户配置的暂停时间来选择CSet的大小,从而达到用户期望的应用程序暂停时间。通过 -XX:MaxGCPauseMillis 参数设置。这有点类似于 ParallelScavenge 收集器。关于暂停时间的设置,越短越好。设置时间越短,意味着每次收集的CSet越小,这会导致垃圾逐渐堆积,最终不得不退化为Serial GC;如果暂停时间设置太长,会导致每次暂停时间过长,从而影响程序对外的响应时间。

G1垃圾收集分为两个阶段:

1.全局并发标记阶段(Global Concurrent Marking)、初始标记、并发标记、最终标记、清理

2、复制存活对象阶段(疏散),将一个Region中的存活对象复制到另一个Region,实现垃圾收集和清理。

六种名词解释

-Xms是jvm启动时分配的内存,如-Xms200m,表示分配200M

-Xmx是jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能占用500M内存。

-Xss是为jvm启动的每个线程分配的内存大小。 JDK1.4 中默认为 256K,JDK1.5+ 中默认为 1M。

-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小+老年代大小+持久代大小。持久代一般固定大小为64m,因此增加年轻代会减少老年代的大小。该值对系统性能影响很大。 Sun官方建议将其配置为整个堆的3/8。

-XX:+UseG1GC:使用G1垃圾收集器

-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,启用老年代的压缩

-XX:CMSFullGCsBeforeCompaction=0:当启用上述配置时,此处设置将使用多少次Full GC来压缩老年代。

-XX:+DisableExplicitGC:该参数用于禁止代码中显式调用GC。代码如何显示GC调用?它是通过 System.gc() 函数调用的。如果添加了这个JVM启动参数,那么代码中调用System.gc()将没有任何效果,相当于没有这行代码。系统自动触发GC,不受影响。

-XX:ParallelGCThreads=20:配置并行收集器的线程数,即有多少个线程可以同时进行垃圾收集。该值最好配置为等于处理器的数量。默认毫秒

-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最大时间。如果不能满足这个时间,JVM会自动调整年轻代的大小来满足这个值。默认毫秒

-XX:MetaspaceSize 元空间的大小。元空间的性质与永久代类似。它们都是JVM规范中方法区的实现。

不过,元空间和永久代最大的区别在于,元空间不在虚拟机中,而是使用本地内存。因此,元空间大小仅受本地内存限制。

默认20M

如果不配置-XX:MetaspaceSize,则触发FGC的阈值为21807104(约20.8m)。这个值可以通过 jinfo -flag MetaspaceSize pid 获得;

如果配置了-XX:MetaspaceSize,则触发FGC的阈值就是配置的值;

如果MaxMetaspaceSize设置太小,可能会导致频繁的FullGC甚至OOM;

MetaspaceSize和MaxMetaspaceSize设置大小相同;

整个JVM内存大小=年轻代大小+老年代大小+持久代大小

将 GC 打印到日志文件

-XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/Users/sunww/Desktop/logs/gc.log

链接:https://www.jianshu.com/p/b448c21d2e71

https://www.cnblogs.com/sxdcgaq8080/p/11089841.html

https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

https://zhuanlan.zhihu.com/p/141669715

https://www.cnblogs.com/yuanzipeng/p/13374690.html

. . .

相关推荐

额外说明

工作常用Linux命令学习总结

cd cd命令,用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。 cd /home 进入 '/ home' 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~us

额外说明

【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近要实现个小功能:计时

额外说明

【C语言_文件_进程_进程间通讯 常用函数/命令 + 实例】(后续更新见.md带目录版:http://t.csdnimg.cn/jlpQa)

.md带目录版:http://t.csdnimg.cn/jlpQa  文件相关命令: ps -aux|grep init? //搜索包含init名称的进程 top //linux下的资源管理器(动态)

额外说明

Flink 统计页面点击量

前言 在一些大型的电商网站上,对于产品经理或线上推广的营销人员来说,经常需要对页面的点击量进行分析统计,从而为页面的广告投放做更精确的数据支撑; 在实际的业务场景中,大致是这样的一个流程,页面先做用户行为的日志数据埋点,然后由实时或准实时应用将行为数据经

额外说明

数据结构与算法的力量:编写更高效的代码

文章目录 为什么数据结构和算法重要? 1. 提高性能 2. 节省资源 3. 解决复杂问题 4. 改进代码质量 常见数据结构和算法 数据结构 1. 数组(Array) 2. 链表(Linked List) 3. 栈(Stack) 4. 队列(Queue)

额外说明

C语言第六课----------循环语句-------逻辑代码必备

作者前言  欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 分支语句         if         switch 循环语句      

额外说明

大数据学习笔记59:初探Kafka消息系统

文章目录 一、Kafka概述 (一)Kafka是什么? (二)Kafka能做什么? (三)Kafka基本概念 1、Broker(经纪人) 2、Topic(主题) 3、Partition(分区) 4、Producer(生产者) 5、Consumer(消费者

额外说明

无心剑中译叶芝诗18首

文章目录 1、两鬓染霜 2、华衣 3、饮酒歌 4、山盟海誓 5、他谈起情人谷 6、长久沉默后 7、漫步柳园 8、茵纳斯弗利岛 9、哀悼失恋 10、时辰到,智慧来 11、心绪 12、国色天香 13、诗人致所爱 14、箭 15、情愁 16、吾书去何处 17、

额外说明

k8s和docker简单介绍

当涉及到容器技术和容器编排时,Docker和Kubernetes是两个重要的概念。我将更详细地介绍它们以及它们之间的关系。 Docker: Docker是一种容器化技术,它允许你将应用程序及其依赖项打包到一个称为"容器"的封闭环境中。每个容器都包含应用程

额外说明

ES6学习笔记03:变量的解构赋值

ES6学习笔记03:变量的解构赋值 如果想从复杂数据结构(数组、对象)中获取某一个数据,可能需要大量的遍历操作才能完成。通过解构赋值,这一过程可以得到简化。 1、字符串的解构赋值 其实,Python也具有字符串的解构赋值特性。 2、数组的解构赋值 其实,

ads via 小工具