Cómo obtener CPU, RAM y uso de red de una aplicación Java7

Encontré este artículo anterior. cómo-monitorear-la-computadora-memoria-cpu-y-uso-del-disco-en-java y quería preguntar si hay algo nuevo en Java 7. Quiero obtener periódicamente el uso actual de CPU, RAM y red de mi aplicación. Tiene que funcionar para linux (mac) y windows. Los datos no deben ser demasiado detallados, 3 valores serían suficientes (cpu: 10%, Ram 4%, Red 40%). Sería genial si los datos son solo para la aplicación y no para todo el sistema operativo, sin embargo, esto también funcionaría.

Gracias por la ayuda

preguntado el 12 de junio de 12 a las 16:06

4 Respuestas

respondiendo mi propia pregunta; P algún código que he escrito ...

Datos de red:

public class NetworkData {

    static Map<String, Long> rxCurrentMap = new HashMap<String, Long>();
    static Map<String, List<Long>> rxChangeMap = new HashMap<String, List<Long>>();
    static Map<String, Long> txCurrentMap = new HashMap<String, Long>();
    static Map<String, List<Long>> txChangeMap = new HashMap<String, List<Long>>();
    private static Sigar sigar;

    /**
     * @throws InterruptedException
     * @throws SigarException
     * 
     */
    public NetworkData(Sigar s) throws SigarException, InterruptedException {
        sigar = s;
        getMetric();
        System.out.println(networkInfo());
        Thread.sleep(1000);     
    }

    public static void main(String[] args) throws SigarException,
            InterruptedException {
        new NetworkData(new Sigar());
        NetworkData.startMetricTest();
    }

    public static String networkInfo() throws SigarException {
        String info = sigar.getNetInfo().toString();
        info += "\n"+ sigar.getNetInterfaceConfig().toString();
        return info;
    }

    public static String getDefaultGateway() throws SigarException {
        return sigar.getNetInfo().getDefaultGateway();
    }

    public static void startMetricTest() throws SigarException, InterruptedException {
        while (true) {
            Long[] m = getMetric();
            long totalrx = m[0];
            long totaltx = m[1];
            System.out.print("totalrx(download): ");
            System.out.println("\t" + Sigar.formatSize(totalrx));
            System.out.print("totaltx(upload): ");
            System.out.println("\t" + Sigar.formatSize(totaltx));
            System.out.println("-----------------------------------");
            Thread.sleep(1000);
        }

    }

    public static Long[] getMetric() throws SigarException {
        for (String ni : sigar.getNetInterfaceList()) {
            // System.out.println(ni);
            NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni);
            NetInterfaceConfig ifConfig = sigar.getNetInterfaceConfig(ni);
            String hwaddr = null;
            if (!NetFlags.NULL_HWADDR.equals(ifConfig.getHwaddr())) {
                hwaddr = ifConfig.getHwaddr();
            }
            if (hwaddr != null) {
                long rxCurrenttmp = netStat.getRxBytes();
                saveChange(rxCurrentMap, rxChangeMap, hwaddr, rxCurrenttmp, ni);
                long txCurrenttmp = netStat.getTxBytes();
                saveChange(txCurrentMap, txChangeMap, hwaddr, txCurrenttmp, ni);
            }
        }
        long totalrxDown = getMetricData(rxChangeMap);
        long totaltxUp = getMetricData(txChangeMap);
        for (List<Long> l : rxChangeMap.values())
            l.clear();
        for (List<Long> l : txChangeMap.values())
            l.clear();
        return new Long[] { totalrxDown, totaltxUp };
    }

    private static long getMetricData(Map<String, List<Long>> rxChangeMap) {
        long total = 0;
        for (Entry<String, List<Long>> entry : rxChangeMap.entrySet()) {
            int average = 0;
            for (Long l : entry.getValue()) {
                average += l;
            }
            total += average / entry.getValue().size();
        }
        return total;
    }

    private static void saveChange(Map<String, Long> currentMap,
            Map<String, List<Long>> changeMap, String hwaddr, long current,
            String ni) {
        Long oldCurrent = currentMap.get(ni);
        if (oldCurrent != null) {
            List<Long> list = changeMap.get(hwaddr);
            if (list == null) {
                list = new LinkedList<Long>();
                changeMap.put(hwaddr, list);
            }
            list.add((current - oldCurrent));
        }
        currentMap.put(ni, current);
    }

}

Datos de la CPU:

public class CpuData {
    private static Sigar sigar;

    public CpuData(Sigar s) throws SigarException {
        sigar = s;
        System.out.println(cpuInfo());
    }

    public static void main(String[] args) throws InterruptedException, SigarException {
        new CpuData(new Sigar());
        CpuData.startMetricTest();
    }

    private static void startMetricTest() throws InterruptedException, SigarException {
        new Thread() {
            public void run() {
                while(true) 
                BigInteger.probablePrime(MAX_PRIORITY, new Random());
            };
        }.start();
        while(true) {
            String pid = ""+sigar.getPid();
            System.out.print(getMetric(pid));
            for(Double d:getMetric()){
                System.out.print("\t"+d);
            }
            System.out.println();
            Thread.sleep(1000);
        }       
    }

    public String cpuInfo() throws SigarException {
        CpuInfo[] infos = sigar.getCpuInfoList();
        CpuInfo info = infos[0];

        String infoString = info.toString();
        if ((info.getTotalCores() != info.getTotalSockets())
                || (info.getCoresPerSocket() > info.getTotalCores())) {
            infoString+=" Physical CPUs: " + info.getTotalSockets();
            infoString+=" Cores per CPU: " + info.getCoresPerSocket();
        }

        long cacheSize = info.getCacheSize();
        if (cacheSize != Sigar.FIELD_NOTIMPL) {
            infoString+="Cache size...." + cacheSize;
        }
        return infoString;
    }

    public static Double[] getMetric() throws SigarException {
        CpuPerc cpu = sigar.getCpuPerc();
        double system = cpu.getSys();
        double user = cpu.getUser();
        double idle = cpu.getIdle();
//      System.out.println("idle: " +CpuPerc.format(idle) +", system: "+CpuPerc.format(system)+ ", user: "+CpuPerc.format(user));
        return new Double[] {system, user, idle};
    }

    public static double getMetric(String pid) throws SigarException {
        ProcCpu cpu = sigar.getProcCpu(pid);
//      System.out.println(sigar.getProcFd(pid));
//      System.err.println(cpu.toString());
        return cpu.getPercent();
    }

}

RAM-Datos:

public class RamData {

    private static Sigar sigar;
    private static Map<String, Long> pageFoults;

    public RamData(Sigar s) throws SigarException {
        sigar = s;
        System.out.println(getMetric().toString());
    }

    public static void main(String[] args) throws SigarException,
            InterruptedException {
        new RamData(new Sigar());
        RamData.startMetricTest();
    }

    public static void startMetricTest() throws SigarException,
            InterruptedException {
        while (true) {
            Map<String, String> map = RamData.getMetric("" + sigar.getPid());
            System.out.println("Resident: \t\t"
                    + Sigar.formatSize(Long.valueOf(map.get("Resident"))));
            System.out.println("PageFaults: \t\t" + map.get("PageFaults"));
            System.out.println("PageFaultsTotal:\t" + map.get("PageFaultsTotal"));
            System.out.println("Size:    \t\t"
                    + Sigar.formatSize(Long.valueOf(map.get("Size"))));
            Map<String, String> map2 = getMetric();
            for (Entry<String, String> e : map2.entrySet()) {
                String s;
                try {
                    s = Sigar.formatSize(Long.valueOf(e.getValue()));
                } catch (NumberFormatException ex) {
                    s = ((int) (double) Double.valueOf(e.getValue())) + "%";
                }
                System.out.print("  " + e.getKey() + ": " + s);
            }
            System.out.println("\n------------------");
            Thread.sleep(1000);
        }
    }

    public static Map<String, String> getMetric() throws SigarException {
        Mem mem = sigar.getMem();
        return (Map<String, String>) mem.toMap();
    }

    public static Map<String, String> getMetric(String pid)
            throws SigarException {
        if (pageFoults == null)
            pageFoults = new HashMap<String, Long>();
        ProcMem state = sigar.getProcMem(pid);
        Map<String, String> map = new TreeMap<String, String>(state.toMap());
        if (!pageFoults.containsKey(pid))
            pageFoults.put(pid, state.getPageFaults());
        map.put("PageFaults", ""
                + (state.getPageFaults() - pageFoults.get(pid)));
        map.put("PageFaultsTotal", ""+state.getPageFaults());
        return map;
    }
}

PROCES-Datos:

public class ProcessData {

    private static Sigar sigar;

    public ProcessData(Sigar s) throws SigarException {
        this.sigar = s;
        System.out.println(getMetric().toString());
        System.out.println(getMetric(getPidString()).toString());
    }

    public static void main(String[] args) throws SigarException {
        new ProcessData(new Sigar());
        System.out.println(ProcessData.getMetric());
        System.out.println(ProcessData.getMetric(getPidString()));
    }

    public static Map<String, String> getMetric() throws SigarException {
        ProcStat state = sigar.getProcStat();
        return (Map<String, String>) state.toMap();
    }

    public static Map<String, String> getMetric(String pid) throws SigarException {
        ProcState state = sigar.getProcState(pid);
        return (Map<String, String>) state.toMap();
    }

    public static long getPid() {
        return sigar.getPid();
    }

    public static String getPidString() {
        return ""+sigar.getPid();
    }

}

Respondido el 15 de junio de 12 a las 23:06

Hola, estoy tratando de obtener RamDATA usando su código. Explique amablemente la diferencia entre el residente y el tamaño de la memoria: nauman khalid

¿Por qué no puedes simplemente usar como abajo,

  try {
      for (String ni : sigar.getNetInterfaceList()) {         
        NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni);   
        total+=netStat.getRxBytes();        
      }
    } catch (SigarException e) {
      e.printStackTrace();
    }

¿cuál es la diferencias?

Respondido 29 Oct 13, 04:10

fue hace mucho tiempo, pero creo que fue debido a la comunicación interna... solo quería saber qué entra y sale de la máquina... eso significa solo comunicación a través de interfaces de hardware reales... solo pruébalo, verá lo que quiero decir... sin embargo, estoy interesado en sus mejoras - crece la cabeza

Ejecuté el código que escribiste y comparé el resultado con DUMeter. Pero los resultados son diferentes. - Ravindu

luego publique un código mejor :) el código simple no fue la solución para mí ... probablemente el código sigar cambió - crece la cabeza

Yo usaría la biblioteca java Metrics: http://metrics.codahale.com/

Viene con la integración de Sigar: https://github.com/cb372/metrics-sigar

respondido 21 mar '14, 15:03

No ha cambiado mucho desde entonces a menos que lo haya hecho otro grupo. a continuación se muestran algunos de los cambios significativos que se incluyeron en Java 7 SE. Lamentablemente, ninguno de ellos es lo que estás buscando.

http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html

javamelody que he usado antes es bastante simple y pude hacerlo funcionar en poco tiempo https://code.google.com/p/javamelody/
http://demo.javamelody.cloudbees.net/monitoring

abajo hay otra alternativa https://github.com/oshi/oshi

OSHI NO LE DARÁ EL USO DE LA RED NI LA ​​LATENCIA POR PROCESO
Mira esto :
Java (Windows): por ID de proceso, obtener uso de memoria, uso de disco, uso de red

Respondido el 28 de Septiembre de 20 a las 19:09

gracias por el enlace :) sin embargo, ¡uso y necesito los cambios de java7! - crece la cabeza

esos son los cambios que se hicieron de Java 6 a Java 7. No estoy seguro de entender lo que estás buscando. - Frank Visaggio

sí, la publicación es de 2011, solo preguntaba si hay algo nuevo... eso significa que la mejor solución en esta publicación fue "SIGAR API" - crece la cabeza

Gracias @Bob Sinclar, ¡estoy usando sigar! es realmente genial y fácil de codificar... soy nuevo en el foro. probablemente mis preguntas también sean difíciles de responder. - crece la cabeza

Sigar parece tener problemas para trabajar en máquinas de 64 bits: stackoverflow.com/questions/23405832/… - Alvaro

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.