私の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のバグですか?
JDK 9の前に、種類はcom.sun.management.OperatingSystemMXBean
の文書化されていない拡張しましたjava.lang.management.OperatingSystemMXBean
。だから、同じように反射属性クエリを使用するのが妥当だったgetAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize")
非標準APIへの依存関係を作成しないし。
長所も欠点です。何の依存関係が存在しない場合には、依存関係を分析するためのツールは、依存関係を検出することはできません。
あなたはモジュールを追加するとjdk.management
、拡張子が利用できるようになります。文書化されたモジュールの一部であることはまた、あなたがモジュールに恒久的な依存関係を受け入れることを望んでいるとき、あなたは拡張に使用できることを意味しOperatingSystemMXBean
、直接。
import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;
public class OSMX {
public static void main(String[] args) {
OperatingSystemMXBean osBean
= ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
System.out.println("Total memory: "
+ osBean.getTotalPhysicalMemorySize() / (1024*1024) +"MB");
System.out.println("Free memory: "
+ osBean.getFreePhysicalMemorySize() / (1024*1024) +"MB");
}
}
その後、jdeps
に依存関係を報告しますjdk.management
正しく。