您现在的位置是:首页 > 文章详情

Java获取虚拟机内存和操作系统内存及其线程

日期:2018-08-23点击:383

为什么要获取虚拟机内存和操作系统内存呢?

虚拟机内存,这里主要指JVM。为了防止有的时候因为JVM内存问题导致服务器宕机,所以有必要监控JVM的内存。当达到一定值时,通过邮件及时通知,防止线上宕机造成更大的损失。这里监控操作系统的内存同样如此。因为一个服务器上,tomcat,mysql,redis,mongodb,zabbix,nexus,jenkins,maven等等都是要占用操作系统的内存的。

特别是tomcat,mysql等等,线上每天都会产生大量的日志,而这些日志不能删。当然了,通过shell脚本可以定期对这些做备份。但是就拿我上家公司来说,一个服务器上,通常运行5到6个应用。这5到6个应用,虽说以crm和erp为主,对应网站性能和线程并发方面虽要求不高,但是它们在线上也会有大量日志输出,这些日志通常对于解决一些隐性Bug有很大的帮助,同时他们也会占用系统内存的。

关于邮件监控可以参考我的这篇文章:Spring定时任务使用和如何使用邮件监控服务器

另外在此也介绍下hutools这个开源项目,这个开源项目也提供与下面java代码一样的功能(系统属性调用)

参考地址为:http://hutool.mydoc.io/

直接main方法运行,即可获得对应的信息

代码如下:

import java.lang.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; public class MonitorInfoTest { public static void main(String[] args) { // 虚拟机级内存情况查询 long vmFree = 0; long vmUse = 0; long vmTotal = 0; long vmMax = 0; int byteToMb = 1024 * 1024; Runtime rt = Runtime.getRuntime(); vmTotal = rt.totalMemory() / byteToMb; vmFree = rt.freeMemory() / byteToMb; vmMax = rt.maxMemory() / byteToMb; vmUse = vmTotal - vmFree; System.out.println("JVM内存已用的空间为:" + vmUse + " MB"); System.out.println("JVM内存的空闲空间为:" + vmFree + " MB"); System.out.println("JVM总内存空间为:" + vmTotal + " MB"); System.out.println("JVM总内存空间为:" + vmMax + " MB"); System.out.println("======================================"); // 操作系统级内存情况查询 OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); String os = System.getProperty("os.name"); long physicalFree = osmxb.getFreePhysicalMemorySize() / byteToMb; long physicalTotal = osmxb.getTotalPhysicalMemorySize() / byteToMb; long physicalUse = physicalTotal - physicalFree; System.out.println("操作系统的版本:" + os); System.out.println("操作系统物理内存已用的空间为:" + physicalFree + " MB"); System.out.println("操作系统物理内存的空闲空间为:" + physicalUse + " MB"); System.out.println("操作系统总物理内存:" + physicalTotal + " MB"); // 获得线程总数  ThreadGroup parentThread; int totalThread = 0; for (parentThread = Thread.currentThread().getThreadGroup(); parentThread .getParent() != null; parentThread = parentThread.getParent()) { totalThread = parentThread.activeCount(); } System.out.println("获得线程总数:" + totalThread); } }

 

原文链接:https://yq.aliyun.com/articles/645078
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章