J'ai besoin de vérifier l'utilisation du CPU et de la mémoire pour le serveur en java, quelqu'un sait comment faire ?
Donc, si je fonctionne dans Eclipse, cela dépendra de mes paramètres Eclipse ?
J'ai besoin de vérifier l'utilisation du CPU et de la mémoire pour le serveur en java, quelqu'un sait comment faire ?
Si vous recherchez spécifiquement la mémoire dans la JVM :
Runtime runtime = Runtime.getRuntime();
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("free memory: " + format.format(freeMemory / 1024) + "<br/>");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "<br/>");
sb.append("max memory: " + format.format(maxMemory / 1024) + "<br/>");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "<br/>");
Toutefois, il ne s'agit que d'une estimation...
Notez que ce n'est pas la mémoire réellement utilisée - c'est la 'mémoire allouée' qui signifie le tas que java a alloué, donc si vous avez -Xms90g et que votre application est très légère, vous aurez toujours allocatedMemory comme quelque chose de plus grand que 90g. Voir la réponse de la personne supprimée "unknown (yahoo)" ci-dessous (qui peut être différente à première vue)
import java.io.File;
import java.text.NumberFormat;
public class SystemInfo {
private Runtime runtime = Runtime.getRuntime();
public String info() {
StringBuilder sb = new StringBuilder();
sb.append(this.osInfo());
sb.append(this.memInfo());
sb.append(this.diskInfo());
return sb.toString();
}
public String osName() {
return System.getProperty("os.name");
}
public String osVersion() {
return System.getProperty("os.version");
}
public String osArch() {
return System.getProperty("os.arch");
}
public long totalMem() {
return Runtime.getRuntime().totalMemory();
}
public long usedMem() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
public String memInfo() {
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("Free memory: ");
sb.append(format.format(freeMemory / 1024));
sb.append("<br/>");
sb.append("Allocated memory: ");
sb.append(format.format(allocatedMemory / 1024));
sb.append("<br/>");
sb.append("Max memory: ");
sb.append(format.format(maxMemory / 1024));
sb.append("<br/>");
sb.append("Total free memory: ");
sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
sb.append("<br/>");
return sb.toString();
}
public String osInfo() {
StringBuilder sb = new StringBuilder();
sb.append("OS: ");
sb.append(this.osName());
sb.append("<br/>");
sb.append("Version: ");
sb.append(this.osVersion());
sb.append("<br/>");
sb.append(": ");
sb.append(this.osArch());
sb.append("<br/>");
sb.append("Available processors (cores): ");
sb.append(runtime.availableProcessors());
sb.append("<br/>");
return sb.toString();
}
public String diskInfo() {
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
StringBuilder sb = new StringBuilder();
/* For each filesystem root, print some info */
for (File root : roots) {
sb.append("File system root: ");
sb.append(root.getAbsolutePath());
sb.append("<br/>");
sb.append("Total space (bytes): ");
sb.append(root.getTotalSpace());
sb.append("<br/>");
sb.append("Free space (bytes): ");
sb.append(root.getFreeSpace());
sb.append("<br/>");
sb.append("Usable space (bytes): ");
sb.append(root.getUsableSpace());
sb.append("<br/>");
}
return sb.toString();
}
}
Si j'ai bien compris, le sujet de départ concernait la quantité de mémoire disponible dans le système d'exploitation. freeMemory
ici renvoie la quantité de mémoire disponible dans la JVM, ce qui est très différent.
Cette question a de bonnes informations que vous devriez trouver utiles.
De ici
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
long prevUpTime = runtimeMXBean.getUptime();
long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
double cpuUsage;
try
{
Thread.sleep(500);
}
catch (Exception ignored) { }
operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long upTime = runtimeMXBean.getUptime();
long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
long elapsedCpu = processCpuTime - prevProcessCpuTime;
long elapsedTime = upTime - prevUpTime;
cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
System.out.println("Java CPU: " + cpuUsage);
List<MemoryPoolMXBean> memoryPools = new ArrayList<MemoryPoolMXBean>(ManagementFactory.getMemoryPoolMXBeans()) ; long usedHeapMemoryAfterLastGC = 0 ; for (MemoryPoolMXBean memoryPool : memoryPools) { if (memoryPool.getType().equals(MemoryType.HEAP)) { MemoryUsage poolCollectionMemoryUsage = memoryPool.getCollectionUsage() ; usedHeapMemoryAfterLastGC += poolCollectionMemoryUsage.getUsed() ; } }
Quelle est la différence entre faire cela et faire simplement operatingSystemMXBean.getProcessCpuLoad();
? Selon la documentation d'Oracle, cette méthode renvoie "Renvoie la "récente utilisation du cpu" pour le processus de la machine virtuelle Java". Pourtant, je vois une différence de nombre relativement importante entre votre méthode et cette méthode.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Ces liens vous seront peut-être utiles : javaworld.com/javaworld/javaqa/2002-11/01-qa-1108-cpu.html roseindia.net/javatutorials/
1 votes
Duplication possible de Utilisation de Java pour obtenir des informations sur le système d'exploitation