围绕垃圾收集和内存,您可以将600多个参数传递给JVM。如果包括其他方面,则JVM参数总数将很容易超过1000+。任何人都无法消化和理解太多的论据。在本文中,重点介绍了七个重要的JVM参数,在Java性能测试中起着非常重要的作用。

-Xmx和-XX:MaxMetaspaceSize

-Xmx可能是最重要的JVM参数。-Xmx定义要分配给应用程序的最大堆大小。。您可以这样定义应用程序的堆大小:-Xmx2g

堆大小在影响应用性能和所需物理硬件需求。这带来了一个问题,我的应用程序正确的堆大小是多少?我应该为应用程序分配大堆大小还是小堆大小?答案是:取决于需求和预算。

-Xms-Xmx设置为相同值的会提高JVM性能

元空间是将存储JVM的元数据定义(例如类定义,方法定义)的区域。默认情况下,可用于存储此元数据信息的内存量是无限的(即受您的容器或计算机的RAM大小的限制)。您需要使用-XX:MaxMetaspaceSize参数来指定可用于存储元数据信息的内存量的上限。

-XX:MaxMetaspaceSize=256m

GC算法

OpenJDK中有7种不同的GC算法:

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

如果您未明确指定GC算法,那么JVM将选择默认算法。在Java 8之前,Parallel GC是默认的GC算法。从Java 9开始,G1 GC是默认的GC算法。

GC算法的选择对于确定应用程序的性能起着至关重要的作用。根据我们的研究,我们正在使用Z GC算法观察到出色的性能结果。如果使用JVM 11+,则可以考虑使用Z GC算法(即-XX:+ UseZGC)。

下表总结了激活每种垃圾收集算法所需传递的JVM参数。

GC算法JVM参数Serial GC-XX:+ UseSerialGCParallel GC-XX:+ UseParallelGCConcurrent Market & Sweep (CMS) GC-XX:+ UseConcMarkSweepGCG1 GC-XX:+ UseG1GCShenandoah GC-XX:+使用ShenandoahGCZ GC-XX:+ UseZGCEpsilon GCGC -XX:+ UseEpsilonGC

启用GC日志记录

垃圾收集日志包含有关垃圾收集事件,回收的内存,暂停时间段等信息,可以通过传递以下JVM参数来启用垃圾收集日志:

从JDK 1到JDK 8:

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

从JDK 9及更高版本开始:

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

Demo:

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

通常,GC日志用于调整垃圾回收性能。但是,GC日志包含重要的微观指标。这些指标可用于预测应用程序的可用性和性能特征。在本文中将重点介绍一种这样的标尺:GC吞吐量。GC吞吐量是您的应用程序在处理客户交易中花费的时间与它在处理GC活动中花费的时间之比。假设您的应用程序的GC吞吐量为98%,则意味着应用程序将其98%的时间用于处理客户活动,其余2%用于GC活动。

现在,让我们看一个健康的JVM的堆使用情况图:

您会看到一个完美的锯齿图案。您会注意到,当运行Full GC(红色三角形)时,内存利用率将一直下降到最低。

现在,让我们看一下有问题的JVM的堆使用情况图:

您可以注意到,在图表的右端,即使GC反复运行,内存利用率也没有下降。这是一个典型的内存泄漏迹象,表明该应用程序正在存在某种内存问题。

如果您仔细观察一下该图,您会发现重复的完整GC开始在上午8点左右开始。但是,该应用程序仅在上午8:45左右开始获取OutOfMemoryError。到上午8点,该应用程序的GC吞吐量约为99%。但是,在上午8点之后,GC吞吐量开始下降到60%。因为当重复的GC运行时,该应用程序将不会处理任何客户交易,而只会进行GC活动。

-XX:+ HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath

OutOfMemoryError是一个严重的问题,它将影响您的应用程序的可用性和性能。要诊断OutOfMemoryError或任何与内存相关的问题,必须在应用程序开始遇到OutOfMemoryError的那一刻或一瞬间捕获堆转储。由于我们不知道何时会抛出OutOfMemoryError,因此很难在抛出时左右的正确时间手动捕获堆转储。但是,可以通过传递以下JVM参数来自动化捕获堆转储:

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

-XX:HeapDumpPath中,需要指定堆转储所在的文件路径。传递这两个JVM参数时,将在抛出OutOfMemoryError时自动捕获堆转储并将其写入定义的文件路径。例:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof

一旦捕获了堆转储,就可以使用HeapHeroEclipseMAT之类的工具来分析堆转储。

-Xss

每个应用程序将具有数十,数百,数千个线程。每个线程都有自己的堆栈。在每个线程的堆栈中,存储以下信息:

  • 当前执行的方法/功能
  • 原始数据类型
  • 变量
  • 对象指针
  • 返回值。

他们每个都消耗内存。如果它们的使用量超出某个限制,则会引发StackOverflowError。可以通过传递-Xss参数来增加线程的堆栈大小限制。例:

-Xss256k

如果将此-Xss值设置为一个很大的数字,则内存将被阻塞并浪费。假设您将-Xss值指定为2mb,而只需要256kb,那么您将浪费大量的内存。

假设您的应用程序有500个进程,然后-Xss值为2Mb,则您的线程将消耗1000Mb的内存。另一方面,如果您仅将-Xss分配为256kb,那么您的线程将仅消耗125Mb的内存。每个JVM将节省875Mb内存。

注意:线程是在堆(即-Xmx)之外创建的,因此这1000Mb将是您已经分配的-Xmx值的补充。

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

现代应用程序使用多种协议(即SOAP,REST,HTTP,HTTPS,JDBC,RMI)与远程应用程序连接。有时远程应用程序可能需要很长时间才能做出响应,有时它可能根本不响应。

如果没有正确的超时设置,并且远程应用程序的响应速度不够快,则您的应用程序线程/资源将被卡住。远程应用程序无响应可能会影响您的应用程序的可用性。它可以使您的应用程序停止磨削。为了保护应用程序的高可用性,应配置适当的超时设置。

您可以在JVM级别传递这两个强大的超时网络属性,这些属性可以全局适用于所有使用java.net.URLConnection的协议处理程序:

sun.net.client.defaultConnectTimeout:指定建立到主机的连接的超时(以毫秒为单位)。例如,对于HTTP连接,它是与HTTP服务器建立连接时的超时。当建立与资源的连接时,sun.net.client.defaultReadTimeout指定从输入流读取时的超时(以毫秒为单位)。 例如,如果您要将这些属性设置为2秒:

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

注意,默认情况下,这两个属性的值为-1,这表示未设置超时。


  • 郑重声明:文章首发于公众号“FunTester”,欢迎关注交流,禁止第三方(腾讯云除外)转载、发表。

技术类文章精选

  • Linux性能监控软件netdata中文汉化版
  • 性能测试框架第三版
  • 图解HTTP脑图
  • 性能测试中图形化输出测试数据
  • 压测中测量异步写入接口的延迟
  • 多种登录方式定量性能测试方案
  • JMeter吞吐量误差分析
  • 多项目登录互踢测试用例

无代码文章精选

  • 写给所有人的编程思维
  • JSON基础
  • 2020年Tester自我提升
  • 自动化新手要避免的坑(上)
  • 自动化新手要避免的坑(下)
  • 如何成为全栈自动化工程师
  • 选择手动测试还是自动化测试?
  • 自动化测试项目为何失败
  • 简化测试用例

jvm 参数_6个重要的JVM性能参数相关推荐

  1. 液晶弹性自由能计算_液晶性能参数的测试方法及原理.ppt

    液晶性能参数的测试方法及原理 液晶性能参数的测试方法及原理 液晶的基本性能参数 1.相转变温度 5.粘度 2.介电各向异性 6.弹性常数 3.折射率各向异性 7.螺距 4.阈值电压和响应时间 8.电阻 ...

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

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

  3. JVM实用参数(三)打印所有XX参数及值

    原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-3-printing-all-xx-flags-and-their- ...

  4. jvm高级特性第4章-虚拟机性能监控与故障处理工具

    [4.2]jdk命令行工具 1.jps:虚拟机进程状况工具: C:\Users\pacoson>jps -l // 输出主类名称 12272 sun.tools.jps.Jps 12736 ch ...

  5. JVM优化系列-详解JDK1.8 Metaspace 参数配置

    导语   在JVM中除了有堆内存参数配置以外,还有一些其他内存例如方法区.线程栈直接内存等等.他们与堆内存来说是相对比较独立的内存空间.与堆内存相比较这些内存与应用程序本身的关系不大,但是如果将其放到 ...

  6. jvm maxgcpausemillis 默认值_Tomcat和JVM的性能调优总结

    Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...

  7. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

  8. java heap最大最小参数_闲谈JVM(一):浅析JVM Heap参数配置

    文章目录 前言 JVM内存模型 堆(Heap)配置 Xms与InitialHeapSize Xmx与MaxHeapSize Heap的缺省配置 Default Heap Size Client JVM ...

  9. 73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令

    73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令 73.1.堆内存基本结构 73.2.参数分类 73.3.推荐的配置项 73.4.参数混用问题 73.5.常用命令 7 ...

最新文章

  1. fedora21 下解决IDEA中文无法输入、显示问题
  2. 最小二乘法与最大似然函数的区别
  3. purge table table_name的一点测试!
  4. Jsoup 简介书写
  5. SpringMVC的启动过程
  6. 10位IT领袖给应届毕业生的10条忠告
  7. mysql 导入导出脚本_MySQL导入和导出sql脚本
  8. Qtopia-2.2.0启动脚本
  9. php7 phpunit,Make phpunit catch php7 TypeError
  10. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)
  11. promise的链式调用
  12. CentOS安装QQ2012
  13. 问题-[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU)
  14. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_2 Mybatis的CRUD-保存操作
  15. GBin1专题之Web热点#6
  16. oracle 存储过程 实例 循环 给查询赋值 游标取值
  17. 数电笔记:触发器的基础知识
  18. 车型代号对照表_上海大众车型与VIN代号对照表
  19. 前端开发试用期工作总结
  20. python包导入细节

热门文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)
  2. php点菜系统开题报告,点餐管理系统的设计与实现-开题报告
  3. C++11:move移动语义
  4. Linux 下 VuePress 的安装使用
  5. jq封装post请求数据_GitHub - xiaohange/JQHttpRequest: GET/POST / PUT / DELETE 网络请求的封装...
  6. springsecurity sessionregistry session共享_不用 Spring Security 可否?试试这个小而美的安全框架...
  7. 数据结构与算法 / 编辑器和编译器如何判定括号是否合法
  8. 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
  9. java多线程优先级的方法_Java多线程以及线程优先级
  10. JAVA定义一个多边形类_如何在每个数据类别中绘制多个多边形?