2

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

4

1 に答える 1