java获取当前应用的运行信息(内存,线程,运行时间,状态等)
一:目的
写这一段程序的原因是需要监控部署的的应用是否正常运行,并且显示其运行状态。在进程莫名死掉后甚至可以自动启动该应用。
首先这段代码可以获取的信息如下
/**
* 当前进程运行的主机名
*/
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获取当前应用的运行信息(内存,线程,运行时间,状态等)的更多相关文章
- 使用java获取手机号归属地等信息httpClient实现
java获取手机号归属地 一般想获取手机号归属地等信息个人是无法获取的,但是可以通过调用第三方接口获取,具体百度搜索很多这里例子提供一个淘宝的接口 ,该功能已经发布到网站作为一个在线小工具,拿走不谢: ...
- java中如何使正在运行中的线程退出
终止线程的三种方法 有三种方法可以使终止线程. 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2. 使用stop方法强行终止线程(这个方法不 ...
- JAVA优化篇 如何找到运行缓慢的线程
引入 JAVA提供了一些分析DUMP的工具,比如jmap,visualvm 等 JAVA还有寻找线程状态的工具,jstack等 数据库也有检查连接数,连接状态的命令,status,processlis ...
- Javascript和Java获取各种form表单信息的简单实例
大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于che ...
- java 获取服务器 linux 服务器IP 信息
public String getUnixLocalIp() { String ip = ""; try { Enumeration<?> e1 = (Enumerat ...
- Java多线程和并发(五),线程的状态
目录 1.线程的六个状态 2.sleep和wait的区别 3.锁池(EntryList)和等待池(WaitSet) 4.notify和notifyall的区别 五.线程的状态 1.线程的六个状态 2. ...
- Java中的CPU占用高和内存占用高的问题排查
下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...
- Thread线程源码解析,Java线程的状态,线程之间的通信
线程的基本概念 什么是线程 现代操作系统在运行一个程序的时候,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.线代操作系统调度的最小单位是线程.也叫做轻量级进程.在一 ...
- Java并发编程的艺术(五)——线程和线程的状态
线程 什么是线程 操作系统调度的最小单元就是线程,也叫轻量级进程. 为什么要使用多线程 多线程程序能够更有效率地利用多处理器核心. 用户响应时间更快. 方便程序员将程序模型映射到Java提供的多线程编 ...
随机推荐
- day04 JS
很伤心,就在前天下午,本人的电脑突然挂了,电脑售后告知需要10个工作日才可修好. 于是乎,昨天学的内容来不及整理,暂且跳过,改天再抽空补上,就当缓几天再复习吧. 今天继续学习了JS的内容. 1 js的 ...
- fetch知识点汇总
使用XHR发送一个json请求一般是这样: const xhr = new XMLHttpRequest() xhr.open('Get', url) xhr.responseType = 'json ...
- 微信官方团队放出了UI库,看来以后前端还要学WeChatUI了,哈哈
已经在github上发布,网址如下:https://github.com/weui/weui
- 【前端开发】--js弹框
js三种弹框 一.普通弹框 这类弹框就是仅仅是个提示作用,并不会做其它操作 关键词:alert() 这个没啥好说的,就是一个弹框. 二.判断弹框 这类框有一个判断作用 关键字:conf ...
- 模块化编程node
众所周知,Node.js 的出现造就了全栈工程师,因为它让 JavaScript 的舞台从浏览器扩大到了服务端 而 Node.js 的强大也得益于它庞大的模块库,所以学习 Node.js 第一步还得从 ...
- 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一、Adjacency List)
今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢? 像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了. 举个栗子:现在有一 ...
- IDEA上传项目至git
今天来分享一下从idea上传项目至coding的过程. 本文基于windows系统. idea提供了很方便的控制git的界面化操作,除了安装git和一些必要的配置之外,用到命令行的地方会非常少. 1: ...
- HTTP/2之服务器推送(Server Push)最佳实践
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 HTTP/1.X出色地满足互联网的普遍访问需求,但随着互联网的不断发展,其性能越来越成为瓶颈.IETF在2015 ...
- 数据结构与算法(C/C++版)【串】
第四章<串.数组> (一)串 数据结构中提到的串,即字符串,由 n 个字符组成的一个整体( n >= 0 ).这 n 个字符可以由字母.数字或者其他字符组成.例如,S = &qu ...
- mongoDB之数据类型
mongoDB之数据类型 Object ID :文档的id String: 字符串,最常用,必须是utf-8 Boolean:布尔值,true 或者false Integer:整数 Double:浮 ...