最重要的 JVM 参数总结

news2025/4/17 8:32:47

1.概述

在本篇文章中,你将掌握最常用的 JVM 参数配置。

2.堆内存相关

Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
在这里插入图片描述

2.1.显式指定堆内存–Xms和-Xmx

与性能有关的最常见实践之一是根据应用程序要求初始化堆内存。如果我们需要指定最小和最大堆大小(推荐显示指定大小),以下参数可以帮助你实现:

  • -Xms[unit]
  • -Xmx[unit]

heap size 表示要初始化内存的具体大小。
unit 表示要初始化内存的单位。单位为**“ g”** (GB) 、“ m”(MB)、“ k”(KB)。

举个栗子 🌰,如果我们要为 JVM 分配最小 2 GB 和最大 5 GB 的堆内存大小,我们的参数应该这样来写:

-Xms2G -Xmx5G

2.2.显式新生代内存(Young Generation)

根据Oracle 官方文档open in new window,在堆总可用内存配置完成之后,第二大影响因素是为 Young Generation 在堆内存所占的比例。默认情况下,YG 的最小大小为 1310 MB,最大大小为无限制。

一共有两种指定 新生代内存(Young Ceneration)大小的方法:

1.通过-XX:NewSize和-XX:MaxNewSize指定

  • -XX:NewSize=[unit]
  • -XX:MaxNewSize=[unit]

举个栗子 🌰,如果我们要为 新生代分配 最小 256m 的内存,最大 1024m 的内存我们的参数应该这样来写:

  • -XX:NewSize=256m
  • -XX:MaxNewSize=1024m

2.通过-Xmn[unit]指定
举个栗子 🌰,如果我们要为 新生代分配 256m 的内存(NewSize 与 MaxNewSize 设为一致),我们的参数应该这样来写:

-Xmn256m

GC 调优策略中很重要的一条经验总结是这样说的:

将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC
日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。

另外,你还可以通过 -XX:NewRatio= 来设置老年代与新生代内存的比值。

比如下面的参数就是设置老年代与新生代内存的比值为 1。也就是说老年代和新生代所占比值为 1:1,新生代占整个堆栈的 1/2。

-XX:NewRatio=1

2.3.显式指定永久代/元空间的大小

从 Java 8 开始,如果我们没有指定 Metaspace 的大小,随着更多类的创建,虚拟机会耗尽所有可用的系统内存(永久代并不会出现这种情况)。

JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小

  • -XX:PermSize=N #方法区 (永久代) 初始大小
  • -XX:MaxPermSize=N #方法区 (永久代) 最大大小,超过这个值将会抛出 OutOfMemoryError 异常:java.lang.OutOfMemoryError: PermGen

相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。

JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是本地内存。

下面是一些常用参数:

  • -XX:MetaspaceSize=N #设置 Metaspace 的初始大小(是一个常见的误区,后面会解释)
  • -XX:MaxMetaspaceSize=N #设置 Metaspace 的最大大小

🐛 修正(参见: issue#1947open in new window):
1、Metaspace 的初始容量并不是 -XX:MetaspaceSize 设置,无论 -XX:MetaspaceSize 配置什么值,对于 64 位 JVM 来说,Metaspace 的初始容量都是 21807104(约 20.8m)。

可以参考 Oracle 官方文档 Other Considerationsopen in new window 中提到的:

Specify a higher value for the option MetaspaceSize to avoid early
garbage collections induced for class metadata. The amount of class
metadata allocated for an application is application-dependent and
general guidelines do not exist for the selection of MetaspaceSize.
The default size of MetaspaceSize is platform-dependent and ranges
from 12 MB to about 20 MB.

MetaspaceSize 的默认大小取决于平台,范围从 12 MB 到大约 20 MB。

另外,还可以看一下这个试验:JVM 参数 MetaspaceSize 的误解

2、Metaspace 由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生 FGC,且之后每次 Metaspace 扩容都会发生 Full GC。

也就是说,MetaspaceSize 表示 Metaspace 使用过程中触发 Full GC 的阈值,只对触发起作用。

垃圾搜集器内部是根据变量 _capacity_until_GC来判断 Metaspace 区域是否达到阈值的,初始化代码如下所示:

> void MetaspaceGC::initialize() {   // Set the high-water mark to
> MaxMetapaceSize during VM initializaton since   // we can't do a GC
> during initialization.   _capacity_until_GC = MaxMetaspaceSize; }

相关阅读: issue 更正:MaxMetaspaceSize如果不指定大小的话,不会耗尽内存 #1204

3.垃圾收集相关

3.1.垃圾回收器

为了提高应用程序的稳定性,选择正确的垃圾收集open in new window算法至关重要。

JVM 具有四种类型的 GC 实现:

  • 串行垃圾收集器
  • 并行垃圾收集器
  • CMS 垃圾收集器
  • G1 垃圾收集器

可以使用以下参数声明这些实现:-XX:+UseSerialGC

-XX:+UseParallelGC
-XX:+UseParNewGC
-XX:+UseG1GC

有关垃圾回收实施的更多详细信息,请参见此处open in new window。

3.2.GC 日志记录

生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印 GC 日志的参数,便于分析 GC 相关的问题。

# 必选
# 打印基本 GC 信息
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
# 打印对象分布
-XX:+PrintTenuringDistribution
# 打印堆数据
-XX:+PrintHeapAtGC
# 打印Reference处理信息
# 强引用/弱引用/软引用/虚引用/finalize 相关的方法
-XX:+PrintReferenceGC
# 打印STW时间
-XX:+PrintGCApplicationStoppedTime

# 可选
# 打印safepoint信息,进入 STW 阶段之前,需要要找到一个合适的 safepoint
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1

# GC日志输出的文件路径
-Xloggc:/path/to/gc-%t.log
# 开启日志文件分割
-XX:+UseGCLogFileRotation
# 最多分割几个文件,超过之后从头文件开始写
-XX:NumberOfGCLogFiles=14
# 每个文件上限大小,超过就触发分割
-XX:GCLogFileSize=50M

4.处理 OOM

对于大型应用程序来说,面对内存不足错误是非常常见的,这反过来会导致应用程序崩溃。这是一个非常关键的场景,很难通过复制来解决这个问题。

这就是为什么 JVM 提供了一些参数,这些参数将堆内存转储到一个物理文件中,以后可以用来查找泄漏:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit
  • 这里有几点需要注意:HeapDumpOnOutOfMemoryError 指示 JVM 在遇到 OutOfMemoryError 错误时将heap 转储到物理文件中。
  • HeapDumpPath 表示要写入文件的路径; 可以给出任何文件名; 但是,如果 JVM 在名称中找到一个 标记,则当前进程的进程 id将附加到文件名中,并使用.hprof格式
  • OnOutOfMemoryError用于发出紧急命令,以便在内存不足的情况下执行; 应该在 cmd args 空间中使用适当的命令。例如,如果我们想在内存不足时重启服务器,我们可以设置参数: -XX:OnOutOfMemoryError=“shutdown -r” 。
  • UseGCOverheadLimit 是一种策略,它限制在抛出 OutOfMemory 错误之前在 GC 中花费的 VM 时间的比例

5.其他

  • -server : 启用“ Server Hotspot VM”; 此参数默认用于 64 位 JVM
  • -XX:+UseStringDeduplication : Java 8u20 引入了这个 JVM 参数,通过创建太多相同String 的实例来减少不必要的内存使用; 这通过将重复 String 值减少为单个全局 char [] 数组来优化堆内存。
  • -XX:+UseLWPSynchronization: 设置基于 LWP (轻量级进程)的同步策略,而不是基于线程的同步。``
  • -XX:LargePageSizeInBytes `: 设置用于 Java堆的较大页面大小; 它采用 GB/MB/KB 的参数; 页面大小越大,我们可以更好地利用虚拟内存硬件资源; 然而,这可能会导致PermGen 的空间大小更大,这反过来又会迫使 Java 堆空间的大小减小。
  • -XX:MaxHeapFreeRatio : 设置 GC 后, 堆空闲的最大百分比,以避免收缩。
  • -XX:SurvivorRatio : eden/survivor 空间的比例,例如-XX:SurvivorRatio=6 设置每个 survivor 和 eden 之间的比例为1:6。
  • -XX:+UseLargePages : 如果系统支持,则使用大页面内存; 请注意,如果使用这个 JVM 参数,OpenJDK 7可能会崩溃。
  • -XX:+UseStringCache : 启用 String池中可用的常用分配字符串的缓存。
  • -XX:+UseCompressedStrings : 对 String 对象使用 byte []类型,该类型可以用纯 ASCII 格式表示。
  • -XX:+OptimizeStringConcat : 它尽可能优化字符串串联操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Auto-GPT来啦,手把手教你安装更稳定的stable的Auto-GPT,实现两个AutoGPT合作执行任务,AutoGPT代理同时执行任务

进入Auto-GPT项目 https://github.com/Significant-Gravitas/Auto-GPT 应该在git bash还是git cmd命令窗口敲以上命令 应该在git bash窗口中敲git命令。 Git Bash是Windows上的一个搭载了Git的终端仿真器&#xff0c;提供了类似Unix的命令行环境&#xff0c;使得在Windows上…

深入浅出剖析JAVA多线程原理

1. 线程基础知识 1.1 线程与进程 1.1.1 进程 ●程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理…

nacos登录 提示权限认证失败 没有命名空间的访问权限

前言 环境&#xff1a;centos7.9 nacos-2.2.2 问题描述 最近在部署nacos-2.2.2版本的时候&#xff0c;这是目前2023年4月份最新版本&#xff0c;发现按照start.out日志给出的登录地址&#xff0c;http://192.168.158.128:8848/nacos/index.html登录&#xff0c;发现总是提示…

一图看懂系列——文件处理模块(总目录)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂系列——文件处理模块&#xff08;总目录&#xff09; 摘要目录注&#xff1a; 摘要 本文介绍了文件处理的模块的目录。 以前每个模块单独撰文&#xff0c;现在把它们归集起…

node版本管理nvm的使用

在很多情况下对node版本需要安装多版本的控制&#xff0c;如何快速的切换node版本&#xff0c;请在配置完node的环境变量的基础上&#xff0c;阅读这篇文章。这里需要介绍nvm这个工具&#xff1a; 一、下载 官方下载地址&#xff1a;https://github.com/coreybutler/nvm-wind…

使用Python创建分形图案

分形是无限复杂的模式&#xff0c;在不同的尺度上具有自相似性。例如&#xff0c;一棵树的树干会分裂成更小的树枝。这些树枝又分裂成更小的树枝&#xff0c;以此类推。 通过编程的方式生成分形&#xff0c;可以将简单的形状变成复杂的重复图案。 本文将探讨如何利用一些简单…

ThinkSystem DM 系列混合闪存 —— 快速、灵活、可靠、安全

ThinkSystem DM 系列混合闪存 —— 快速、灵活、可靠、安全 统一存储优化混合云部署具备一流数据管理的横向扩展混合存储 挑战 实现跨闪存、磁盘和云数据驱动型业务 存储已从 IT 事后思考的问题发展成公司基础架构至关重要的组件。企业感觉迫切需要跟上爆炸式增长的数据。标…

抖音滑块以及轨迹分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 我们在web端打开用户主页的时候,时不时的会出现滑…

tf-idf+lda分析多篇文章摘要

import pandas as pd import numpy as np import matplotlib.pyplot as plt #import seaborn as sns plt.rcParams[font.sans-serif] [KaiTi] #指定默认字体 SimHei黑体 plt.rcParams[axes.unicode_minus] False #解决保存图像是负号 import jieba import os # stop_list …

RabbitMQ的介绍和安装

文章目录 1.1 RabbitMQ介绍1.2 RabbitMQ的安装1.2.1 下载镜像1.2.2 安装启动1.2.3 测试 1.1 RabbitMQ介绍 RabbitMQ是一个开源的消息队列中间件&#xff0c;可以用于构建分布式应用程序&#xff0c;使应用程序能够快速、可靠地处理大量消息。它实现了AMQP&#xff08;高级消息队…

Vue安装脚手架 vue-cli

Vue 脚手架是 Vue 官方提供的标准化开发工具&#xff08;开发平台&#xff09; 在安装脚手架之前我们还需要安装 Node.JS 和 npm 全局安装 vue-cli 【初次安装】: 首先打开命令行 输入 npm install -g vue/cli 再按回车键 安装脚手架 安装命令行&#xff1a; npm install …

多层LCP技术的毫米波段超宽带槽天线设计

1、引言 无线宽带通信的迅猛发展需要能传输高比特率的新型宽带天线。毫米波段是短距离高比特率无线通信的重要波段。所以近年来&#xff0c;毫米波段小型高性能的超宽带天线吸引了大量的研究人员在这方面进行研究工作。 天线设计的另一个重要趋势是集成天线的射频前端电路。在…

Linux/Unix编写sh脚本,设置开机自动启动脚本在linux下

1编写.sh脚本的基本步骤&#xff1a; 创建一个新的文本文件&#xff0c;使用一个文本编辑器&#xff0c;比如vi或nano&#xff0c;来编写脚本。你需要保存文件为.sh扩展名&#xff0c;以便让系统知道这是一个shell脚本文件。 touch myprogram.sh #!/bin/sh# 进入C程序所在目…

基于JAVA的网络通讯系统设计与实现

一般来说&#xff0c;聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成&#xff0c;本系统采用客户机/服务器架构模式&#xff0c;通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信&#xff0c;由于聊天是多点对多…

HTB-Cascade

HTB-Cascade 信息收集立足s.smith -> arksvc使用脚本获取CascAudit.exe加密的密码明文修改IL指令获取 arksvc -> administrator 信息收集 查看smbclient。 rpcclient空密码连接并收集信息。 收集到用户列表&#xff0c;此外没有有意思的信息。 CascGuest arksvc s.smi…

Qt/QML编程学习之心得:二进制兼容、私有实现及Q_D/Q_Q指针(三)

QML画好或说描述好界面之后,实现部分通过C++实现,Qt采用了私有实现的设计模式解决了二进制兼容的问题。 二进制兼容问题描述: 现在有一个Widget, 包含一个私有成员变量m_geometry ,编译 Widget 并且发布为MyWidgetLib 1.0 。该应用程序名字为TestAPP,基于 Qt 4.9。 cla…

【Linux网络服务】Linux网络设置

一、查看网络配置 1.1ifconfig 1.2ip a 1.3什么是mtu 最大传输单元MTU&#xff0c;是指网络能够传输的最大数据包大小&#xff0c;以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值&#xff0c;或者是超过了发送路径…

异步爬虫的原理和解析

我们知道爬虫是 IO 密集型任务&#xff0c;比如如果我们使用 requests 库来爬取某个站点的话&#xff0c;发出一个请求之后&#xff0c;程序必须要等待网站返回响应之后才能接着运行&#xff0c;而在等待响应的过程中&#xff0c;整个爬虫程序是一直在等待的&#xff0c;实际上…

焦虑症会出现哪些问题 什么因素导致的焦虑症

当说起焦虑症&#xff0c;大多数人想到的就是植物神经紊乱&#xff0c;确实&#xff0c;这两种疾病是非常容易混淆的&#xff0c;甚至很多时候植物神经紊乱都会当做焦虑症进行治疗&#xff0c;虽然这种疾病大多效果不会太理想。 你们知道什么是焦虑症吗&#xff1f; 很多人当出…

Android ProtoLog动态开启相关wm logging源码分析补充

Android ProtoLog动态开启相关wm logging源码分析补充 针对上一节已经清楚了相关的代码中怎么可以打印到logcat中&#xff0c;其实本质上还就是protologtool这个工具对代码中的所有ProtoLog进行了相关的替换成了具体实现&#xff0c;最后会条件判断输出到Slog中 本文就重点来看…