背景:我正在对一个通过多层间接调用启动的Java应用程序进行性能测试,因此我不确定应用程序是否使用了我认为的标志启动。我希望在应用程序开始性能测试之前包含一个健全性检查,并在测试后的结果中包括有关JVM如何调整的信息,例如:
- 使用了哪种垃圾收集器?
- 是否正在活跃地进行CPU分析?
- 是否记录了gc活动?
- 处于
-Xint
或-Xmixed
模式下? - 设置了
-XX:ParallelGCThreads
吗?如果是,是什么值?如果没有,则构建默认值是什么? -XX:UseCompressedOops
是开启还是关闭?- 等等。
在Java代码中有没有一种方式(在运行时)查询其所在JVM使用的实际选项? (假设我看不到启动我的命令行,因此无法重新解析这些标志。)
如果没有一般性的方法来确定这一点,那么特定于特定JVM实现的答案也是可以的。
更新:
重要的是解决方案能够知道任何未在命令行上显式提供的值的默认值。否则,查找给定组合JVM/平台/版本/架构的每个参数的默认值将涉及大量(容易出错的)工作。我正在测试各种JVM,因此不想手动确定每个jvm发布版中每个参数的默认设置。
ps -ef
列出由 PID 启动的 JVM 进程,并在那里查看该进程的所有输入参数。这对于任何类型的 JVM 都适用。 - Aleš