jvm 参数_6个提高性能的JVM参数

截止到2020年五月,JVM中仅仅只是关于垃圾回收和内存相关的参数就已经超过600个。如果算上其他方面的参数,JVM相关的总参数能轻松超过1000个。参数太多了,弄得人很懵逼。在这边文章中,我们只选取了7个比较重要,且有用的JVM参数来介绍。

-Xmx 和 -XX:MaxMetaspaceSize

-Xmx可能是最重要最常用的JVM参数了。-Xmx用来定义能分配给应用的最大堆空间大小。你可以像这样使用:

-Xmx2g

堆空间大小直接决定着应用性能。但是随之而来的问题是,对于一个应用,应该设置多大的堆空间是合理的?我应该为我的应用设置一个大的堆空间,还是一个相对较小的?答案是:“看情况”,这个问题,另开一篇文章专门探讨。

这里只提示一点,将-Xmx和-Xms设置为相同,能获得更好的性能。

元空间是对JVM规范中方法区的实现,用于存储JVM中的元数据信息,比如类定义,方法定义等。在默认情况下,元空间使用的是本地内存空间,所以理论上讲,元空间地址是没有上限的,他受限于机器的内存大小,内存寻址空间大小等。可以通过以下参数来指定元空间的大小:

-XX:MaxMetaspaceSize=512m  //设置元空间最大空间-XX:MetaspaceSize //初始元空间大小

对于-XX:MetaspaceSize来说,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

另:除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:

-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集

-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

GC回收器类型

截止目前为止,在OpenJDK中,一共提供了7种类型的GC【这里注意区分一下GC回收器类型和GC回收算法】:

  • Serial GC
  • Parallel GC
  • Concurrent Mark & Sweep GC
  • G1 GC
  • Shenandoah GC
  • Z GC
  • Epsilon GC

如果没有特别的指定GC回收器,JVM会使用默认的,到Java8,Parallel GC是默认回收器,从Java9之后,G1 GC是默认的GC回收器。

使用何种GC回收器,对于应用的性能表现起着至关重要的作用。 从测试数据来看,Z GC有非常不错的表现。如果你的应用运行在JVM11以上,我们建议优先考虑使用Z GC(-XX:+UseZGC)。

下表中列出了不同GC算法及其对应的开启参数:

  • Serial GC -XX:+UseSerialGC
  • Parallel GC -XX:+UseParallelGC
  • Concurrent Market & Sweep (CMS) GC -XX:+UseConcMarkSweepGC
  • G1 GC -XX:+UseG1GC
  • Shenandoah GC -XX:+UseShenandoahGC
  • Z GC -XX:+UseZGC
  • Epsilon GC -XX:+UseEpsilonGC

Enable GC Logging

GC日志中包含了包括垃圾回收事件,内存空间情况,时间间隔等等。可以使用下面的JVM参数来开启GC日志。

JDK8及其之前:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{file-path}

JDK9及之后:

-Xlog:gc*:file={file-path}

一个详细例子:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/workspace/myAppgc.log-Xlog:gc*:file=/opt/workspace/myAppgc.log

一般情况下,GC日志主要用来调整GC性能。然而,GC日志中也包含了很多微观指标。这些指标可用于预测应用程序的可用性和性能。在这里,我们只举一个例子:“GC Throughput(GC吞吐量)”。GC吞吐量是应用程序处理应用事务所花费的时间与处理GC活动所花费的时间之比。比如应用的GC吞吐量是98%,这意味着应用程序将98%的时间花在处理应用活动上,剩下的2%花在GC活动上。

接下来看一个健康的JVM的堆使用图:

3f1ceee9f1dbe5785cb44944693e879c.png

你可以看到一个完美的锯齿图案。可以看到到,当运行完整的GC(红色三角形)时,内存利用率下降到了底部。再来看一个有问题的JVM堆使用图:

92df78f348150514d7a457ec4ee17995.png

注意图案的右侧区域,及时GC不断的运行,内存利用率仍然没有明显下降。这就是一个出现了内存问题的典型迹象。

当我们更仔细的分析这个图片,我们可以看到,在8点左右的时间,完全GC开始重复出现,知道8点45左右,应用出现了OOM异常。8点之前,GC的吞吐量在99%左右,但是在8点之后,GC的吞吐量掉到了60%,因为大量重复GC的动作出现,让应用已经没有太多时间处理应用的正常事务。一种主动的措施,如果当发现GC吞吐量开始下降的时候,我们可以从负载平衡群中取出该JVM。这样,出现问题的JVM就不会处理任何新的流量,可以最大限度地减少对客户请求的影响。

可以使用GCeasy REST API实时监控GC的微观数据,也可以使用gcviewer (https://github.com/chewiebug/GCViewer)离线分析GC日志文件。

-XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath

OOM异常严重影响应用的可用性/性能SLA等级。要诊断OOM异常或任何与内存相关的问题,必须在应用程序开始遇到OOM之前的某一时刻或几分钟捕获heap dump(堆转储文件)。由于我们不知道OOM何时出来,所以很难手动捕获它。一般通过传递以下JVM参数来自动捕获heap dump:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={HEAP-DUMP-FILE-PATH}

在-XX:HeapDumpPath中,我们设置一个堆转储文件地址。当这两个参数传递给JVM之后,当抛出OOM的时候,heap dump会被自动捕获并存储在指定文件路径上。

一般可以使用jhat、EclipseMAT分析heap dump。

-Xss

每个应用在运行时都会产生大量线程,每个线程拥有自己的栈空间。在每个线程栈中包含了以下内容:

  • 当前正在执行的方法
  • 原始数据类型
  • 变量
  • 对象指针
  • 返回值

每一项都占用内存。如果内存占用超过一定限制,就会抛出StackOverflowError异常。可以使用-Xss参数来调整线程栈的大小。例如:

-Xss256k

如果设置-Xss过大,会造成内存的阻塞和浪费。例如,假设我们设置-Xss大小为2MB,但实际上,只需要256KB,就会造成非常大的内存浪费,而不仅仅只是字面量上的1792KB。假设应用一共有500个线程,当-Xss设置为2MB,线程会总共占用1000MB内存。而如果设置-Xss为256KB,实际总共只需要125MB内存空间,总共节约了875MB内存。所以,-Xss的设置会造成巨大的内存消耗差异。

我们建议先将-Xss设置为一个较小的值,比如256KB,并使用该设置完成回归、性能和AB测试。如果在这个过程中遇到了StackOverflowError,再逐步提高该值即可,否则使用一个较小的值。

-Dsun.net.client.defaultConnectTimeout 和 -Dsun.net.client.defaultReadTimeout

在一个应用中,常常会涉及到使用各种协议(SOAP, REST, HTTP, HTTPS, JDBC, RMI等)和第三方应用交互。有时候第三方应用会响应很慢,或者无响应。

在这种情况下,如果没有一个合理的超时时间设置,如果远端应用没法及时响应,则会造成我们的应用线程/资源出现问题。远程应用程序无响应会影响我们程序的可用性。所以,设置合理的超时时间是非常必要的。

你可以通过设置这两个非常强大的网络参数,在JVM层面上控制所有通过java.net.URLConnection建立的协议连接。

sun.net.client.defaultConnectTimeout:设置连接到主机的超时时间(毫秒)sun.net.client.defaultReadTimeout:与资源建立连接时从输入流读取数据的超时时间(毫秒)

比如:

-Dsun.net.client.defaultConnectTimeout=2000-Dsun.net.client.defaultReadTimeout=2000

如果设置为-1,则表示不超时。

原文链接:https://www.javacodegeeks.com/2020/03/7-jvm-arguments-of-highly-effective-applications.html

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

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

相关文章

zabbix入门之定义触发器

zabbix入门之定义触发器 触发器的概念 触发器的定义:界定某特定的item 采集到数据的非合理区间或非合理状态。通常为逻辑表达式。 逻辑表达式(阈值):通常用于定义数据的不合理区间,其结果如下: O K (符合条件&#xff…

linux重启memcache_Linux中安装Memcached服务的方法

Linux中安装Memcached服务的方法导语:在Linux中安装Memcached服务需要执行一些命令行,下面就由小编为大家介绍一下Linux中安装Memcached服务的方法,大家一起去看看吧!下载并安装Memcache服务器端服务器端主要是安装memcache服务器…

[html] 说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染?

[html] 说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染? 字体渲染: 1.解码,根据web服务器返回的(或者本地网页本身的)content-type charset等信息确定编码,将网页解码成Unicode字…

mybatis字符串转成数字_Python字符串三种格式化输出

字符串格式化输出是python非常重要的基础语法,今天就把三种格式化输出做一个简单的总结,希望对大家有帮助。格式化输出:内容按照一定格式要求进行输出。1.使用占位符%输出python2.6版本之前,使用%格式化字符串沿用的是C语言的输出…

eclipse dorado plugin

http://lindows.iteye.com/blog/224004 下载中心 http://www.bstek.com/downloadcenter.htm dorado debug shutcut page time:CtrlShiftF12 bstekIDE Eclipse插件扩展点应用介绍 http://macrochen.iteye.com/blog/138625 BstekIDE_1.2.2_Installer.jar http://www.bstek.com/do…

[html] 如何构建“弱网络环境”友好的项目?

[html] 如何构建“弱网络环境”友好的项目? 采用PWA技术个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

[html] 举例说明锚点定位有什么作用?

[html] 举例说明锚点定位有什么作用? 我能想象到的一种应用场景: 一、我们在做一个很长的网页时,需要在页面内做一个导航,点击导航里的链接不是新开一个窗口或者跳转到其他网址,而是跳转到当前页的某一个位置。那么所要跳转到的那…

逆反过程的学习会如何

C#工作已三年了,突然的一天头脑一热就去买了几本C/C语言的书,准备冲实下自已,但不知这个学习的过程会不会不适应呢。因为这是个逆反的过程吧!我是这么认为的。记得从不懂oracle到入门只用了一个星期的时间,现在也只能算是个中上的…

android真机调式问题之offline target

用cmd命令进入android-sdk-windows\platform-tools目录, adb kill-server; adb start-server; 然后USB断下重连,以前的解决办法是重启手机。。。转载于:https://www.cnblogs.com/bvin/archive/2012/06/21/2557709.html

三个不等_2道真题,讲透「基本不等式」的使用原则 | 真题精讲-11

「不等式」和「最值」之间有着非常天然的强联系;基本不等式有3个非常明显的形式特征;知识点的用法比知识点本身更重要。先发福利:这里有6场「高考数学」系列Live的讲义,全拿去,送给你——《高考数学:免费送…

[html] 编写html时,你有没有用过Emmet插件呢?说说它的优点及规则有哪些?

[html] 编写html时,你有没有用过Emmet插件呢?说说它的优点及规则有哪些? 用过,vscode编辑器自带支持Emmet语法; 它可以帮助快速编写HTML代码,减少复制粘贴的操作; 常见规则: 1. >…

python web自动化测试实验报告_Python:web自动化测试

用selenium包。# -*- coding: utf-8 -*-# 说明: 当前的浏览器驱动用的是edge浏览器.# 需要下载浏览器驱动,并把它的路径添加到环境变量from selenium import webdriverimport timedriver webdriver.Edge()homepage_url http://10.180.10.93:8000/driver.get(homepage_url)dri…

[html] 怎样去除iOS和Android中的输入URL地址的控件条呢?

[html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0);个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

ajax success function_Django:AJAX(二)

3|0jQuery实现的AJAX最基本的jQuery发送AJAX请求示例&#xff1a;<!DOCTYPE html><html lang"en"> <head> <meta charset"UTF-8"> <title>Title</title> <meta name"viewport" content"widthdevice…

无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]

继上一节内容&#xff0c;我们在表单里加了个一个单选组&#xff0c;一个复选组: 1.代码如下&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <ht…

[html] 举例说明写一个button的按钮的方法有哪些?

[html] 举例说明写一个button的按钮的方法有哪些&#xff1f; 使用 标签 其值直接写在标签内使用input标签 type为 buttton 值需要通过用 value""的形式写出来个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…

iou画 yolov3_yolov3环境配置训练及优化

科普gcc/g: - GNU project C and C compiler.When you compile C programs, you should invoke GCC as g instead.Cuda:GPU Accelerated Computing with C and C一、Ubuntucudacudnnopencvdarknet/yolov3环境配置1.NVIDIA显卡驱动安装首先查看系统是否已经安装NVIDIA驱动&#…

第十三章 Perl的面向对象编程

第十三章 Perl的面向对象编程 by flamephoenix 一、模块简介 二、Perl中的类 三、创建类 四、构造函数 实例变量五、方法 六、方法的输出 七、方法的调用 八、重载 九、析构函数 十、继承 十一、方法的重载 十二、Perl类和对象的一些注释 本章介绍如何使用Perl的面向对象编…

python抢票代码_GitHub标星超12K,抢票神器大更新,支持候补

掐指一算&#xff0c;距离国庆黄金周还有半个月的时间!你出行的车票都抢到了吗?图片来自 pexels根据国务院办公厅发布的关于 2019 年部分节假日安排的通知&#xff0c;国庆放假安排是&#xff1a;10 月 1 日至 7 日。想要十一出行的小伙伴们&#xff0c;想必前几天刚经历了一波…

[html]HTML5如何隐藏video元素的控制栏、全屏按钮?

[html]HTML5如何隐藏video元素的控制栏、全屏按钮&#xff1f; 将<video width"800px" height"400px" id"vid" src"a.mp4" controls"controls"> 中的controls"controls"删掉个人简介 我是歌谣&#xff0c…