10个对于生产环境中的JAVA应用系统重要的JVM选项

了解JVM(Java虚拟机)的重要选项,以获得更好的性能和调试。

如果您是Java或中间件管理员,那么您应该知道JVM选项的含义及其重要性,以及它们对应用程序的影响。让我们来了解一下。

JVM选项概述

谈到JVM选项,有三种类型的选项可以包含到您的JVM中,标准选项、非标准选项和高级选项。如果您尝试一个高级选项,您总是使用-XX选项。同样,如果您应用一个非标准选项,您使用-X选项。标准选项不在选项前添加任何内容。

您的应用程序使用了哪些JVM选项?

如果应用程序在Linux上运行,您可以使用ps -ef | grep java命令来识别Java进程,并查看作为进程参数打印的JVM选项。如果系统上有多个Java进程正在运行,则可能需要使用与您的Java应用程序唯一相关的关键字。

如果您的参数过长,那么可以尝试使用ps -auxww命令,因为该命令还会显示长参数列表。

获取JVM标志列表后,您可以对任何Java应用程序(例如Tomcat)的行为有所了解。

Java堆大小

 -Xms - 设置初始Java堆大小
 -Xmx - 设置最大Java堆大小
 -Xss - 设置Java线程堆栈大小

-Xms – 此选项用于定义JVM的初始堆大小,例如,Xms2048m代表JVM的初始堆大小约为2GB。因此,当JVM启动时,堆内存将达到这么大。令人惊讶的是,这是为了防止在启动期间调整大小并提高JVM的启动时间。

-Xmx – 此选项用于定义JVM的最大堆大小,例如,Xmx2048m代表JVM的最大堆大小仅为2GB。

您通常会同时使用-Xms-Xmx

设置堆的百分比

-XX:MaxHeapFreeRatio – 设置进行垃圾回收后堆剩余的最大百分比,以避免收缩。

-XX:MinHeapFreeRatio – 设置进行垃圾回收后堆剩余的最小百分比,以避免扩展;要监视堆使用情况,可以使用JConsole。

启用类数据共享

使用Xshareclasses选项来启用共享类缓存中的类数据共享。JVM连接到现有缓存或如果不存在则创建缓存。您可以拥有多个缓存,并且可以通过向-Xshareclasses选项添加子选项来指定正确的缓存。

PermGen大小

前面的JVM选项定义了堆内存的大小,但-XX:PermSize用于定义PermGen空间的大小,其中保存了字符串池和类元数据。对于像Tomcat这样经常在部署期间加载Web应用程序的Web服务器,此选项特别有效。

顺便说一下,值得注意的是在Java 8中,PermGen空间被Metaspace取代,如果您正在使用JRE 8 JVM,则此选项不适用。

打印GC信息

-verbose:gc - 记录垃圾回收运行及其所需时间。
-XX:+PrintGCDetails - 包含-verbose:gc的数据,同时添加有关新生代大小和更准确的时间的信息。
-XX:-PrintGCTimeStamps - 打印垃圾回收的时间戳。

这些JVM选项用于启用垃圾回收日志记录,对于延迟敏感的操作非常有效。我们过去使用的系统追求微秒级延迟,如果你注意到,一个大的垃圾回收可能持续几毫秒。

因此,我们选择了像LMAX disruptor这样的无GC架构,但是如果你不追求超低延迟的应用程序,这个方便的选项将为您提供重要的GC统计信息。它将告诉您是大垃圾回收还是小垃圾回收,应用了哪种垃圾收集器,内存恢复的频率以及持续时间等等。

处理“内存不足”错误

要在内存不足时触发堆转储,您可以使用-XX:+HeapDumpOnOutOfMemoryError

当您的JVM因OutOfMemory Error而死机时,此JVM选项会生成一个堆栈转储。除非真的发生OOM,否则不会产生任何开销。对于生产系统来说,此标志是必需的,因为通常这是深入了解问题的唯一方式。

堆转储文件默认将设置在JVM的“当前目录”中。如果您希望在特定目录上创建堆转储,请运行

-XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError=";"

堆转储文件可能非常大,高达几十GB,因此请确保目标文件系统具有足够的容量。

如果我们想在内存不足发生后立即重新启动服务器,那么我们可以设置相同目的的参数 –

XX:OnOutOfMemoryError="shutdown -r"

跟踪类的加载和卸载

-XX:+TraceClassLoading-XX:+TraceClassUnloading是两个JVM选项,我们用它们来在类加载到JVM或从JVM中卸载时打印日志信息。如果您遇到与类加载器相关的任何类型的内存泄漏,并怀疑类没有被卸载或垃圾回收,那么这些JVM标志就会很有用。

Java类路径

谈到JAVA类路径,-Xbootclasspath指定了我们希望在没有验证的情况下加载的类路径条目。JVM会验证它加载的所有类,以确保它不会尝试使用int解引用对象、从堆栈中弹出额外条目或推入过多条目,等等。

将类放在bootclasspath上也可以省去成本,但只有在您知道这些类之前已经经过了多次验证时才应使用。在JRuby中,这将简化简单脚本的启动时间。

性能分析

Java性能分析是监视各种JVM级别参数的过程,例如方法执行、线程执行、垃圾回收和对象创建。Java性能分析为您提供对目标应用程序执行及其资源利用情况的更详细的视图。

-Xprof 
-Xrunhprof

64位环境

在安装了32位和64位软件包的操作系统环境中,JVM会自动选择32位环境软件包作为默认选项。

如果我们想手动将环境设置为64位,可以使用-d参数。显然,OS bit可以是32位或64位。

结论

希望这能帮助您为应用程序配置JVM参数。如果您有兴趣深入了解Java内存管理,请查看此Udemy course

类似文章