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


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

    虚拟机内存,这里主要指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);
        }
    }
  • 相关阅读:
    unity中制作模拟第一人称视角下的指南针
    unity3D 中的C#脚本一个类调用另一类中简单方法
    unity中UI的屏幕自适应代码
    unity中导入插件时报错处理办法
    Unity3D在C#编程中的一些命名空间的引用及说明
    Unity中物体碰撞后去掉相互之间的反弹力
    unity3D打包发布Apk详细步骤
    unity3D开发的程序发布到Android平台上进行运行测试的详细步骤
    JAVA的环境变量配置(方式二)
    Java中的 JDK下载和环境配置(方式一)
  • 原文地址:https://www.cnblogs.com/youcong/p/9531816.html
Copyright © 2020-2023  润新知