JVM性能调优

78f6ef5a57ce42c6b236b566f0e3a828.jpg遇到以下情况,就需要考虑进行JVM调优了:

 

 

Heap内存(老年代)持续上涨达到设置的最大内存值;

 

Full GC 次数频繁;

 

GC 停顿时间过长(超过1秒);

 

应用出现OutOfMemory 等内存异常;

 

应用中有使用本地缓存且占用大量内存空间;

 

系统吞吐量与响应性能不高或下降。

 

JVM调优的基本原则

JVM调优是一个手段,但并不一定所有问题都可以通过JVM进行调优解决,因此,在进行JVM调优时,我们要遵循一些原则:

 

大多数的Java应用不需要进行JVM优化;

 

大多数导致GC问题的原因是代码层面的问题导致的(代码层面);

 

上线之前,应先考虑将机器的JVM参数设置到最优;

 

减少创建对象的数量(代码层面);

 

减少使用全局变量和大对象(代码层面);

 

优先架构调优和代码调优,JVM优化是不得已的手段(代码、架构层面);

 

分析GC情况优化代码比优化JVM参数更好(代码层面);

 

通过以上原则,我们发现,其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”。

 

JVM调优目标

调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。

 

延迟:GC低停顿和GC低频率;

低内存占用;

高吞吐量;

其中,任何一个属性性能的提高,几乎都是以牺牲其他属性性能的损为代价的,不可兼得。具体根据在业务中的重要性确定。

 

JVM调优量化目标

下面展示了一些JVM调优的量化目标参考实例:

 

Heap 内存使用率 <= 70%;

 

Old generation内存使用率<= 70%;

 

avgpause <= 1秒;

 

Full gc 次数0 或 avg pause interval >= 24小时 ;

 

注意:不同应用的JVM调优量化目标是不一样的。

 

JVM调优的步骤

一般情况下,JVM调优可通过以下步骤进行:

 

分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点;

 

确定JVM调优量化目标;

 

确定JVM调优参数(根据历史JVM参数来调整);

 

依次调优内存、延迟、吞吐量等指标;

 

对比观察调优前后的差异;

 

不断的分析和调整,直到找到合适的JVM参数配置;

 

找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。

 

以上操作步骤中,某些步骤是需要多次不断迭代完成的。一般是从满足程序的内存使用需求开始的,之后是时间延迟的要求,最后才是吞吐量的要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。

 

JVM参数

JVM调优最重要的工具就是JVM参数了。先来了解一下JVM参数相关内容。

 

-XX 参数被称为不稳定参数,此类参数的设置很容易引起JVM 性能上的差异,使JVM存在极大的不稳定性。如果此类参数设置合理将大大提高JVM的性能及稳定性。

 

不稳定参数语法规则包含以下内容。

 

布尔类型参数值:

 

-XX:+<option> '+'表示启用该选项

 

-XX:-<option> '-'表示关闭该选项

 

数字类型参数值:

 

-XX:<option>=<number>给选项设置一个数字类型值,可跟随单位,例如:'m'或'M'表示兆字节;'k'或'K'千字节;'g'或'G'千兆字节。32K与32768是相同大小的。

字符串类型参数值:

 

-XX:<option>=<string>给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。例如:-XX:HeapDumpPath=./dump.core

JVM参数解析及调优

比如以下参数示例:

 

-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15

 

 

上面为Java7及以前版本的示例,在Java8中永久代的参数-XX:PermSize和-XX:MaxPermSize已经失效。这在前面章节中已经讲到。

 

参数解析:

 

-Xmx4g:堆内存最大值为4GB。

 

-Xms4g:初始化堆内存大小为4GB。

 

-Xmn1200m:设置年轻代大小为1200MB。增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

 

-Xss512k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1MB,以前每个线程堆栈大小为256K。应根据应用线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

 

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

 

-XX:SurvivorRatio=8:设置年轻代中Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

 

-XX:PermSize=100m:初始化永久代大小为100MB。

 

-XX:MaxPermSize=256m:设置持久代大小为256MB。

 

-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 示例 2&#xff1a; 输入…

使用pe安装windows操作系统

一、系统安装前准备工作&#xff0c;制作系统盘 &#xff08;1&#xff09;拷贝电脑上的资料 &#xff08;2&#xff09;准备一个至少8G的U盘 &#xff08;3&#xff09;下载windows镜像文件及pe软件 通过百度网盘可下载下列软件及镜像 windows镜像文件&#xff08;百度网盘…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

Kalman滤波、扩展Kalman滤波、无迹Kalman滤波和异步滤波的原理及其Matlab代码

目录 引言Kalman滤波代码及其结果展示 扩展Kalman滤波代码及其结果展示 无迹Kalman滤波无迹变换无迹Kalman滤波代码及其结果展示 异步无迹Kalman滤波原理代码及其结果展示 引言 本文给出了Kalman Filter&#xff08;卡尔曼滤波&#xff09;、Extended Kalman Filter&#xff0…

蓝桥杯Web组学习总结 - 目录导航版

HTML5 HTML 基础标签 HTML5 标签列表 HTML5 新特性 HTML5都有哪些新特性&#xff1f; CSS3 CSS 基础语法 CSS参考手册 盒子模型 CSS Box Model (盒子模型) 浮动与定位&#xff1f;&#xff1f; CSS 浮动(float)与定位(position) CSS布局之浮动和定位 CSS3 新特性 …

高效扫频阻垢装置广谱感应水处理设备介绍工作原理使用参数和选型

​ 1&#xff1a;高效扫频阻垢装置设备介绍 高效扫频阻垢装置是一种通过控制箱释放变频电磁信号&#xff0c;传输到信号放大装置&#xff0c;管道外侧的电磁线圈和电锤产生高频机械振动&#xff0c;在管道和水中传输&#xff0c;通过共振机理破坏水分子之间的氢键&#xff0c;产…

10天玩转Python第2天:python判断语句基础示例全面详解与代码练习

目录 1.课程之前1.1 复习和反馈1.2 作业1.3 今日内容1.4 字符串格式化的补充1.5 运算符1.5.1 逻辑运算符1.5.2 赋值运算符1.5.3 运算符优先 2.判断2.1 if 的基本结构2.1.1 基本语法2.1.2 代码案例2.1.3 练习 2.2 if else 结构2.2.1 基本语法2.2.2 代码案例2.2.3 练习 2.3 if 和…

火山引擎边缘计算用硬核助力赛事直播

经过一个多月激烈争夺&#xff0c;2023英雄联盟全球总决赛终于在11月19日落下帷幕。精彩的对决和高热话题使得直播平台观赛人数暴增&#xff0c;给直播平台稳定性和资源储备提出了巨大的考验。

做数据分析为何要学统计学(10)——如何进行时间序列分析

时间序列是由随时间变化的值构成&#xff0c;如产品销量、气温数据等等。通过对时间序列展开分析&#xff0c;能够回答如下问题&#xff1a; &#xff08;1&#xff09;被研究对象的活动特征是否有周期性&#xff08;也称季节性&#xff09;&#xff08;2&#xff09;被研究对…

Linux系统的各项命令

文章目录 Linux系统的目录结构Linux路径的描述方式Linux命令入门**什么是命令、命令行**Linux命令基础格式 ls命令入门HOME目录和工作目录ls命令的参数和选项ls命令的 -a选项ls命令的 -l选项ls命令选项的组合使用ls选项和参数的组合使用ls命令的 -h选项 目录切换相关命令&#…

ACMMM 2024 ACM International Conference on Multimedia

目录 0、 重要0.1 官网&#xff1a;0.2 提交 &#xff08;OpenReview&#xff09; 1、 Important Dates2、 Theme2.1 Theme: Engaging Users with Multimedia2.2 Theme: Experience2.3 Theme: Multimedia Systems2.4 Theme: Multimedia Content Understanding and Generation 3…

echarts更改工具栏图标为本地图片

1、首先将需要的本地图片导入进来 import save from ../../../assets/images/save.png2、利用React字符串连接变量的语法 icon: image://${save}这样就可以了&#xff0c;注意两端是反引号不是单引号。使用单引号就不好使了