本文概述
了解必要的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 - set initial Java heap size
-Xmx - set maximum Java heap size
-Xss - set java thread stack size
-Xms –此选项用于定义JVM的起始堆大小, 例如Xms2048m, 这意味着JVM的初始堆大小约为2 GB。因此, 当JVM启动时, 堆内存将很大。令人惊讶的是!这样做是为了防止在启动期间调整大小并延长JVM的启动时间。
-Xmx –此选项用于定义JVM的最大堆大小, 例如Xmx2048m, 这意味着JVM的最大堆大小仅为2 GB。
实际上, 你将始终始终具有-Xmsand-Xmx。
设置堆的百分比
-XX:MaxHeapFreeRatio –设置GC之后为避免收缩而释放的最大堆百分比。
-XX:MinHeapFreeRatio –设置GC之后避免扩展的最小可用堆百分比;要监视堆使用情况, 可以使用JCosole。
启用课程数据共享
指定Xshareclasses选项以在共享的类缓存中启用类数据共享。 JVM连接到现有高速缓存, 或者如果不存在则创建一个高速缓存。你可以具有多个缓存, 并且可以通过在-Xshareclasses选项中添加子选项来指定正确的缓存。
PermGen大小
早期的JVM选项定义堆内存的大小, 但是-XX:PermSize用于定义保存字符串池和类元数据的PermGen空间的大小。该选项对于像Tomcat这样的Web服务器特别有效, 该服务器通常在部署期间加载Web应用程序的类。
顺便说一句, 值得意识到的是PermGen空间已由Java 8中的Metaspace接管, 如果你使用JRE 8 JVM运行, 则此选项不适用。
打印GC
-verbose:gc - logs garbage collector runs and how long they're taking.
-XX:+PrintGCDetails - includes the data from -verbose:gc but also adds information about the size of the new generation and more accurate timings.
-XX:-PrintGCTimeStamps - Print timestamps at garbage collection.
这些JVM选项用于启用垃圾收集日志记录, 这对于对延迟敏感的操作非常有效。我们曾经在寻求微秒延迟的系统上使用, 如果你认识到, 大的垃圾收集可能会持续几毫秒。
因此, 我们选择了LMAX干扰器之类的无GC架构, 但实际上, 如果你不打算使用对超延迟敏感的应用程序, 此便捷的选项将为你提供重要的GC统计信息。无论是大垃圾收集还是小垃圾收集, 应用哪种类型的垃圾收集器, 恢复内存的频率以及保留的时间等, 都会为你提供。
处理”内存不足”错误
要在内存不足时触发堆转储, 可以使用-XX:+ HeapDumpOnOutOfMemoryError
当你的JVM因OutOfMemory错误而死时, 此JVM选项将产生堆栈转储。除非真正发生OOM, 否则不涉及任何费用。该标志是生产系统的必要条件, 因为它通常是深刻确定问题的唯一方法。
默认情况下, 堆转储将在JVM的”当前目录”中设置。如果要在特定目录上创建堆转储, 请运行
-XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
堆转储文件的大小可能非常大, 最大为GB, 因此请确保目标文件系统具有足够的容量。
如果我们想在发生内存不足后立即重新启动服务器, 则可以出于相同目的设置此参数–
XX:OnOutOfMemoryError="shutdown -r"
跟踪类的加载和卸载
-XX:+ TraceClassLoading和-XX:+ TraceClassUnloading是两个JVM选项, 每当类加载到JVM或从JVM卸载时, 我们就使用它们来打印日志记录信息。如果你有任何类型的内存泄漏链接到类加载器, 并且怀疑它没有卸载类或垃圾回收, 则这些JVM标志很有用。
Java类路径
在谈论JAVA类路径时, 那么-Xbootclasspath指定了我们希望未经验证而加载的类路径条目。 JVM会验证加载的所有类, 以确保它不会尝试取消对带有int的对象的引用, 不会在堆栈中弹出额外条目或将太多条目压入等等。
将类放到bootclasspath上也可以省钱, 但是仅当你知道这些类已经被多次验证时才应使用。在JRuby中, 对于一个简单的脚本, 这将启动时间减少了一半甚至更多。
剖析
Java性能分析是监视各种JVM级别参数的过程, 例如方法执行, 线程执行, 垃圾回收和对象创建。 Java Profiling还为你提供了对目标应用程序执行及其资源利用率的更详尽了解。
-Xprof
-Xrunhprof
64位环境
在同时安装了32位和64位软件包的OS环境中, JVM会自动选择32位环境软件包作为默认环境。
如果要手动将环境设置为64位, 则可以使用-d <OS bit>参数进行设置。显然, OS位可以是32或64。
总结
我希望这可以帮助你为应用程序配置JVM参数。如果你有兴趣深入学习Java内存管理, 请查看此Udemy课程。
评论前必须登录!
注册