【发布时间】:2020-02-20 03:59:57
【问题描述】:
我的 JDK 版本是 OpenJDK 11。 我的班级文件是 jmx.Main.class
这是我的代码。
package jmx;
import java.lang.management.ManagementFactory;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
public class Main {
public static void main(String[] args) throws InstanceNotFoundException, AttributeNotFoundException, MalformedObjectNameException, ReflectionException, MBeanException {
/* Total number of processors or cores available to the JVM */
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize");
Object attribute2 = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "FreePhysicalMemorySize");
System.out.println("Total memory: "+ Long.parseLong(attribute.toString()) / 1024 +"MB");
System.out.println("Free memory: "+ Long.parseLong(attribute2.toString()) / 1024 +"MB");
}
}
它在 IDE 中运行时运行良好。我想使用自定义 jre。然后我使用jdeps 来分析依赖关系。结果是:
Main.class -> java.base
Main.class -> java.management
jmx -> java.io java.base
jmx -> java.lang java.base
jmx -> java.lang.invoke java.base
jmx -> java.lang.management java.management
jmx -> javax.management java.management
所以我认为java.base 和java.management 是依赖模块。
然后我使用jlink 来生成我的自定义jre。
jlink --module-path "C:\Program Files\Java\jdk-11.0.6\jmods" --add-modules java.base,java.management --output jre11
在使用我的自定义 jre 之前,我已经在 cmd 窗口中运行了我的代码。它工作正常。
然后我在我的 jre 中运行代码。代码无法运行,报错:
javax.management.AttributeNotFoundException: No such attribute: TotalPhysicalMemorySize
所以我认为原因是缺少一些依赖模块。我运行jlink 来生成整个模块 jre。当我使用整个模块 jre 时,代码又可以正常运行了。
如何获得真正的依赖模块?还是JDK的bug?
【问题讨论】:
-
如果我问了一个愚蠢的问题,请原谅我,但是您的 JAR 文件是否包含
module-info.class?换句话说,您的 JAR 是模块化的吗?我猜你想通过在 Windows 文件资源管理器中双击文件来运行它,对吗? -
这是一个单一的类,而不是一个jar文件。我在cmd窗口中运行它。我的项目不包含模块信息。项目中不需要有模块信息文件。这是automatic module。
-
您正在使用反射操作来查询属性
"TotalPhysicalMemorySize"。像jdeps这样的静态代码分析无法检测到动态访问。您必须添加模块jdk.management。
标签: java java-11 java-platform-module-system jlink jdeps