avatar

十六小站

欢迎来到我的个人主页! 期待与您分享我的经验与故事,一起探索技术的无穷可能!

  • 首页
  • NAS专题
  • 关于
Home Jvm参数
文章

Jvm参数

Posted 2025-02-24 Updated 2025-02- 24
By 十六
13~17 min read

JVM参数的设置对应用程序的性能和稳定性至关重要,尤其是在高并发场景下。合理的JVM参数配置可以优化内存使用、减少GC停顿时间、提升吞吐量。合适的jvm参数能将服务器性能压榨到极致。

堆内存设置

堆内存是JVM中最重要的内存区域,用于存储对象实例。合理设置堆内存大小可以避免频繁GC和内存溢出。

  • -Xms:初始堆大小(建议与-Xmx相同,避免动态调整带来的性能开销)。

  • -Xmx:最大堆大小(根据服务器内存和应用程序需求设置,通常设置为可用内存的70%-80%)。

  • -Xmn:年轻代大小(年轻代越大,Minor GC频率越低,但会减少老年代空间,需根据对象生命周期调整)。

例如:我的服务器是8G内存。我可以按以下参数设置。

-Xms6G -Xmx6G -Xmn3G

元空间设置

元空间(Metaspace)用于存储类的元数据,默认情况下没有大小限制,但为了避免内存泄漏或元空间过大,可以设置上限。

  • -XX:MetaspaceSize:初始元空间大小。

  • -XX:MaxMetaspaceSize:最大元空间大小。

示例:

-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1G

垃圾回收器选择

这也是Java这门语言常被人诟病的一项,选择合适的垃圾回收器可以显著减少GC停顿时间,提升系统性能。以下是常见的垃圾回收器及其适用场景:

1. Serial GC(串行回收器)

  • 适用于单核CPU或小型应用。

  • 参数:-XX:+UseSerialGC

2. Parallel GC(并行回收器)

  • 适用于多核CPU,追求高吞吐量的场景。

  • 参数:-XX:+UseParallelGC

3. CMS GC(并发标记清除回收器)

  • 适用于对响应时间敏感的应用,减少GC停顿时间。

  • 参数:-XX:+UseConcMarkSweepGC

4. G1 GC(Garbage-First回收器)

  • 适用于大内存、低延迟的场景,是JDK 9及以后的默认回收器。

  • 参数:-XX:+UseG1GC

示例:

-XX:+UseG1GC

GC日志配置

开启GC日志可以帮助分析垃圾回收行为,优化JVM参数。

  • -XX:+PrintGCDetails:打印GC详细信息。

  • -XX:+PrintGCDateStamps:打印GC时间戳。

  • -Xloggc:<file>:将GC日志输出到指定文件。

示例:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log

线程栈大小

每个线程都会占用一定的栈空间,默认大小为1MB。如果线程数较多,可以适当减小栈大小以节省内存。

  • -Xss:设置线程栈大小。

示例:

-Xss512k

直接内存设置

直接内存(Direct Memory)用于NIO操作,默认与堆内存大小相同。如果应用程序使用大量NIO操作,可以适当调整。

  • -XX:MaxDirectMemorySize:设置最大直接内存大小。

示例:

-XX:MaxDirectMemorySize=1G

其他优化参数

  • -XX:+DisableExplicitGC:禁止显式调用System.gc(),避免不必要的Full GC。

  • -XX:+HeapDumpOnOutOfMemoryError:在内存溢出时生成堆转储文件,便于分析。

  • -XX:HeapDumpPath=<path>:指定堆转储文件的保存路径。

  • -XX:+UseCompressedOops:启用压缩指针,减少内存占用(64位JVM默认启用)。

  • -XX:+UseStringDeduplication:字符串去重,减少内存占用(G1 GC下有效)。

示例:

-XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump

完整的JVM参数示例

以下是一个适用于高并发场景的JVM参数配置示例:

-Xms4G -Xmx4G -Xmn2G \
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump \
-XX:+DisableExplicitGC \
-XX:+UseStringDeduplication \
-Xss512k

高手之路
Java
License:  CC BY 4.0
Share

Further Reading

Apr 2, 2025

简单规则引擎

背景 在一些项目中我们需要通过用户自定义配置一些阈值逻辑进行判断是否触发阈值,例如大部分IOT项目中需要设置自动触发条件(例如:每天22:00后 且 窗帘关闭的情况下关灯)。 当然有一些成熟如规则引擎如:Drools和LiteFlow,但是这里写一款简单的java实现方案作为记录。 前端示例 以下示

Feb 24, 2025

Jvm参数

JVM参数的设置对应用程序的性能和稳定性至关重要,尤其是在高并发场景下。合理的JVM参数配置可以优化内存使用、减少GC停顿时间、提升吞吐量。合适的jvm参数能将服务器性能压榨到极致。 堆内存设置 堆内存是JVM中最重要的内存区域,用于存储对象实例。合理设置堆内存大小可以避免频繁GC和内存溢出。 -X

Dec 25, 2024

多线程的那些事

踩坑记录 在线程中打印的日志,没有错误信息和堆栈信息。 代码: ForkJoinTask<?> task = pool.submit(() -> { try { processContent(appendixs);

OLDER

OpenSearch常用脚本

NEWER

onlyoffice配置

Recently Updated

  • Onlyoffice编译
  • K6+Playwright实现并发测试
  • 简单规则引擎
  • 在WEB中子线程可以访问Request上下文
  • onlyoffice配置

Trending Tags

Java Docker 前端 中间件 数据库 群晖 unraid

Contents

©2025 十六小站. 陕ICP备2023009742号-2