# Prozessorlast auswerten



## schnuffie (8. März 2006)

Hallo Experten,

ich habe ein Java-Programm, das "Nebensächlichkeiten" erledigt. Dazu gehören z.B. Packroutinen, Sortierereien, ect.. Das Programm soll neben weiteren auch Nicht-Java-Programmen laufen, die zu unterschiedlichen Zeiten unterschiedliche Prozessorlast erzeugen.

Mein "Nebenbei"-Programm erledigt zeitunkritische Dinge und soll nur laufen, wenn die Prozessorlast unter 40% ist, sonst wieder nach mindestens 5min Lauf pausieren.

Mit Thread.MIN_PRIORITY komme ich nicht weiter, da es nicht nur um Java-Programme geht und je nach CPU dieses Flag ggf. garnicht ausgewertet wird, soweit ich weiß.

Wie kann man unter Java die Prozessorlast auslesen/auswerten?


----------



## MeinerEiner_80 (8. März 2006)

Servus!
Mir ist keine Funktion bekannt, mit der man mittels Java die Prozessorauslastung auslesen kann. Lasse mich da aber gerne eines besseren belehren.
Wie wäre es aber, wenn du die Systemzeit misst, den Thread.sleep() aufrufst und dann erneut die Systemzeit misst? Je nachdem wie die Prozessorauslastung ist, müsste es unterschiedliche Differenzen geben.
Ich hab mal folgenden Code mit und ohne eingeschalteten DVD-Player ablaufen lassen, und man kann schon Auffälligkeiten erkennen. Vielleicht hilft dir das ja weiter, falls niemand ne bessere Idee hat.

*grüssle*
MeinerEiner

```
long differenz =0;
long t1, t2;
for(int i=0; i < 100;i++){
        t1 = System.nanoTime();
        try {
            Thread.sleep(10,0);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        t2 = System.nanoTime();
        differenz = differenz +t2-t1;
}
differenz = differenz/100;
```

PS: Ich hab das ganze in einer Schleife laufen lassen, um eventuelle Unregelmässigkeiten abzufangen.


----------



## Thomas Darimont (8. März 2006)

Hallo!

Aufbauen auf: http://www.codeproject.com/system/cpuusage.asp
kann man sich via JNI ganz flott eine passende dll Zaubern:

```
// cpuutils.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
//

#include "stdafx.h"
#include "de_tutorials_CPUUsageExample.h"
#include "CpuUsage.h"
#include <iostream>

using namespace std;

CCpuUsage usageA;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

  JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved){
    cout << "JNI_OnLoad" << endl;
  	return JNI_VERSION_1_4;
  }
  

/*
 * Class:     de_tutorials_CPUUsageExample
 * Method:    getCPUUsage
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_de_tutorials_CPUUsageExample_getCPUUsage
(JNIEnv *env, jclass clazz){
	return usageA.GetCpuUsage();
}
```


```
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class CPUUsageExample {

    static{
        System.loadLibrary("cpuutils");
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        while(true){
            System.out.println(getCPUUsage());
            Thread.sleep(1000L);
        }
    }
    
    public static native int getCPUUsage();

}
```

Ausgabe:

```
JNI_OnLoad
0
5
6
2
7
7
14
9
4
1
...
```

Die dll muss man dann einfach dorthin legen wo die JVM sie finden kann...
(entweder ein Pfad der in java.libarary.path drinnen steht oder in den normalen PATH) windows\system32 ist in der Regel ein guter Platz...

Gruß Tom


----------



## schnuffie (9. März 2006)

Klingt ja interessant Tom, die Native-Möglichkeit. Habe Deine DLL mal eben in mein JVM-BIN gelegt und probiert. Die DLL wird gefunden, doch leider die Methode nicht. 


```
java.lang.UnsatisfiedLinkError: getCPUUsage
at CPUAuslastung.getCPUUsage(Native Method)
```
 
Woran kann das liegen?

------------------------------------------------------------------------------------------------------------------------------

Hallo MeinerEiner_80,

klingt auch interessant, könnte nur etwas schwierig werden, wann die Systemzeit länger braucht.


----------



## Thomas Darimont (9. März 2006)

Hallo!

Wenn du den Code des Beispiels aufrufst wirds klappen. Bei JNI werden die Namen der Klasse welche die Native Methode enthaelt miteinkompiliert... so kannst du die Native Methode nicht an einer anderen Klasse aufrufen, weil diese in dieser Form nicht in der dll registriert sind.

Gruss Tom


----------



## merklepa (24. Oktober 2011)

Hey,

ich würde gerne eine eigene DLL erstellen.
Mit deiner DLL funktioniert das Programm einwandfrei.

Bei mir kommen immer folgende Fehlermeldungen nach eingabe des Befehls:


Befehl:
g++ -mno-cygwin -I"INCLUDEJAVAPFAD" -I"INCLUDEJAVAWIN32Pfad" -I"PFADINDEMSICHDIEHDATEIBEFINDET" -Wl,-add-stdcall-alias -shared -o cpuutils.dll cpuutils.cpp

Fehlermeldung:

C:\DOKUME~1\benutzer\LOKALE~1\Temp\cc0uRyfq.o:cpuutils.cpp.text+0x4d): undefined
reference to `CCpuUsage::GetCpuUsage()'
C:\DOKUME~1\Benutzer\LOKALE~1\Temp\cc0uRyfq.o:cpuutils.cpp.text+0x77): undefined
reference to `CCpuUsage::~CCpuUsage()'
C:\DOKUME~1\Benutzer\LOKALE~1\Temp\cc0uRyfq.o:cpuutils.cpp.text+0xb2): undefined
reference to `CCpuUsage::CCpuUsage()'
collect2: ld returned 1 exit status

Was mach ich falsch?

Viele Dank schon mal im Voraus


Grüße


----------



## genodeftest (24. Oktober 2011)

nutze doch einfach JNA, damit brauchst du keine eigene DLL mehr erstellen: https://secure.wikimedia.org/wikipedia/en/wiki/Java_Native_Access


----------



## merklepa (24. Oktober 2011)

Naja das ist schon nicht schlecht jedoch würde trotzdem gerne wissen wie es mit jni geht bzw wo der fehler liegt


----------



## neugierig_10100101 (31. Dezember 2016)

hallo allerseits,
Ich wollte nach dem richtigen Befehl fragen, um eine Library über cmd-Eingabeaufforderung zu erstellen. Folgenden geht leider nicht: 
>gcc -I "C:\Program Files\Java\jdk1.8.0_111\include" -I "C:\Program Files\Java\jdk1.8.0_111\include\win32" -c MyClass.c
dann: habe die Objekt-Datei MyClass.o
>gcc -shared -o MyLibrary.dll MyClass MyClass.o
dann: habe die Library Myclass-Library.dll
>java Myclass
dann: bekomme den folgenden Fehler:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\Lebaal\Deskt
op\nativ_jniAPI\Factorial-Library.dll:* Can't load IA 32-bit .dll on a AMD 64-bit
 platform*
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at Factorial.<clinit>(Factorial.java:12)
P.S.: Die JVM die ich installiert habe, ist auch für 64bit BS


----------

