Как получить CPU, RAM и сеть-использование приложения Java7
Я нашел эту старую статью how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java и wated спросить, есть ли что-то новое в java 7. Я хочу периодически получать текущие CPU-, RAM - и netzwork-использование моего приложения. Он должен работать для linux (mac) и windows. Данные не должны быть очень подробными, достаточно 3 значений (cpu: 10%, Ram 4%, Network 40%). Было бы здорово, если бы данные были только для приложения, а не для всей ОС-системы, однако это будет работать, тоже.
Спасибо за помощь
4 ответов
отвечая на мой собственный вопрос ;P некоторые код, который я написал...
NetworkData:
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);
}
}
CPU-Data:
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-Data:
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-Data:
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();
}
}
почему вы не можете просто использовать, как bellow,
try {
for (String ni : sigar.getNetInterfaceList()) {
NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni);
total+=netStat.getRxBytes();
}
} catch (SigarException e) {
e.printStackTrace();
}
что такое разница???
Я бы использовал библиотеку Java Metrics:http://metrics.codahale.com/
Он поставляется с интеграцией Sigar:https://github.com/cb372/metrics-sigar
с тех пор мало что изменилось, если только это не было сделано другой группой. ниже приведены некоторые из существенных изменений, которые были включены в Java 7 SE. К сожалению, ни один из них не то, что вы ищете.
http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
javamelody я использовал, прежде чем это довольно просто, и я смог заставить его работать в небольшом количестве время
https://code.google.com/p/javamelody/
http://demo.javamelody.cloudbees.net/monitoring
ниже приведена еще одна альтернатива https://github.com/oshi/oshi