답변:
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, 배터리 및 파일 시스템 정보를 제공합니다.
창문의 경우 나는이 길을 갔다.
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 시간에 대해서는 알려주지 않습니다.
예를 들어 나는 네트워크 집약적 인 Java 프로세스를 가지고 있습니다. 유일하게 실행되고 CPU는 99 %이지만 그중 55 %만이 "프로세서 CPU"로보 고됩니다.
MX bean의 유일한 CPU 관련 항목 임에도 불구하고 쓸데없는 옆에 있으므로 "로드 평균"을 시작하지 마십시오. 가끔 지혜로만 태양이 "getTotalCpuTime"과 같은 것을 노출 시킨다면 ...
심각한 CPU 모니터링을 위해 Matt가 언급 한 SIGAR가 최선의 방법으로 보입니다.
에 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로드를 제공 할 수 있습니다. Tomcat 성능을 관찰하기 위해 Red Hat Linux에서만 이것을 사용했습니다. 이것이 작동하려면 catalina.sh에서 JMX remote를 활성화해야합니다.
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());
//[...]
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()
허용 된 답변에서 제안 된대로 사용 가능한 메모리 양이 제공되지 않음