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…

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…

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

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

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…

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

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

python 开发板 播放音乐_MicroPython开发板:TPYBoard v102 播放音乐实例

0x00前言 前段时间看到TPYBoard的技术交流群&#xff08;群号&#xff1a;157816561&#xff09;里有人问关于TPYBoard播放音乐的问题。最近抽空看了一下文档介绍&#xff0c;着手做了个实验。 0x01实验器材 TPYBoard v102 开发板 1块 耳机或音响 1个 杜邦线 若干 0x02前期准备…

[html] 你知道什么是粘性布局吗?

[html] 你知道什么是粘性布局吗&#xff1f; 中文大概意思&#xff1a; 对象在常态时遵循常规流。它就像是relative和fixed的合体&#xff0c;当在屏幕中时按常规流排版&#xff0c;当卷动到屏幕外时则表现如fixed。该属性的表现是现实中你见到的吸附效果。 个人简介 我是歌…

kafka streams实战 pdf_spring框架实战口试材料

Spring框架自诞生倚赖从来备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 百口桶。它包SpringMVC、SpringBoot、Spring Cloud、Spring Data等处理方案。好多研发职员把spring看作心目中最佳的java项目&#xff0c;没有之一。Spring系列包涵非常多的项目&#x…

jquery日期插件_AngularJS 日期时间选择组件(附详细使用方法)

插件简介AngularJS是一款目前非常火的JavaScript脚本库&#xff0c;应用范围十分广阔。今天给大家分享一款基于AngularJS和jQuery的日期时间选择组件&#xff0c;和别的日期选择插件一样&#xff0c;它同样支持年月日的快速定位。另外这款AngularJS日期选择组件还支持时间的选择…

hsv白色h值是多少_ShaderToy系列:HSV

前言这次呢&#xff0c;继续再来看一个iq大神的简单作品&#xff0c;作品虽简单&#xff0c;但是却包含了很多知识点&#xff0c;先放上最终效果&#xff1a;ShaderToy地址&#xff1a;https://www.shadertoy.com/view/MsS3Wc不过本篇改动较大&#xff0c;最终效果与ShaderToy上…

saltstack mysql_saltstack学习五:return及入库_MySQL

return的用法网上太多资料了&#xff0c;利用return把结果存入数据库网上已经有现在的&#xff1a;1、在master端创建数据库&#xff1a;CREATE DATABASE saltDEFAULT CHARACTER SET utf8DEFAULT COLLATE utf8_general_ci;USE salt;---- Table structure for table jids--DROP …

mysql php 入门_PHP入门教程之PHP操作MySQL的方法分析

本文实例讲述了PHP操作MySQL的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;设置Zend 软件所有 UTF-8 编码设置单个项目 UTF-8 的编码Demo1.phpheader(Content-Type:text/html; charsetutf-8;);//第一步&#xff0c;连接到 Mysql 服务器 3306//第二步参数&#…

and or not 优先级_快速划分测试用例优先级

在工程工期时间有限的情况下&#xff0c;怎么解决测试工期和全部测试用例执行时间之间的矛盾呢&#xff1f;怎么样的设计才能算测试用例引自:IEEE Standard 610 (1990):A set of test inputs, execution conditions, and expected results developed for a particular objectiv…

keil写文字怎么会乱码_主持稿怎么写才会吸引人

现在你是不是想要知道一个主持人它是怎么样把我们都吸引到节目当中来的&#xff0c;当然就是靠的主持稿了&#xff0c;那这个时候你就想要知道了&#xff0c;它应该要怎么写才会吸引人呢&#xff0c;最主要的一点就是需要我们一来就先声夺人&#xff0c;很多的优秀主持人都会这…

dropdownlist三级联动怎么实现_一张表实现三级联动

今天是七夕&#xff0c;七夕快乐&#xff0c;大家今天有没有人约呢&#xff1f;相信大部分的Access玩家都是玩Excel的高手&#xff0c;很多的功能在Excel中实现对大家来说都是小菜&#xff0c;比如今天要讲的联动。那么&#xff0c;我们现在就来讲一下在Access中怎么用一张表实…

Windows Phone开发(29):隔离存储C 转:http://blog.csdn.net/tcjiaan/article/details/7447469...

本文是隔离存储的第三节&#xff0c;大家先喝杯咖啡放松&#xff0c;今天的内容也是非常简单&#xff0c;我们就聊一件东东——用户设置。当然了&#xff0c;可能翻译为应用程序设置合适一些&#xff0c;不过没关系&#xff0c;只要大家明白&#xff0c;它就是用于保存我们的应…

go 函数名之前括号中的内容_2020 重学 Go 系列:09. 一篇文章理解 Go 里的函数

1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构。将一段功能复杂、很长的一段代码封装成多个代码片段(即函数)&#xff0c;有助于提高代码可读性和可维护性。在 Go 语言中&#xff0c;函数可以分为两种&#xff1a;带有名字的普通函数没有名字的匿名函数由于 Go…

百度地图gif图标_华为手机误删照片怎么找回?手机怎么快速制作GIF动图

对于华为手机&#xff0c;国内的很多人群都是非常喜欢的&#xff0c;特别是哪些花粉们简直就是疯狂&#xff0c;但是当我们使用华为手机误删了照片应该怎么办&#xff1f;如何才能找回误删的照片&#xff1f;误删手机照片怎么找回&#xff1f;不用担心&#xff0c;下面就让我们…