面向Java开发人员的JVM参数指南

发表于:2022-7-04 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:卢鑫旺    来源:51CTO博客

#
Java
分享:
  通过理解和使用JVM和JVM参数,开发人员和最终用户都可以诊断故障并改进Java应用程序的性能。
  当你编写源代码时,你是在编写供人类阅读的代码。在代码被编译成机器语言之前,计算机不能执行源代码。机器语言是一个通用术语,指的是特定机器所需的任意数量的语言。通常,如果在Linux上编译代码,它就在Linux上运行,如果在Windows上编译代码,它就在Windows上运行,以此类推。然而,Java是不同的。它并不以某种真正的机器为目标。它的目标是Java虚拟机(JVM),因此它可以在任何机器上运行。
  Java源代码被编译成字节码,由安装在计算机上的JVM运行。JVM是一个执行引擎,但它不是一个你通常直接与之交互的引擎。它安静地运行,处理Java字节码。大多数人不需要考虑甚至不需要了解JVM,但是了解JVM的工作原理对调试和优化Java代码是很有用的。例如:
  ·生产环境中,你可能会发现已部署的应用程序需要性能提升。
  · 如果编写的应用程序出现问题,开发人员和最终用户都可以选择调试该问题。
  · 你是否希望了解用于开发或运行Java应用程序的Java开发工具包(JDK)的详细信息,可以通过查询JVM获得这些详细信息
  本文介绍了一些基本的JVM参数,希望可以在这些场景中提供帮助……
  JVM、JDK和JRE之间的区别是什么?
  · Java有很多J首字母缩略词,包括JVM、JDK和JRE。
  · Java开发者工具包(JDK)可供需要在代码中使用开发库的程序员使用。
  · Java运行时环境(JRE)是由想要运行Java应用程序的人所使用的。
  Java虚拟机(JVM)是运行Java字节码的组件。
  JDK包含JRE和JVM,但是一些Java发行版提供了包含JRE(包括JVM)的替代下载。
  Java是开源的,所以会有不同的公司构建和发行不同版本的JDK。你可以在系统上安装多个JDK,当你正在处理或使用不同的Java项目(其中一些可能使用旧的JDK)时,这会很有帮助。
  要列出Linux系统上的JDK,你可以使用alternatives命令:
  $ alternatives --config java  
  There are 2 programs that provide java.  
  Selection Command  
  -----------------------------------------------  
  *+ 1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-2.fc35.x86_64/bin/java)  
  2 java-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)  
  Enter to keep the current selection[+], or type selection number: 
  要在可用的JDK之间切换,请再次执行以下命令:
  $ sudo alternatives --config java 
  另一个选择是使用SDKMan,它可以帮助你下载、更新和管理系统上的JDK。
  什么是JVM调优?
  JVM调优是调整JVM参数以提高Java应用程序性能的过程。它还有助于诊断应用程序故障。
  一般来说,在调优之前考虑这些要点是很重要的:
  成本:有时候,改进运行代码的硬件可以提高应用程序的性能。这似乎是一种“欺骗”,但请考虑你愿意花多少时间来调优JVM参数。有时,应用程序需要更多的内存来执行所需的操作,任何软件优化都无法改变这一点。
  预期结果:长期来看,稳定比性能更重要。如果调优影响稳定性,那么明智地选择调优参数可能会更好。
  底层问题:有时,问题可能是主机操作系统的底层问题。在调优JVM之前,请确保JVM的平台按预期工作。
  内存泄漏:如果你发现自己在使用垃圾收集(GC)调优参数,那么可能存在需要在应用程序代码中修复的内存泄漏。
  JVM参数类型
  JVM参数分为三类:标准参数、非标准参数和高级选项。
  标准参数
  所有JVM实现都支持标准参数。在终端中运行'java'命令查看标准参数列表。
  $ java  
  Usage: java [options] <mainclass> [args...]  
  To specify an argument for a long option, you can use --<name>=<value> or  
  --<name> <value>.  
  这些都是包含在任意JVM中的标准参数,你可以在使用任何命令行选项时安全地使用它们。例如,为了验证配置的命令参数,创建一个VM并在不执行主类的情况下加载一个主类,使用以下命令:
  $ java --dry-run <classfile> 
  非标准参数
  非标准参数以-X开头。它们用于通用用途,并且特定于JVM的特定实现。列出这些选项:
  $ java -X  
  -Xbatch disable background compilation  
  -Xbootclasspath/a:<directories and zip/jar files separated by :>  
  append to end of bootstrap class path  
  -Xinternalversion  
  displays more detailed JVM version information than the  
  -version option  
  -Xloggc:<file> log GC status to a file with time stamps  
  [...] 
  这些额外的参数可以在没有通知的情况下更改,并且不是所有的JVM实现都支持这些参数。由Microsoft构建的JVM可能与由Red Hat构建的JVM有不同的参数,等等。
  要获取详细的JVM版本信息,请使用以下命令:
  $ java -Xinternalversion --version  
  OpenJDK 64-Bit Server VM (11.0.13+8) for linux-amd64 JRE (11.0.13+8), built on Nov 8 2021 00:00:00 by "mockbuild" with gcc 11.2.1 20210728 (Red Hat 11.2.1-1)  
  要获取属性设置,请使用:
   java -XshowSettings:properties --version
  高级选项
  这些选项不是临时使用的,而是用于调整Hotspot VM的特定区域。这些参数可能会发生变化,并且不能保证所有JVM实现都会支持它。
  这些参数以-XX开头。要列出这些参数,请使用以下命令:
  $ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
  例如,要跟踪类的加载,可以使用下面的命令:
  $ java -XX:+TraceClassLoading Hello
  Hello.java如下:
  $ cat Hello. java  
  public class Hello {  
  } 
  你可能面临的另一个常见问题是OOM(内存不足)错误,这可能在没有太多调试信息的情况下发生。要解决这样的问题,你可以使用调试选项 -XX:+HeapDumpOnOutOfMemoryError,它会创建一个包含调试信息的.hprof文件。
  $ cat TestClass. java  
  import java.util.ArrayList;  
  import java.util.List;  
  public class TestClass {  
  }  
  $ Javac TestClass.java  
  $ java -XX:+HeapDumpOnOutOfMemoryError -Xms10m -Xmx1g TestClass  
  java.lang.OutOfMemoryError: java heap space  
  Dumping heap to java_pid444496.hprof ...  
  Heap dump file created [1018925828 bytes in 1.442 secs]  
  Exception in thread "main" java.lang.OutOfMemoryError: java heap space  
  at TestClass.main(TestClass.Java:8)
  有一些工具可以查看这个.hprof文件,以了解哪里出了问题。
  结语
  通过理解和使用JVM和JVM参数,开发人员和最终用户都可以诊断故障并改进Java应用程序的性能。下次使用Java时,可以花些时间看看可供选择的选项。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号