Redian新闻
>
面向 Java 开发人员的 JVM 参数指南 | Linux 中国

面向 Java 开发人员的 JVM 参数指南 | Linux 中国

科技
 
导读:通过理解和使用 JVM 以及 JVM 参数,开发人员和最终用户都可以诊断故障并且提高 Java 应用程序的性能。
本文字数:5847,阅读时长大约:7分钟

LCTT 译者 :ZZJ
🌟
翻译: 1.0 篇
|
贡献: 12 天
2022-04-25
2022-05-06
https://linux.cn/lctt/Veryzzj

通过理解和使用 JVM 以及 JVM 参数,开发人员和最终用户都可以诊断故障并且提高 Java 应用程序的性能。

当你在编写源代码时,你是在编写人类可以阅读的代码。在将代码编译成机器语言之前,计算机无法执行它。机器语言是一个通用术语,指的是特定机器所需的任意数量的语言。通常,如果你在 Linux 上编译代码,它只能 Linux 上运行;如果你在 Windows 上编译代码,它就只在 Windows 上运行。但是,Java 是不同的,它并不以真实的机器为目标,而是面向 Java 虚拟机(Java Virtual Machine)(JVM)。因此,它可以在任何机器上运行。

Java 源代码被编译成字节码(bytecode),然后由安装在计算机上的 JVM 运行。JVM 是一个执行引擎,但我们通常不会直接与它交互。它在后台静默运行,替我们处理 Java 字节码。大多数人不需要考虑,甚至也不需要知道 JVM。但是,了解它的工作原理是对我们来说是非常有用的,因为这会有助于我们调试和优化 Java 代码。例如:

◈ 在生产环境中,你发现已经部署的应用程序可能需要提升性能。
◈ 如果你写的应用程序出错了,开发人员和最终用户都可以选择对问题进行调试。
◈ 如果你想了解关于 JDK(即 Java 开发工具包(Java Development Kit),用于开发/运行 Java 应用程序)的详细信息,你可以通过查询 JVM 来获取。

本文介绍了一些基础的 JVM 参数,希望在这些场景中可以提供帮助。

JVM 参数

(图源:Jayashree Huttanagoudar,CC BY-SA 4.0)

JVM、JDK 和 JRE 有什么不同?

Java 有许多 J 开头的缩略词,包括 JVM、JDK 和 JRE。

◈ Java 开发工具包(Java Development Kit)(JDK)可供需要在代码中使用开发库的程序员使用。
◈ Java 运行时环境(Java Runtime Environment)(JRE)可供想运行 Java 应用程序的人使用。
◈ Java 虚拟机(Java Virtual Machine)(JVM)是运行 Java 字节码的组件。

JDK 同时包含 JRE 和 JVM,但有些 Java 发行版提供了包含 JRE(包括 JVM)的替代下载。

JDK

(图源:Jayashree Huttanagoudar,CC BY-SA 4.0)

Java 是开源的,因此,许多不同的公司都会构建和发行他们自己的 JDK 发行版。你可以在系统上安装多个 JDK,这会对你参与或者运行不同的 Java 项目时很有帮助,因为其中一些项目可能使用旧版本的 JDK。

你可以使用 alternatives 命令,来查看 Linux 系统上的 JDK 列表:

  1. $ alternatives --config java
  2. There are 2 programs that provide java.
  3. Selection Command
  4. -----------------------------------------------
  5. *+ 1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-2.fc35.x86_64/bin/java)
  6. 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)
  7. Enter to keep the current selection[+], or type selection number:

如果想要在可用的 JDK 之间进行切换,请再次执行该命令:

  1. $ sudo alternatives --config java

或者可以使用 SDKMan🔗 opensource.com,它可以下载、更新和管理系统中的所有 JDK。

什么是 JVM 调优?

JVM 调优指的是,通过调整 JVM 参数,来提高 Java 应用程序性能的过程,它还有助于诊断应用程序的故障。

通常情况下,在调试之前需要考虑以下几点:

◈ 成本:有时改进运行代码的硬件可以提高应用程序的性能。这可能看起来像是在“作弊”,但请考虑你愿意花多少时间调整 JVM 参数。有时应用程序需要更多的内存来执行所需的功能,而这点是任何软件技术都无法改变的。
◈ 期望结果:长期来看,稳定性比性能更重要。如果你的调优对稳定性产生了影响,那么谨慎地选择你的调优参数可能会更好。
◈ 底层问题:有时,问题可能是主机操作系统的底层问题。那么,在调整 JVM 之前,请确保 JVM 平台按预期工作。
◈ 内存泄漏:如果你在使用垃圾回收(GC)调优参数,那么,应用程序代码中很可能会存在需要修复的内存泄漏。

参数类型

JVM 参数可以分为以下三类:标准参数、非标准参数和高级选项。

标准参数

所有的 JVM 实现都支持标准参数,在终端执行 java 命令来查看标准参数列表:

  1. $ java
  2. Usage: java [options] <mainclass> [args...]
  3. (to execute a class)
  4. or java [options] -jar <jarfile> [args...]
  5. (to execute a jar file)
  6. where options include:
  7. -cp <class search path of directories and zip/jar files>
  8. -classpath <class search path of directories and zip/jar files>
  9. --class-path <class search path of directories and zip/jar files>
  10. A : separated list of directories, JAR archives,
  11. and ZIP archives to search for class files.
  12. --enable-preview
  13. allow classes to depend on preview features of this release
  14. To specify an argument for a long option, you can use --<name>=<value> or
  15. --<name> <value>.

这些是所有 JVM 都会包含的标准参数,你可以像使用任何 命令行选项🔗 opensource.com 一样安全地使用它们。例如,要验证配置的命令选项,创建 VM 并加载主类而不执行主类,请使用:

  1. $ java --dry-run <classfile>

非标准参数

非标准选项以 -X 开头。这些是通用的,并且特定于 JVM 的特定实现。要列出这些参数,请输入:

  1. $ java -X
  2. -Xbatch disable background compilation
  3. -Xbootclasspath/a:<directories and zip/jar files separated by :>
  4. append to end of bootstrap class path
  5. -Xinternalversion
  6. displays more detailed JVM version information than the
  7. -version option
  8. -Xloggc:<file> log GC status to a file with time stamps
  9. [...]

在这些参数可能会不经通知就发生变化。而且,并非所有 JVM 实现都支持这些参数。

微软构建的 JVM 可能与 RedHat 构建的 JVM 有不同的参数,诸如此类。

要获取详细的 JVM 版本信息,请使用如下命令:

  1. $ java -Xinternalversion --version
  2. 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)

要获取这些属性设置,请使用:

  1. $ java -XshowSettings:properties --version

高级选项

这些参数不是随意使用的,而是用于调整 Hotspot VM 的特定区域。这些参数可能会发生变化,并且不能保证得到所有 JVM 实现的支持。

这些参数以 -XX 开头。如需列出参数列表,使用如下命令:

  1. $ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version

例如,需要跟踪类的加载,那么使用下面的命令:

  1. $ java -XX:+TraceClassLoading Hello

在 Hello.java 中:

  1. public class Hello {
  2. public static void main(String[] args) {
  3. System.out.println("Inside Hello World!");
  4. }
  5. }

另一个可能会面临的问题是 OOM(内存超出(Out Of Memory))错误,它发生的时候可能没有太多的调试信息。为了解决这个问题,使用调试参数 -XX:+HeapDumpOnOutOfMemoryError,它可以创建一个带有调试信息的 .hprof 文件。

  1. // TestClass.java
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class TestClass {
  5. public static void main(String[] args) {
  6. List<Object> list = new ArrayList<Object>();
  7. for (int i = 0; i < 1000; i++) {
  8. list.add(new char[1000000]);
  9. }
  10. }
  11. }
  1. $ Javac TestClass.java
  2. $ java -XX:+HeapDumpOnOutOfMemoryError -Xms10m -Xmx1g TestClass
  3. java.lang.OutOfMemoryError: java heap space
  4. Dumping heap to java_pid444496.hprof ...
  5. Heap dump file created [1018925828 bytes in 1.442 secs]
  6. Exception in thread "main" java.lang.OutOfMemoryError: java heap space
  7. at TestClass.main(TestClass.Java:8)

有一些工具🔗 opensource.com 可以查看这个 .hprof 文件以了解问题所在。

总结

通过了解和使用 JVM 以及 JVM 参数,开发人员和终端用户都可以诊断故障并提高 Java 应用程序的性能。下次使用 Java 时,请花点时间看看有哪些参数可以用吧!

(题图由 Seksak Kerdkanno🔗 pixabay.com 在 Pixabay🔗 pixabay.com 上发布 )


via: https://opensource.com/article/22/4/jvm-parameters-java-developers

作者:Jayashree Huttanagoudar 选题:lkxed 译者:Veryzzj 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Fudgie?令人惊叹的 Budgie 桌面即将登陆 Fedora Linux | Linux 中国最适合程序员的 10 款 Linux 发行版 | Linux 中国在虚拟机中运行 Linux 的十大优点 | Linux 中国分享 8 篇使用 Linux 命令行的技巧 | Linux 中国经历逼婚、家暴、白发人送黑发人,她将60万积蓄捐光,在100岁离世,活成了传奇……我们反对战争,但不可避免的战争应该这样打在 Ubuntu Linux 如何安装 H.264 解码器 | Linux 中国CentOS 的继承者 AlmaLinux 9 发布 | Linux 中国Linux 中国开通播客频道:“开源朗读者”和“硬核观察” | Linux 中国零碎的生活System76 与惠普合作为开发者提供功能强大的 Linux 笔记本电脑 | Linux 中国我如何在 Linux 上扫描家庭照片 | Linux 中国HydraPaper:一个支持多显示器的 Linux 壁纸管理器 | Linux 中国上一个说“丼”不读jǐng的人,已经被我骂哭了如何在 Linux 和 Windows 电脑之间共享文件 | Linux 中国如何在 Fedora Linux 中安装多媒体编码器 | Linux 中国JVM 内存架构和 GC 算法基础好消息!Docker Desktop 现已支持 Linux | Linux 中国如何在 Linux 桌面中启用 “激活 Linux” 水印通知 | Linux 中国实测 Linux Mint 升级工具 | Linux 中国Archinstall 新的菜单系统让安装 Arch Linux 更容易了 | Linux 中国美国人只爱贫穷落后的中国使用 watch 和 tail 命令监视 Linux 上的活动 | Linux 中国Linux Mint 接管 Timeshift 备份工具的开发,并作为一款 XApp 来维护 | Linux 中国Fedora Linux 36 发布 | Linux 中国使用 dnf 进行 Linux 包管理 | Linux 中国Linux 内核 5.18 版本正式发布,新增显卡驱动以及硬件支持 | Linux 中国英伟达在提升 Linux 上的 GPU 使用体验上迈出了一大步 | Linux 中国使用 apt 进行 Linux 包管理 | Linux 中国你的 Linux 启动时有几只小企鹅? | Linux 中国百年较量:国家主义与自由主义微软还有另一个 Linux 发行版,而且是基于 Debian 的 | Linux 中国用 Gwenview 在 Linux 上裁剪和调整照片大小 | Linux 中国在 Linux 上使用 sudo 命令的 5 个理由 | Linux 中国是什么样的苦难,让他们如此悲惨和绝望
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。