私の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のバグですか?