通过了解和使用JVM和JVM参数,开发人员和最终用户都可以诊断故障并提高Java应用程序的性能。当您编写源代码时,您是在编写供人类阅读的代码。在代码被编译成机器语言之前,计算机无法执行源代码。机器语言是一个通用术语,指特定机器所需的任意数量的语言。通常,如果你在Linux上编译你的代码,它就会在Linux上运行,如果你在Windows上编译你的代码,它就会在Windows上运行,等等。但是,Java不同。它不针对某种真机。它以Java虚拟机(JVM)为目标,因此它可以在任何机器上运行。Java源代码被编译成字节码,由安装在计算机上的JVM运行。JVM是一个执行引擎,但不是您通常直接与之交互的引擎。它安静地运行,处理Java字节码。大多数人不需要考虑甚至不需要了解JVM,但了解它的工作原理对于调试和优化Java代码很有用。示例:在生产环境中,您可能会发现已部署的应用程序需要提高性能。如果一个应用程序出现问题,开发人员和最终用户都可以选择调试问题。想了解用于开发或运行Java应用程序的JavaDevelopmentKit(JDK)的详细信息,可以通过查询JVM获取这些详细信息本文介绍了一些基本的JVM参数,希望在这些场景中有所帮助......JVM、JDK和JRE之间有什么区别?Java有很多J首字母缩写词,包括JVM、JDK和JRE。JavaDeveloperKit(JDK)可供需要在其代码中使用开发库的程序员使用。Java运行时环境(JRE)供想要运行Java应用程序的人员使用。Java虚拟机(JVM)是运行Java字节码的组件。JDK包含JRE和JVM,但某些Java发行版提供包含JRE(包括JVM)的替代下载。Java是开源的,因此会有不同的公司构建和分发不同版本的JDK。您可以在系统上安装多个JDK,这在处理或处理不同的Java项目(其中一些可能使用较旧的JDK)时会很有帮助。要列出Linux系统上的JDK,可以使用替代命令:$alternatives--configjavaThereare2programsthatprovidejava.SelectionCommand-------------------------------------------------*+1java-11-openjdk.x86_64(/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-2.fc35.x86_64/bin/java)2java-1.8.0-openjdk.x86_64(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.fc35.x86_64/jre/bin/java)Entertokeepthecurrentselection[+],ortypeselectionnumber:要在可用的JDK之间切换,请再次执行以下命令:$sudoalternatives--configjava另一种选择是使用SDKMan,它可以帮助您在系统上下载、更新和管理JDK。什么是JVM调优?JVM调优是调整JVM参数以提高Java应用程序性能的过程。它还有助于诊断应用程序故障。通常,在调优之前考虑以下几点很重要:成本:有时,改进运行代码的硬件可以提高应用程序的性能。这看起来像是一个“作弊”,但请考虑您愿意花多少时间来调整JVM参数。有时,应用程序需要更多内存来执行所需的操作,而没有任何软件优化可以改变这一点。预期结果:从长远来看,稳定性比性能更重要。如果调优影响稳定性,明智地选择调优参数可能会更好。潜在问题:有时,问题可能是主机操作系统的潜在问题。在调整JVM之前,请确保JVM的平台按预期工作。内存泄漏:如果您发现自己在使用垃圾回收(GC)调整参数,那么您的应用程序代码中可能存在需要修复的内存泄漏。JVM参数类型JVM参数分为三类:标准参数、非标准参数和高级选项。标准参数所有JVM实现都支持标准参数。在终端中运行“java”命令以查看标准参数列表。$javaUsage:java[options][args...]要为沿选项指定一个参数,您可以使用--=或--。这些是任何JVM中包含的标准参数,您可以安全地将它们与任何命令行选项一起使用。例如,要验证配置的命令参数,创建一个VM并加载一个主类而不执行它,请使用以下命令:$java--dry-run非标准参数非标准参数以-X开头。它们是通用的,特定于JVM的特定实现。列出这些选项:$java-X-Xbatchdisablebackgroundcompilation-Xbootclasspath/a:appendtoendofbootstrapclasspath-XinternalversiondisplaysmoredetailedJVMversioninformationthanthe-versionoption-Xloggc:logGCstatustoafilewithtimestamps[…]changes,并不是所有的JVM实现都支持这些参数。Microsoft构建的JVM可能与RedHat等构建的JVM具有不同的参数。要获取详细的JVM版本信息,请使用以下命令:$java-Xinternalversion--versionOpenJDK64-BitServerVM(11.0.13+8)forlinux-amd64JRE(11.0.13+8),buildonNov8202100:00:00by"mockbuild"withgcc11。2.120210728(RedHat11.2.1-1)要获取属性设置,请使用:java-XshowSettings:properties--versionadvancedoptions这些选项不是临时使用的,而是用于调整HotspotVM的特定区域。这些参数可能会发生变化,并且不能保证所有JVM实现都支持它。这些参数以-XX开头。要列出这些参数,请使用以下命令:$java-XX:+UnlockDiagnosticVMOptions-XX:+PrintFlagsFinal-version例如,要跟踪类加载,请使用以下命令:$java-XX:+TraceClassLoadingHelloHello.java如下:$catHello.javapublicclassHello{}您可能会遇到的另一个常见问题是OOM(内存不足)错误,它可能在没有太多调试信息的情况下发生。要解决此类问题,您可以使用调试选项-XX:+HeapDumpOnOutOfMemoryError,这将创建一个包含调试信息的.hprof文件。$catTestClass.javaimportjava.util.ArrayList;importjava.util.List;publicclassTestClass{}$JavacTestClass.java$java-XX:+HeapDumpOnOutOfMemoryError-Xms10m-Xmx1gTestClassjava.lang.OutOfMemoryError:javaheapspaceDumpingheaptojava_pid444496.hprof...Heapdump184bytescreated22[Heapdump184bytes]2[创建的Heapdump184bytes]Exceptioninthread"main"java.lang.OutOfMemoryError:javaheapspaceatTestClass.main(TestClass.java:8)有一些工具可以查看这个.hprof文件,看看哪里出了问题。结论通过了解和使用JVM和JVM参数,开发人员和最终用户都可以诊断故障并提高Java应用程序的性能。下次使用Java时,请花点时间查看可用的选项。译者介绍卢新旺,社区编辑,半路出家的90后程序员。做过前端页面,写过业务接口,做过爬虫,学过JS,有幸接触到Golang,参与过微服务架构的改造。目前主要编写Java,负责公司可定制低代码平台数据引擎层的设计和开发。原标题:AguidetoJVMparametersforJavadevelopers,作者:JayashreeHuttanagoudar