关于jps命令-Joption参数的使用困惑及疑问
关于
jps命令-Joption参数的两个疑问解答 一、什么是“javac调用的java launcher”?
首先得理清文档里容易混淆的表述:-J是所有基于Java实现的JDK工具通用的参数约定,不止javac,jps、jstat这类工具都遵循这个规则。
这里说的java launcher其实就是我们平时执行java命令时背后的启动程序,它的核心职责是:
- 解析传入的JVM参数
- 初始化JVM实例
- 加载目标程序的主类并启动执行
像jps这类工具本身是用Java编写的,当你运行jps时,系统会先启动一个Java launcher,再由这个launcher启动JVM来运行jps的代码。-Joption的作用,就是把option传递给运行jps自身的这个Java launcher,让它调整启动JVM时的参数。
文档里提到“javac调用的java launcher”只是举了个例子,说明-J这个约定在javac里也同样适用,本质上和jps里的用法完全一致。
二、为什么jps -J-Xms48m和直接运行jps效果一致?
这是因为jps是一个极轻量级的工具——它只需要遍历当前系统的JVM进程并输出基础信息,本身占用的内存极小,JVM默认的初始堆内存(-Xms的默认值通常是几十MB甚至更低,取决于系统)已经完全能满足它的运行需求。
你设置的-J-Xms48m其实是生效了的:它确实改变了运行jps的那个JVM的初始堆大小,但因为jps根本用不到这么多内存,所以你看不到输出结果或功能上的任何差异。
举个实际有用的场景:如果是jmap、jstack这类可能需要处理大量数据的JDK工具,当分析超大堆的JVM进程时,工具自身可能需要更大的堆内存,这时候用-J-Xmx2g这类参数就能让工具正常运行,不会因为内存不足抛出OOM异常。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

