一:目的

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

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

/**
* 当前进程运行的主机名
*/
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. 以太坊客户端Geth命令用法-参数详解

    Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...

  2. Nuxt框架实践

    前言 今天抽空过了遍nuxt文档,写了个实践demo,关于nuxt我已经断断续续看了好几遍了,自我感觉也算是入门了吧,从开发到上线心里都有底.后期打算在项目用起来的是nuxt框架,一些函数工具库,比如 ...

  3. ExceptionLess 本地部署小结

    ExceptionLess 是一个免费开源分布式系统日志收集框架,地址:https://github.com/exceptionless/Exceptionless 运行环境: .NET 4.6.1 ...

  4. APP加固技术历程及未来级别方案:虚机源码保护

    传统App加固技术,前后经历了四代技术变更,保护级别每一代都有所提升,但其固有的安全缺陷和兼容性问题始终未能得到解决.而下一代加固技术-虚机源码保护,适用代码类型更广泛,App保护级别更高,兼容性更强 ...

  5. udp和tcp

    tcp(Transmission Control Protocol 传输控制协议) 协议复杂,有序和可靠.编号和分段实现了有序,ACK(acknowledge)和重新发送实现了可靠. 滑窗实现了同时发 ...

  6. 3255:十进制到六进制-poj

    3255:十进制到六进制 总时间限制:  1000ms 内存限制:  65536kB 描述 进制转换: 将十进制(不超过int类型表示的范围)的数转换为六进制的数. 输入 输入为第一行是组数n,后面n ...

  7. java 之 抽象工厂模式(大话设计模式)

    看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套. 来看下类图: 大话设计模式-类图 看类图已经很乱 ...

  8. 基于 HTML5 Canvas 的 3D 模型列表贴图

    少量图片对于我们赋值是没有什么难度,但是如果图片的量大的话,我们肯定希望能很直接地显示在界面上供我们使用,再就是排放的位置等等,这些都需要比较直观的操作,在实际应用中会让我们省很多力以及时间.下面这个 ...

  9. 配置KindEditor富文本编辑器

    第一步:首先我们要到KindEditor官网下载资源包-点击进入官网下载KindEditor资源包 第二部:在下载完了KindEditor的资源包后解压结构如下图所示: 里面包括集中语言的文件上传后台 ...

  10. Java学习之计算机基础(二)

    今天主要介绍原码.反码与补码的知识.了解原码.反码与补码的知识,可以帮助我们更好地理解在计算机内部是如何进行运算的,同时对于后面更好地学习和理解Java基本数据类型及其范围打下基础. 背景知识: 在计 ...