jvm如何进行优化 (jvm怎么做缓存)

在使用 Java 虚拟机(JVM)进行应用程序开发时,有一些小技巧可以提高性能、调试和可维护性。以下是一些 JVM 小技巧:

调整堆内存大小: 使用 -Xms-Xmx 参数可以调整 JVM 的初始堆大小和最大堆大小。合理调整这些参数可以优化应用程序的性能。

java -Xms256m -Xmx512m -jar myapp.jar

选择合适的垃圾回收器: 根据应用程序的特性选择合适的垃圾回收器。例如,使用 G1 垃圾回收器可以在大堆内存下提供更好的性能。

java -XX:+UseG1GC -jar myapp.jar

启用垃圾回收器日志: 通过添加参数 -Xlog:gc* 可以启用详细的垃圾回收器日志,有助于分析应用程序的内存管理情况。

java -Xlog:gc* -jar myapp.jar

远程调试应用程序: 使用远程调试功能可以在应用程序运行时连接调试器,方便进行调试和性能分析。

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar myapp.jar

使用 JConsole 和 VisualVM 进行监控: JConsole 和 VisualVM 是 Java 自带的监控工具,可以用于实时监控 JVM 的运行状况、线程、内存使用等。

分析线程 Dump: 在应用程序运行时,使用 jstack 工具生成线程 Dump,可以用于分析应用程序中的死锁和性能问题。

jstack <pid> > thread_dump.txt

使用 Flight Recorder 进行持续监控: Java Flight Recorder(JFR)是 JDK 7u40 及更高版本提供的性能监控工具,可以用于记录应用程序的运行事件。

使用 -XX:+UnlockExperimentalVMOptions: 这个选项可以解锁一些实验性的 JVM 特性,但在生产环境中慎重使用。

java -XX:+UnlockExperimentalVMOptions -jar myapp.jar

启用即时编译器的详细输出: 使用 -XX:+PrintCompilation 可以在控制台输出即时编译器(JIT)的详细信息。

java -XX:+PrintCompilation -jar myapp.jar

禁用 Java 类缓存: 在开发和测试过程中,有时禁用 Java 类缓存可以更快地反映代码的变化。

java -Djava.compiler=NONE -jar myapp.jar

使用 -XX:+UseCompressedOops: 当堆内存小于32 GB时,启用压缩指针(Compressed Oops)可以减小对象引用的大小,从而节省堆空间。

java -XX:+UseCompressedOops -jar myapp.jar

配置线程栈大小: 使用 -Xss 参数可以调整线程栈的大小,适用于应用程序有大量线程的情况。

java -Xss256k -jar myapp.jar

启用类数据共享(CDS): 使用 -Xshare:dump 参数生成共享的类数据文件,然后通过 -Xshare:on 启用类数据共享,可以加速 JVM 的启动。

java -Xshare:dump -jar myapp.jar
java -Xshare:on -jar myapp.jar

使用 -XX:CompileThreshold 调整编译阈值: 可以通过调整编译阈值来控制方法何时被即时编译。

java -XX:CompileThreshold=1000 -jar myapp.jar

禁用特定的 JIT 编译器: 使用 -XX:-UseCompiler 可以禁用 JIT 编译器,有助于排除 JIT 编译引起的性能问题。


java -XX:-UseCompiler -jar myapp.jar

使用 -XX:MaxMetaspaceSize 调整元空间大小: 元空间用于存放类的元数据,可以通过该选项调整元空间的大小。

java -XX:MaxMetaspaceSize=256m -jar myapp.jar

使用 -XX:ReservedCodeCacheSize 调整代码缓存大小: 该选项用于调整 JVM 代码缓存的大小。

java -XX:ReservedCodeCacheSize=128m -jar myapp.jar

使用 -XX:+HeapDumpOnOutOfMemoryError: 在发生内存溢出时自动生成堆转储文件。

java -XX:+HeapDumpOnOutOfMemoryError -jar myapp.jar

启用 Java Flight Recorder(JFR): 使用 -XX:+UnlockCommercialFeatures -XX:+FlightRecorder 可以启用 JFR,用于高级性能分析。

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -jar myapp.jar

使用 -XX:OnError 处理致命错误: 通过该选项可以指定一个命令或脚本来处理致命错误。

java -XX:OnError="echo Oops, something went wrong!" -jar myapp.jar

使用 -XX:+PrintFlagsFinal 查看所有 JVM 参数: 这个选项可以输出 JVM 运行时的所有参数及其最终值,有助于了解 JVM 的默认配置。

java -XX:+PrintFlagsFinal -version

使用 -XX:+UseNUMA 支持非一致性内存访问: 在 NUMA 架构的系统上,启用这个选项可以提高内存访问性能。

java -XX:+UseNUMA -jar myapp.jar

启用大页内存支持: 大页内存可以减小页表的大小,提高内存访问性能。具体支持和配置取决于操作系统。

java -XX:+UseLargePages -jar myapp.jar

使用 -XX:+ExitOnOutOfMemoryError: 在发生内存溢出时直接退出应用程序,避免继续运行导致更严重的问题。

java -XX:+ExitOnOutOfMemoryError -jar myapp.jar

使用 -XX:ThreadStackSize 调整线程栈的默认大小: 默认线程栈大小可能不适用于所有应用程序。

java -XX:ThreadStackSize=512k -jar myapp.jar

使用 -XX:MaxDirectMemorySize 调整直接内存的大小: 直接内存是不受 Java 堆管理的,通过这个选项可以限制其大小。

java -XX:MaxDirectMemorySize=256m -jar myapp.jar

使用 JVM 警告选项: 使用 -Xlint 和 -Xlint:unchecked 选项启用编译器警告,有助于检测潜在的问题。

javac -Xlint:unchecked MyClass.java

定期检查并应用 JVM 更新: 定期检查并升级到最新的 JVM 版本,以获取性能改进、安全修复和新特性。

考虑使用容器优化的 JVM: 一些 JVM 发行版专为容器化环境进行了优化,例如 GraalVM。

使用 Java 11+ 的垃圾回收器接口(G1GC、ZGC、Shenandoah): Java 11+ 引入了更先进的垃圾回收器,根据应用程序需求选择合适的回收器。

使用 Java Mission Control 和 Java Flight Recorder 进行性能分析: 这些工具可以帮助你监控、分析和调优 Java 应用程序的性能。

使用 -XX:NativeMemoryTracking: 启用本地内存跟踪,用于分析 JVM 的本地内存使用情况。

java -XX:NativeMemoryTracking=summary -jar myapp.jar

使用 -XX:CompileCommand: 可以通过该选项向 JIT 编译器发送特定的编译命令。

java -XX:CompileCommand="print, MyClass::myMethod" -jar myapp.jar

使用 -XX:+PrintCommandLineFlags: 查看 JVM 启动时所有的命令行标志。

java -XX:+PrintCommandLineFlags -jar myapp.jar

了解 JVM 参数的生命周期: JVM 参数有三个生命周期阶段:静态(在 JVM 启动时设置)、动态(在运行时通过 JMX 修改)、非生命周期(只能通过重新启动 JVM 生效)。

使用 JEP 333 中的 Promptly Return Unused Committed Memory: Java 11 引入的 JEP 333 允许及时返回未使用的堆内存。

java -XX:+UseZGC -XX:MaxHeapFreeRatio=70 -XX:MinHeapFreeRatio=40 -jar myapp.jar

使用 JEP 356 中的 Enhanced Pseudo-Random Number Generators: Java 17 引入的 JEP 356 提供了更强大的伪随机数生成器。

java -XX:UseRandom=always -jar myapp.jar

使用 jdeps 工具分析类的依赖关系: jdeps 可以用于分析 Java 类的依赖关系,有助于理解应用程序的结构。

jdeps myapp.jar

使用 -XX:DumpLoadedClassList 和 -XX:DumpLoadedClassListFile: 将已加载类的列表导出到文件,有助于分析应用程序的类加载情况。

java -XX:DumpLoadedClassList=classes.lst -XX:DumpLoadedClassListFile=classes.lst -jar myapp.jar

使用 -XX:OnOutOfMemoryError 和 -XX:OnError 定制错误处理: 在发生内存溢出或错误时执行自定义的脚本或命令。

java -XX:OnOutOfMemoryError="kill -9 %p" -XX:OnError="echo Oops, something went wrong!" -jar myapp.jar

阅读是一种习惯,点赞是一种美德,共勉