一:目的

写这一段程序的原因是需要监控部署的的应用是否正常运行,并且显示其运行状态。在进程莫名死掉后甚至可以自动启动该应用。

首先这段代码可以获取的信息如下

/**
* 当前进程运行的主机名
*/
private String host;
/**
* 当前进程所在的IP地址
*/
private String ipAddress;
/**
* 空闲内存
*/
private long freeMemory;
/**
* 内存总量
*/
private long totalMemory;
/**
* java虚拟机允许开启的最大的内存
*/
private long maxMemory; /**
* 操作系统名称
*/
private String osName;
/**
* 进程号
*/
private long pid; /**
* 程序启动时间
*/
private Date startTime; /**
* 类所在路径
*/
private String classPath; private String projectPath; /**
* 程序运行时间,单位毫秒
*/
private long runtime;
/**
* 线程总量
*/
private int threadCount;

二:获取这段信息的代码

这里直接贴代码,并没有什么很难的逻辑

import java.io.File;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.framework.monitor.common.bean.ClientStatus; public class StatusUtil {
public static Logger LOG = LoggerFactory.getLogger(StatusUtil.class);
private static ClientStatus clientStatus = new ClientStatus(); /**
*
* @param projectName 工程名称
* @param version 版本号
* @param group 分组号,对应用进行分组
* @param ipAddress 可以为NULL,为NULL则会自动获取,但是如果主机有多个网卡,可能会取错
* @param startCMD 启动进程的命令,当应用死掉后,会调用此命令来启动
* @param remark 备注,如果没有可以为空
* @return
*/
public static ClientStatus getClientStatus(String projectName,int version,String group,String ipAddress,String startCMD,String[] remark){
clientStatus.setProjectName(projectName);
clientStatus.setVersion(version);
clientStatus.setRemark(remark);
clientStatus.setGroup(group);
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
Runtime runtime = Runtime.getRuntime();
//空闲内存
long freeMemory = runtime.freeMemory();
clientStatus.setFreeMemory(byteToM(freeMemory));
//内存总量
long totalMemory = runtime.totalMemory();
clientStatus.setTotalMemory(byteToM(totalMemory));
//最大允许使用的内存
long maxMemory = runtime.maxMemory();
clientStatus.setMaxMemory(byteToM(maxMemory));
//操作系统
clientStatus.setOsName(System.getProperty("os.name"));
InetAddress localHost;
try {
localHost = InetAddress.getLocalHost();
String hostName = localHost.getHostName();
clientStatus.setHost(hostName);
if(ipAddress == null){
ipAddress = localHost.getHostAddress();
}
} catch (UnknownHostException e) {
e.printStackTrace();
LOG.error("无法获取当前主机的主机名与Ip地址");
clientStatus.setHost("未知");
}
//ip
clientStatus.setIpAddress(ipAddress);
clientStatus.setId(makeClientId(projectName,ipAddress));
//程序启动时间
long startTime = runtimeMXBean.getStartTime();
Date startDate = new Date(startTime);
clientStatus.setStartTime(startDate);
//类所在路径
clientStatus.setClassPath(runtimeMXBean.getBootClassPath());
//程序运行时间
clientStatus.setRuntime(runtimeMXBean.getUptime());
//线程总数
clientStatus.setThreadCount(ManagementFactory.getThreadMXBean().getThreadCount());
clientStatus.setProjectPath(new File("").getAbsolutePath());
clientStatus.setCommitDate(new Date());
clientStatus.setPid(getPid());
return clientStatus;
} /**
* 把byte转换成M
* @param bytes
* @return
*/
public static long byteToM(long bytes){
long kb = (bytes / 1024 / 1024);
return kb;
} /**
* 创建一个客户端ID
* @param projectName
* @param ipAddress
* @return
*/
public static String makeClientId(String projectName,String ipAddress){
String t = projectName + ipAddress + new File("").getAbsolutePath();
int client_id = t.hashCode();
client_id = Math.abs(client_id);
return String.valueOf(client_id);
} /**
* 获取进程号,适用于windows与linux
* @return
*/
public static long getPid(){
try {
String name = ManagementFactory.getRuntimeMXBean().getName();
String pid = name.split("@")[0];
return Long.parseLong(pid);
} catch (NumberFormatException e) {
LOG.warn("无法获取进程Id");
return 0;
}
} }

java获取当前应用的运行信息(内存,线程,运行时间,状态等)的更多相关文章

  1. 使用java获取手机号归属地等信息httpClient实现

    java获取手机号归属地 一般想获取手机号归属地等信息个人是无法获取的,但是可以通过调用第三方接口获取,具体百度搜索很多这里例子提供一个淘宝的接口 ,该功能已经发布到网站作为一个在线小工具,拿走不谢: ...

  2. java中如何使正在运行中的线程退出

    终止线程的三种方法      有三种方法可以使终止线程.      1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止.      2.  使用stop方法强行终止线程(这个方法不 ...

  3. JAVA优化篇 如何找到运行缓慢的线程

    引入 JAVA提供了一些分析DUMP的工具,比如jmap,visualvm 等 JAVA还有寻找线程状态的工具,jstack等 数据库也有检查连接数,连接状态的命令,status,processlis ...

  4. Javascript和Java获取各种form表单信息的简单实例

    大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于che ...

  5. java 获取服务器 linux 服务器IP 信息

    public String getUnixLocalIp() { String ip = ""; try { Enumeration<?> e1 = (Enumerat ...

  6. Java多线程和并发(五),线程的状态

    目录 1.线程的六个状态 2.sleep和wait的区别 3.锁池(EntryList)和等待池(WaitSet) 4.notify和notifyall的区别 五.线程的状态 1.线程的六个状态 2. ...

  7. Java中的CPU占用高和内存占用高的问题排查

    下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...

  8. Thread线程源码解析,Java线程的状态,线程之间的通信

    线程的基本概念 什么是线程 现代操作系统在运行一个程序的时候,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.线代操作系统调度的最小单位是线程.也叫做轻量级进程.在一 ...

  9. Java并发编程的艺术(五)——线程和线程的状态

    线程 什么是线程 操作系统调度的最小单元就是线程,也叫轻量级进程. 为什么要使用多线程 多线程程序能够更有效率地利用多处理器核心. 用户响应时间更快. 方便程序员将程序模型映射到Java提供的多线程编 ...

随机推荐

  1. 一步步搭建最简单oauth2.0认证和授权

    oauth2.0 最早接触这个概念是在做微信订阅号开发.当时还被深深的绕进去,关于oauth2.0的解释网上有好多,而且都讲解的比较详细,下面给大家价格参考资料. http://owin.org/ h ...

  2. HTML5能否会成为Web技术的核心?

    谁会成为HTML5后继者? 那么会有一个HTML6吗? Jaffe表示,网上支付可能会推动进行这样的全面修订,以期能为网上支付来提供一个统一方式.如果大家将之称为HTML 6,那么HTML 6是极有可 ...

  3. Regasm

      程序集注册工具(Regasm.exe) 读取程序集中的元数据,并将所需的项添加到注册表中.注册表允许COM 客户程序以透明方式创建.NET Framework类.类一经注册,任何COM 客户程序都 ...

  4. 简单了解enum

    enum的性质: 1.枚举类型的实例都是常量 2.要使用enum,需要创建一个该类型的引用,并将其赋值给某个实例 3.常用的方法:  *     toString():某个enum实例的名字  *   ...

  5. 企业级自动化运维工具应用实战-ansible

    背景 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运 ...

  6. Spring之bean一基础

    在前面得博客依赖注入与控制反转中演示了应用spring实现ioc,在ApplicationContext.xml中有bean的配置,里面只是bean简单的应用.这篇主要是进一步学习使用bean. 一. ...

  7. Tosska SQL Tuning Expert 工具优化SQL语句

    对于SQL开发人员和DBA来说,根据业务需求写出一条正确的SQL很容易.但是SQL的执行性能怎么样呢?能优化一下跑得更快吗?如果不是资深的DBA,估计很多人都没有信心. 幸运的是,自动化优化工具可以帮 ...

  8. 通过YUM升级centOS内核,以便安装docker

    安装Docker要满足一定的条件,对于cents系统,要求必须是64位,并且内核版本是3.10以上. 如果你的centos操作系统内核低于3.10,需要升级到这个版本以上,才能安装docker. 第一 ...

  9. Linux上跑两个版本的php,5.4.45和5.3.24

    首先,装的实在艰难,所以容我吐槽两句: PHP好个P,两个小版本都不兼容,把这个php5.3.24放在5.4.45环境下都跑不了.对于我这种用多了向下兼容的java的人来说,简直无法想象! 网上有装俩 ...

  10. Backtrack无线攻防(很任性的一篇)

    首先你得有一个backtrack操作系统 然后还得花钱买一个无线网卡,最好是Intel的,还有要是USB接口的,可能是因为其他接口我不会接.