回答:
Runtimeクラスから限られたメモリ情報を取得できます。それは本当にあなたが探しているものではありませんが、私は完全性のためにそれを提供しようと思っていました。これは小さな例です。編集:java.io.Fileクラスからディスク使用量情報を取得することもできます。ディスク容量の使用には、Java 1.6以降が必要です。
public class Main {
public static void main(String[] args) {
/* Total number of processors or cores available to the JVM */
System.out.println("Available processors (cores): " +
Runtime.getRuntime().availableProcessors());
/* Total amount of free memory available to the JVM */
System.out.println("Free memory (bytes): " +
Runtime.getRuntime().freeMemory());
/* This will return Long.MAX_VALUE if there is no preset limit */
long maxMemory = Runtime.getRuntime().maxMemory();
/* Maximum amount of memory the JVM will attempt to use */
System.out.println("Maximum memory (bytes): " +
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));
/* Total memory currently available to the JVM */
System.out.println("Total memory available to JVM (bytes): " +
Runtime.getRuntime().totalMemory());
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
/* For each filesystem root, print some info */
for (File root : roots) {
System.out.println("File system root: " + root.getAbsolutePath());
System.out.println("Total space (bytes): " + root.getTotalSpace());
System.out.println("Free space (bytes): " + root.getFreeSpace());
System.out.println("Usable space (bytes): " + root.getUsableSpace());
}
}
}
java.lang.managementのパッケージはあなたのランタイムよりもはるかに多くの情報を与えない-例えば、それはあなたのヒープメモリを与える(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
)(非ヒープメモリとは別ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
)。
あなたはまた、(自分のJNIコードを記述することなく)プロセスのCPU使用率を取得することができますが、キャストする必要がありますjava.lang.management.OperatingSystemMXBean
しcom.sun.management.OperatingSystemMXBean
。これはWindowsとLinuxで動作します。他の場所ではテストしていません。
たとえば、より正確な測定値を取得するには、get getCpuUsage()メソッドをより頻繁に呼び出します。
public class PerformanceMonitor {
private int availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
private long lastSystemTime = 0;
private long lastProcessCpuTime = 0;
public synchronized double getCpuUsage()
{
if ( lastSystemTime == 0 )
{
baselineCounters();
return;
}
long systemTime = System.nanoTime();
long processCpuTime = 0;
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );
lastSystemTime = systemTime;
lastProcessCpuTime = processCpuTime;
return cpuUsage / availableProcessors;
}
private void baselineCounters()
{
lastSystemTime = System.nanoTime();
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
}
}
OperatingSystemMXBean
をに置き換え、のcom.sun.management.OperatingSystemMXBean
すべてのインスタンスの前にをgetOperatingSystemMXBean()
付けManagementFactory.
ます。すべてのクラスを適切にインポートする必要があります。
getCpuUsage
システムはそのすべて使用されていることを意味availableProcessorsを 100%?
((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
HypericでSIGAR APIを実装するのが最善の方法だと思います。ほとんどの主要なオペレーティングシステム(ほとんどすべての最新のもの)で動作し、操作が非常に簡単です。開発者は、フォーラムやメーリングリストに非常に敏感です。GPL2 Apacheライセンスであることも好きですます。Javaでの例もたくさんあります!
JNAを使用する(インストールするネイティブライブラリがない)Javaプロジェクトがあり、活発に開発中です。現在、Linux、OSX、Windows、Solaris、FreeBSDをサポートしており、RAM、CPU、バッテリー、ファイルシステムの情報を提供します。
Windowsの場合は、この方法で行った。
com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize = os.getTotalPhysicalMemorySize();
long freePhysicalMemory = os.getFreePhysicalMemorySize();
long freeSwapSize = os.getFreeSwapSpaceSize();
long commitedVirtualMemorySize = os.getCommittedVirtualMemorySize();
ここにあるリンクの詳細とは。
を使用System.getenv()
して、関連する環境変数名をパラメーターとして渡すことにより、システムレベルの情報を取得できます。たとえば、Windowsの場合:
System.getenv("PROCESSOR_IDENTIFIER")
System.getenv("PROCESSOR_ARCHITECTURE")
System.getenv("PROCESSOR_ARCHITEW6432")
System.getenv("NUMBER_OF_PROCESSORS")
他のオペレーティングシステムでは、関連する環境変数の有無と名前が異なります。
mavenを介してOSHI依存関係を追加します。
<dependency>
<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>2.2</version>
</dependency>
バッテリー残量をパーセンテージで取得します。
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
for (PowerSource pSource : hal.getPowerSources()) {
System.out.println(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d));
}
java.lang.managementパッケージで利用可能なAPIをご覧ください。例えば:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
他にもたくさんの便利なものがあります。
CPUの使用率は単純ではありません-com.sun.management.OperatingSystemMXBean.getProcessCpuTimeを介したjava.lang.managementが近づいていますが(上記のPatrickの優れたコードスニペットを参照)、CPUがプロセスで費やした時間にのみアクセスできることに注意してください。他のプロセスに費やされたCPU時間、またはプロセスに関連するシステムアクティビティの実行に費やされたCPU時間については通知しません。
たとえば、ネットワーク集約型のJavaプロセスがあります。これは実行中の唯一のプロセスであり、CPUは99%ですが、その55%だけが「プロセッサCPU」として報告されます。
MX BeanでCPUに関連する唯一のアイテムであるにもかかわらず、「負荷平均」は役に立たないので、私を始めないでください。ときどき知恵の太陽だけが "getTotalCpuTime"のようなものを公開した場合...
深刻なCPU監視には、SIGARがMattによって言及されたのが最善の策のようです。
でWindows
、あなたが実行できるsysteminfo
コマンドを、次のコードでインスタンスの出力を取得します。
private static class WindowsSystemInformation
{
static String get() throws IOException
{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("systeminfo");
BufferedReader systemInformationReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = systemInformationReader.readLine()) != null)
{
stringBuilder.append(line);
stringBuilder.append(System.lineSeparator());
}
return stringBuilder.toString().trim();
}
}
Jrockit VMを使用している場合、VMのCPU使用率を取得する別の方法を次に示します。ランタイムBeanは、プロセッサーごとのCPU負荷も提供します。私はこれをRed Hat Linuxでのみ使用して、Tomcatのパフォーマンスを監視しました。これを機能させるには、catalina.shでJMXリモートを有効にする必要があります。
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://my.tomcat.host:8080/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName name = new ObjectName("oracle.jrockit.management:type=Runtime");
Double jvmCpuLoad =(Double)conn.getAttribute(name, "VMGeneratedCPULoad");
まだ開発中ですが、jHardwareはすでに使用できます
Javaを使用してシステムデータをスクラップする単純なライブラリです。LinuxとWindowsの両方で動作します。
ProcessorInfo info = HardwareInfo.getProcessorInfo();
//Get named info
System.out.println("Cache size: " + info.getCacheSize());
System.out.println("Family: " + info.getFamily());
System.out.println("Speed (Mhz): " + info.getMhz());
//[...]
OSレベルの情報を取得するために使用できる簡単な方法の1つで、Macでテストしたところ、うまく機能しました。
OperatingSystemMXBean osBean =
(OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
return osBean.getProcessCpuLoad();
こんにちは、java / com統合でこれを実行できます。WMI機能にアクセスすることで、すべての情報を取得できます。
Javaコード内で1分、5分、15分のシステム負荷平均を取得するには、次のようにcat /proc/loadavg
使用して解釈するコマンドを実行します。
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("cat /proc/loadavg").getInputStream()));
String avgLine = br.readLine();
System.out.println(avgLine);
List<String> avgLineList = Arrays.asList(avgLine.split("\\s+"));
System.out.println(avgLineList);
System.out.println("Average load 1 minute : " + avgLineList.get(0));
System.out.println("Average load 5 minutes : " + avgLineList.get(1));
System.out.println("Average load 15 minutes : " + avgLineList.get(2));
そして、コマンドを実行し、それを以下のように解釈して、物理システムメモリを取得free -m
します。
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("free -m").getInputStream()));
String line;
String memLine = "";
int index = 0;
while ((line = br.readLine()) != null) {
if (index == 1) {
memLine = line;
}
index++;
}
// total used free shared buff/cache available
// Mem: 15933 3153 9683 310 3097 12148
// Swap: 3814 0 3814
List<String> memInfoList = Arrays.asList(memLine.split("\\s+"));
int totalSystemMemory = Integer.parseInt(memInfoList.get(1));
int totalSystemUsedMemory = Integer.parseInt(memInfoList.get(2));
int totalSystemFreeMemory = Integer.parseInt(memInfoList.get(3));
System.out.println("Total system memory in mb: " + totalSystemMemory);
System.out.println("Total system used memory in mb: " + totalSystemUsedMemory);
System.out.println("Total system free memory in mb: " + totalSystemFreeMemory);
Runtime.getRuntime().freeMemory()
受け入れ答えで提案されているようにあなたの空きメモリの量を与えられたものではありません。