高效应用程序的7个JVM参数

在撰写本文时(2020年3月),围绕垃圾收集和内存,您可以将600多个参数传递给JVM。 如果您包括其他方面,则JVM参数总数将很容易超过1000个。 😊。 任何人都无法消化和理解太多的论据。 在本文中,我们重点介绍了七个重要的JVM参数,您可能会发现它很有用。

1. -Xmx和-XX:MaxMetaspaceSize

-Xmx可能是最重要的JVM参数。 -Xmx定义要分配给应用程序的最大堆大小。 (要了解JVM中不同的内存区域,您可以观看此短片 )。 您可以这样定义应用程序的堆大小:

 -Xmx2g 

堆大小在确定您的

一个。 应用性能

b。 Bill,您将从云提供商(AWS,Azure等)获得收益

这带来了一个问题,我的应用程序正确的堆大小是多少? 我应该为应用程序分配大堆大小还是小堆大小? 答案是:“取决于”。 在本文中 ,我们分享了我们的想法,无论您需要使用大堆还是小堆。

 You might also consider reading this article: advantages of setting -Xms and -Xmx to same value. 

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

 -XX:MaxMetaspaceSize=256m 

2. GC算法

截止到2020年3月,OpenJDK中有7种不同的GC算法:

一个。 串行GC

b。 平行气相色谱

C。 并发标记和扫描GC

d。 G1 GC

e。 雪兰多GC

F。 Z气相色谱

G。 Epsilon GC

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

GC算法的选择对于确定应用程序的性能起着至关重要的作用。 基于我们的研究,我们正在使用Z GC算法观察到出色的性能结果。 如果使用JVM 11+,则可以考虑使用Z GC算法(即-XX:+ UseZGC)。 有关Z GC算法的更多详细信息,请参见此处 。

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

GC算法 JVM参数
串行GC -XX:+ UseSerialGC
平行气相色谱 -XX:+ UseParallelGC
并发市场和扫描(CMS)GC -XX:+ UseConcMarkSweepGC
G1 GC -XX:+ UseG1GC
雪兰多GC -XX:+使用ShenandoahGC
Z气相色谱 -XX:+使用ZGC
Epsilon GC -XX:+ UseEpsilonGC

3.启用GC日志记录

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

从JDK 1到JDK 8:

GC算法

从JDK 9及更高版本开始:

GC算法

例:

GC算法

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

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

图:健康JVM的堆使用情况图(由https://gceasy.io生成)

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

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

图:Sick JVM的堆使用情况图(由https://gceasy.io生成)

您可以注意到,在图形的右端,即使GC重复运行,内存利用率也没有下降。 这是该应用程序正遭受某种内存问题的经典征兆。

如果您仔细观察一下该图,您会发现重复的完整GC开始在上午8点左右开始。 但是,该应用程序仅在上午8:45左右开始获取OutOfMemoryError。 到上午8点,该应用程序的GC吞吐量约为99%。 但是,在早上8点之后,GC吞吐量开始下降到60%。 因为当重复的GC运行时,该应用程序将不会处理任何客户交易,而只会进行GC活动。 作为一项主动措施,如果您发现GC吞吐量开始下降,则可以从负载平衡器池中取出JVM。 这样,运行状况不佳的JVM将不会处理任何新的流量。 它将最大程度地减少对客户的影响。

图:重复的完整GC发生在OutOfMemoryError之前

您可以使用GCeasy REST API实时监视与GC相关的微米。

4. -XX:+ HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath

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

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

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

GC算法

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

有关OutOfMemoryError JVM参数的更多详细信息,可以在本文中找到。

5. -Xss

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

一个。 当前执行的方法/功能

b。 原始数据类型

C。 变数

d。 对象指针

e。 返回值。

他们每个人都消耗内存。 如果它们的使用量超出某个限制,则抛出StackOverflowError。 有关StackOverflowError及其解决方案的更多详细信息,请参见本文 。 但是,可以通过传递-Xss参数来增加线程的堆栈大小限制。 例:

GC算法

如果将此-Xss值设置为一个很大的数字,则内存将被阻塞并浪费。 假设您将-Xss值指定为2mb,而它只需要256kb,那么您将浪费大量的内存,而不仅仅是1792kb(即2mb – 256kb)。 你想知道为什么吗?

假设您的应用程序有500个线程,那么-Xss值为2mb,您的线程将消耗1000mb的内存(即500个线程x 2mb /线程)。 另一方面,如果您仅将-Xss分配为256kb,那么您的线程将仅消耗125mb的内存(即500个线程x 256kb /线程)。 每个JVM将节省875mb(即1000mb – 125mb)内存。 是的,它将产生巨大的变化。

注意:线程是在堆(即-Xmx)外部创建的,因此这1000mb将是您已经分配的-Xmx值的补充。 要了解为什么在堆外部创建线程,您可以观看此简短视频片段 。

我们的建议是从一个低值(例如256kb)开始。 使用此设置运行彻底的回归,性能和AB测试。 仅当您遇到StackOverflowError时才增加该值,否则请考虑坚持较低的值。

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

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

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

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

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

例如,如果要将这些属性设置为2秒:

GC算法

注意,默认情况下,这两个属性的值为-1,这表示未设置超时。 有关这些属性的更多详细信息,请参见本文 。

7. -Duser.timeZone

您的应用程序可能在某个时间/日期附近具有敏感的业务需求。 例如,如果您正在构建交易应用程序,则不能在上午9:30之前进行交易。 为了实现那些与时间/日期相关的业务需求,您可以使用java.util.Date,java.util.Calendar对象。 默认情况下,这些对象从底层操作系统中获取时区信息。 这将成为一个问题; 如果您的应用程序在分布式环境中运行。 查看以下方案:

一个。 如果您的应用程序跨多个数据中心(例如,旧金山,芝加哥,新加坡)运行,则每个数据中心中的JVM最终将具有不同的时区。 因此,每个数据中心中的JVM将表现出不同的行为。 这将导致结果不一致。

b。 如果要在云环境中部署应用程序,则可能会在您不知情的情况下将应用程序移动到其他数据中心。 同样在这种情况下,您的应用程序最终将产生不同的结果。

C。 您自己的运营团队还可以更改时区,而无需掌握开发团队的知识。 它还会歪曲结果。

为避免这些麻烦,强烈建议使用-Duser.timezone系统属性在JVM上设置时区。 例如,如果您想为应用程序设置EDT时区,则将执行以下操作:

GC算法

结论

在本文中,我们试图总结一些重要的JVM参数及其积极影响。 希望对您有所帮助。

翻译自: https://www.javacodegeeks.com/2020/03/7-jvm-arguments-of-highly-effective-applications.html

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

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

相关文章

junit:junit_简而言之,JUnit:另一个JUnit教程

junit:junit为什么还要另一个JUnit教程? 对于Java世界中的开发人员而言, JUnit似乎是最受欢迎的测试工具 。 因此,难怪就此主题已经写了一些好书 。 但是我仍然经常遇到程序员,他们至多对这个工具及其正确用法都不太了解。 因此&…

16.04编译android 7.0,ubuntu16.04 编译Android5.1报错

hi kylin team,我使用 ubuntu16.04 构建 android 编译环境后编译 android5.1 时出现如下报错。请向开发团队反馈看能否给出解决方案,谢谢!当我使用 ubuntu16.04 构建 Android 编译环境后, 编译报错. 报错信息如下:/home/.../proj/.../anroidsrcroot/preb…

用Java将文件读入字节数组的7个示例

嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本或二进制文件。 一个示例是将文件的内容转换为String以便显示。 不幸的是,用于表示文件和目录的Java的Fi…

部署gradle_使用Gradle消除开发重新部署

部署gradle为了进行服务开发,我的团队最近从Grails转到了Dropwizard框架。 但是,我真正从Grails堆栈中真正错过的一件事是自动重新加载:对源文件的任何更改在保存后立即显示在运行的应用程序中,而无需重新启动。 事实证明&#xf…

android thrift https,HTTPS 学习

https是加密的http协议,通过不对称加密确认对称加密的密钥,之后使用对称加密进行通信。通信流程:客户端-服务端1. 请求服务器 并添加支持的 非对称加密算法 对称加密算法 hash算法----2. 服务器返回证书,加密算法的种类&#xff0…

如何使用Java创建AWS Lambda函数

在本教程中,我们将看到如何在Java中创建AWS Lambda函数,我告诉你,这样做非常容易…… 基本上,我们可以通过三种方式创建AWS Lambda函数: –通过实现RequestHandler接口 –通过实现RequestStreamHandler接口 –自定义…

android 主流机型排行榜,10月份Android热门手机机型Top 50排行榜

根据《尼尔森:第三季度Android占美智能手机43%份额》的报告显示, 43%的美国人拥有智能手机,智能手机用户数量在过去六个月增加了5%,而其中Android占据了43%的份额,iPhone占据了28%,很明显Android的份额优势…

ejb生命周期_EJB 3.x:生命周期和并发模型(第1部分)

ejb生命周期对于经验丰富的专业人员来说,Java EE组件生命周期和与并发相关的详细信息可能不是新知识,但是对于初学者来说,这可能会花费一些时间。 就EJB而言,了解其生命周期 (以及相关的并发场景)对于确保…

Quarkus on OpenJ9 JVM和资源消耗

除了本机模式,Quarkus在JVM模式下也能很好地运行,这有其自身的优势。 您可以使用替代的JVM,例如OpenJ9,它可以更好地消耗资源。 在下面的视频中,我将展示交换JVM的简便性。 在视频中,我在最新标签x86_64-a…

java 并发 线程安全_Java并发教程–线程安全设计

java 并发 线程安全在回顾了处理并发程序时的主要风险(例如原子性或可见性 )之后,我们将通过一些类设计来帮助我们防止上述错误。 其中一些设计导致了线程安全对象的构造,从而使我们能够在线程之间安全地共享它们。 作为示例&…

交易猫鸿蒙空间,回收站是指

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。回收站是指微软Windows操作系统里的其中一个系统文件夹,用以把删除的文件暂时保留,留待将来进行恢复或永久删除。用好和管理好回收站、打造富有个性功能的回收…

Apache Camel 3.1 – XML路由的快速加载

Camel 3.1中添加的一项功能是能够更快地加载XML路由。 这是我们使Camel变得更小,更快的整体工作的一部分。 您可能会说ewww XML。 但坦率地说,有很多Camel用户使用XML定义路由来构建应用程序。 在Camel 2.x中,您将不得不使用Spring或OSGi Bl…

dz自动开起html,discuz论坛开启markdown 允许html代码嵌入js

|| markdown是非常好用的文档语言,mermaid是最流行的流程图语言,katex是最流行的公式语言,下面来讲解如何配置和使用。以下配置纯属个人研究,仅供参考1. 文件配置/home/www/template/你的模板/common/header.htm中加入复制代码/ho…

内存泄露严重吗_内存泄漏–测量频率和严重性

内存泄露严重吗这篇文章是我们开放文化的一部分-我们将继续分享日常工作中的见解。 这次,我们窥视了我们价值主张的核心,即–寻找以下问题的答案: Java应用程序中内存泄漏多久发生一次? 内存泄漏有多大? 内存泄漏增…

html选择器有哪些child,css3选择器child有哪些?css3选择器child用法详解

本篇文章给大家带来的内容是关于css3选择器child有哪些?css3选择器child用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。对于CSS3的结构伪类选择器,为了更好地让刚刚学习CSS3教程的新手能够理…

内蒙古高考2021年成绩查询,内蒙古招生考试信息网:2021年内蒙古高考查分入口、查分系统...

【摘要】为了方便内蒙古高考考生能及时查询到2021年高考成绩,高考频道特别整理了的内蒙古招生考试信息网2021年内蒙古高考成绩查询入口、查分系统,考生可在成绩公布时直接点击下面的链接进行查分,预祝大家金榜题名!自内蒙古招生考…

余数运算符在Java中用于Doubles

我在OSU任教已近两年了,这总是令我惊讶,我从学生那里学到了多少。 例如,过去, 我让学生写一些我不理解的奇怪代码 。 在这一点上,即使经过300多个博客文章, 几个YouTube视频 ,甚至从100多种语言…

HATEOAS的RESTful服务。 记录超媒体API

1.简介 希望本教程的前一部分不仅揭示了超媒体和HATEOAS的深远影响,而且使我们确信这些都是RESTful Web服务和API的基本构建块。 在这一部分中,我们将继续侧重于文档方面,以解决如何预先传递Web服务或API功能的问题。 目录 1.简介 2. OpenA…

典型微型计算机控制系统的实例,微型计算机控制系统概述.ppt

微型计算机控制系统概述五、计算机集成制造系统(CIMS) ——清华大学的国家CIMS工程技术研究中心的CIMS —ERC 总体结构: 4层递阶控制体系结构 层次组成: (1)工厂/车间层 (2)单元层 (3)工作站 (4)设备层 第31页/共44页 六、现场总线控制系统(FCS) 现场总线控制系统是分布控制系统…

计算机科学与技术及应用,计算机科学与技术的应用及发展趋向

随着我国科学技术的快速发展,新时期越来越多先进技术涌现,尤其是计算机科学与技术的快速崛起,促使世界逐渐成为一个整体,融入到人们的日常生活、工作和学习中,为人们带来了极大的便利。计算机的快速普及和发展&#xf…