JVM实用参数3:打印所有XX参数及值

本文介绍了如何在Java 6 (update 21或更高版本)的HotSpot JVM中使用特定参数来打印所有XX参数及其值。通过`-XX:+PrintFlagsFinal`和`-XX:+PrintFlagsInitial`可以查看参数的默认值和当前值,而`-XX:+PrintCommandLineFlags`则用于显示已设置的XX参数。这些工具对于理解和调整JVM性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值。

-XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial

让我们现在就了解一下新参数的输出。以 -client 作为参数的 -XX:+PrintFlagsFinal   的结果是一个按字母排序的590个参数表格(注意,每个release版本参数的数量会不一样)

$ java -client -XX:+PrintFlagsFinal Benchmark
[Global flags]
uintx AdaptivePermSizeWeight               = 20               {product}
uintx AdaptiveSizeDecrementScaleFactor     = 4                {product}
uintx AdaptiveSizeMajorGCDecayTimeScale    = 10               {product}
uintx AdaptiveSizePausePolicy              = 0                {product}[...]
uintx YoungGenerationSizeSupplementDecay   = 8                {product}
uintx YoungPLABSize                        = 4096             {product}
 bool ZeroTLAB                             = false            {product}
 intx hashCode                             = 0                {product}

(校对注:你可以尝试在命令行输入上面的命令,亲自实现下)

表格的每一行包括五列,来表示一个XX参数。第一列表示参数的数据类型,第二列是名称,第四列为值,第五列是参数的类别。第三列”=”表示第四列是参数的默认值,而”:=” 表明了参数被用户或者JVM赋值了。

注意对于这个例子我只是用了Benchmark类,因为这个系列前面的章节也是用的这个类。甚至没有一个主类的情况下你能得到相同的输出,通过运行java 带另外的参数 -version.现在让我们检查下 server VM提供了多少个参数。我们也能指定参数-XX:+UnlockExperimentalVMOptions 和-XX:+UnlockDiagnosticVMOptions ;来解锁任何额外的隐藏参数。

$ java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal Benchmark

724个参数,让我们看一眼那些已经被赋值的参数。

$ java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal Benchmark | grep ":"
uintx InitialHeapSize                     := 57505088         {product}
uintx MaxHeapSize                         := 920649728        {product}
uintx ParallelGCThreads                   := 4                {product}
 bool PrintFlagsFinal                     := true             {product}
 bool UseParallelGC                       := true             {product}

(校对注:这个命令非常有用)我们仅设置一个自己的参数 -XX:+PrintFlagsFinal。其他参数通过server VM基于系统设置的,以便以合适的堆大小和GC设置运行。

如果我们只想看下所有XX参数的默认值,能够用一个相关的参数,-XX:+PrintFlagsInitial  。用 -XX:+PrintFlagsInitial, 只是展示了第三列为“=”的数据(也包括那些被设置其他值的参数)。

然而,注意当与-XX:+PrintFlagsFinal 对比的时候,一些参数会丢失,大概因为这些参数是动态创建的。

研究表格的内容是很有意思的,通过比较client和server VM的行为,很明显了解哪些参数会影响其他的参数。有兴趣的读者,可以看一下这篇不错文章Inspecting HotSpot JVM Options。这个文章主要解释了第五列的参数类别。

-XX:+PrintCommandLineFlags

让我们看下另外一个参数,事实上这个参数非常有用: -XX:+PrintCommandLineFlags。这个参数让JVM打印出那些已经被用户或者JVM设置过的详细的XX参数的名称和值。

换句话说,它列举出 -XX:+PrintFlagsFinal的结果中第三列有":="的参数。以这种方式,我们可以用-XX:+PrintCommandLineFlags作为快捷方式来查看修改过的参数。看下面的例子。

$ java -server -XX:+PrintCommandLineFlags Benchmark
 -XX:InitialHeapSize=57505088 -XX:MaxHeapSize=920081408 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+UseParallelGC

现在如果我们每次启动java 程序的时候设置 -XX:+PrintCommandLineFlags 并且输出到日志文件上,这样会记录下我们设置的JVM 参数对应用程序性能的影响。类似于 -showversion(见 Part1),我建议 –XX:+PrintCommandLineFlags 这个参数应该总是设置在JVM启动的配置项里。因为你从不知道你什么时候会需要这些信息。

奇怪的是在这个例子中,通过 -XX:+PrintCommandLineFlags 列出堆的最大值会比通过-XX:+PrintFlagsFinal列举出的相应值小一点。如果谁知道两者之间不同的原因,请告诉我。

### 解决 MySQL 5.7.20 版本重置密码失败的方法 #### 修改配置文件并重启服务 为了能够无密码进入 MySQL 进行操作,在 `/etc/my.cnf` 或者 `/etc/mysql/my.cnf` 文件中的 `[mysqld]` 部分添加 `skip-grant-tables` 参数,这会让 MySQL 跳过权限验证表从而允许无需提供账户密码就能访问数据库[^4]。 ```bash sudo vi /etc/my.cnf # 添加如下内容到 [mysqld] 下面 [mysqld] skip-grant-tables ``` 完成编辑之后保存退出,并重启 MySQL 服务: ```bash sudo systemctl restart mysqld.service ``` #### 登录 MySQL 并更新 root 密码 此时可以不带 `-p` 参数直接通过命令行登录 MySQL 数据库环境。一旦成功连接上,则执行 SQL 命令来更改 root 用户的认证方式以及设定新密码: ```sql FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPasswordHere'; -- 对于某些情况可能还需要加上这一句以确保生效 UPDATE mysql.user SET authentication_string=PASSWORD('NewPasswordHere') WHERE User='root'; ``` 注意这里使用的 `'NewPasswordHere'` 应替换为自己想要设置的新密码字符串[^3]。 #### 更新 user 表内的状态标志位 除了上述步骤外,有时也需要调整用户表里关于密码到期的状态标记。具体做法是在同一会话内继续运行下面这条语句把对应记录里的 `password_expired` 字段值设成 `'N'` : ```sql UPDATE mysql.user SET password_expired = 'N' WHERE User = 'root'; ``` 最后再次刷新授权信息使改动即时起效: ```sql FLUSH PRIVILEGES; ``` #### 移除 skip-grant-tables 设置恢复安全模式 当确认新的 root 密码已经正常工作后,应当移除之前加入的 `skip-grant-tables` 参数以免留下安全隐患。重新加载配置文件并且让 MySQL 返回常规的安全状态下运作。 ```bash # 编辑 my.cnf 删除或注释掉 skip-grant-tables 行 sudo vi /etc/my.cnf # 重启服务应用变更 sudo systemctl restart mysqld.service ``` 现在应该可以用刚刚创建好的新密码去尝试登录了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公众号:jvm知识库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值