一:目的

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

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

/**
* 当前进程运行的主机名
*/
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. 机器学习(二)-kNN手写数字识别

    一.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 1,距离可以是欧式距离,夹角余弦距离等等. 2,k值不能选择太大 ...

  2. JAVA 中LinkedHashMap要点记录

    JAVA 中LinkedHashMap要点记录 构造函数中可能出现的几个参数说明如下: 1.initialCapacity 初始容量大小,使用无参构造方法时,此值默认是16 2.loadFactor ...

  3. 【javaFX学习】(一) 建一个简单的界面

    转载注明出处:http://www.cnblogs.com/lensener/p/7976953.html 用过swing都知道有多蛋疼,界面有多丑.自从用了javaFX,腰也不酸了,腿也不疼了. 废 ...

  4. RAC环境下误操作将数据文件添加到本地存储

    今天碰到个有意思的事情,有客户在Oracle RAC环境,误操作将新增的数据文件直接创建到了其中一个节点的本地存储上. 发现网上去搜的话这种问题还真不少,对应解决方案也各式各样,客户问我选择哪种方案可 ...

  5. 内网神器-Bettercap

    安装bettercap 1 2 root@sch01ar:~# apt-get update root@sch01ar:~#  apt-get install bettercap 安装完成后查看一下帮 ...

  6. Java第二季

    1.封装 (1)概念 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. (2)封装的实现步骤 2.Java中的访问修饰符 3.继承 (1)Ja ...

  7. linux磁盘管理系列-软RAID的实现

    1 什么是RAID RAID全称是独立磁盘冗余阵列(Redundant Array of Independent Disks),基本思想是把多个磁盘组合起来,组合一个磁盘阵列组,使得性能大幅提高. R ...

  8. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  9. nginx 配置入门

    之前的nginx配置是对nginx配置文件的具体含义进行讲解,不过对于nginx的新手可能一头雾水. 今天看到个文档不错,翻译过来分享给大家,可以让新手更详细地了解nginx配置,可以说是nginx配 ...

  10. 深入理解php内核 编写扩展 II:参数、数组和ZVALs

    原文:http://devzone.zend.com/article/1022-Extension-Writing-Part-II-Parameters-Arrays-and-ZVALs Part I ...