了解必要的JVM(Java虚拟机)选项,以提高性能和调试.
如果您是Java开发人员或中间件管理员,那么您应该知道JVM选项的含义及其重要性,以及它们如何影响您的应用程序。让我们找出它们.
Contents
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堆大小
-s – 设置Java线程堆栈大小
-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
-详细:gc – 记录垃圾收集器的运行以及它们需要多长时间.
-XX:+ PrintGCDetails – 包含-verbose:gc中的数据,但还添加了有关新一代大小和更精确计时的信息.
-XX:-PrintGCTimeStamps – 在垃圾收集时打印时间戳.
这些JVM选项用于启用垃圾收集日志记录,这对于对延迟敏感的操作非常有效。我们曾经在寻求微秒级延迟的系统上使用,如果您认识到,大的垃圾收集可能会持续数毫秒.
因此,我们采用LMAX干扰器之类的无GC架构,但实际上,如果您不打算使用对超延迟敏感的应用程序,此便捷的选项将为您提供重要的GC统计信息。它会告诉您是大垃圾收集还是小垃圾收集,应用哪种垃圾收集器,恢复内存的频率以及保留的时间等等。.
处理“内存不足”错误
要在内存不足时触发堆转储,可以使用-XX:+ HeapDumpOnOutOfMemoryError
当您的JVM因OutOfMemory错误而死时,此JVM选项将产生堆栈转储。除非真正发生OOM,否则不涉及任何费用。该标志是生产系统的必要条件,因为它通常是深刻确定问题的唯一方法.
默认情况下,堆转储将在JVM的“当前目录”中设置。如果要在特定目录上创建堆转储,请运行
-XX:HeapDumpPath = [到堆转储目录的路径]
-XX:+ UseGCOverheadLimit
-XX:OnOutOfMemoryError ="< cmd参数 >;< cmd参数 >"
堆转储文件的大小可能非常大,最大为GB,因此请确保目标文件系统具有足够的容量.
如果我们想在发生内存不足后立即重新启动服务器,则可以出于相同目的设置此参数–
XX:OnOutOfMemoryError ="关闭-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参数。显然,操作系统位可以是32或64.
结论
我希望这可以帮助您为应用程序配置JVM参数。如果您有兴趣深入了解Java内存管理,请查看此内容。 乌迪米课程.