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

简介: 为什么要获取虚拟机内存和操作系统内存呢?虚拟机内存,这里主要指JVM。为了防止有的时候因为JVM内存问题导致服务器宕机,所以有必要监控JVM的内存。当达到一定值时,通过邮件及时通知,防止线上宕机造成更大的损失。

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

虚拟机内存,这里主要指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);
    }
}

 

目录
相关文章
|
1天前
|
前端开发 Java 应用服务中间件
在虚拟机的Windows操作系统中:通过Jar方式若依项目,以及在外部的访问!
在虚拟机的Windows操作系统中:通过Jar方式若依项目,以及在外部的访问!
|
2天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第7天】在Java中,多线程编程是提高应用程序性能和响应能力的关键。本文将深入探讨Java并发编程的核心概念,包括线程安全、同步机制以及性能优化策略。我们将通过实例分析,了解如何避免常见的并发问题,如死锁、竞态条件和资源争用,并学习如何使用Java提供的并发工具来构建高效、可靠的多线程应用。
|
2天前
|
缓存 Java
Java并发编程:深入理解线程池
【5月更文挑战第7天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,以及如何使用Java的Executor框架来创建和管理线程池。此外,我们还将讨论线程池的优点和缺点,以及如何选择合适的线程池大小。最后,我们将通过一个示例来演示如何使用线程池来提高程序的性能。
|
3天前
|
安全 Java
Java中的并发编程:理解并发性与线程安全
Java作为一种广泛应用的编程语言,在并发编程方面具有显著的优势和特点。本文将探讨Java中的并发编程概念,重点关注并发性与线程安全,并提供一些实用的技巧和建议,帮助开发人员更好地理解和应用Java中的并发机制。
|
3天前
|
Java
Java中的多线程编程:基础知识与实战技巧
【5月更文挑战第6天】多线程编程是Java中的一个重要特性,它允许我们在一个程序中同时执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动、同步和通信,以及如何在Java中实现多线程编程。通过实例代码和解析,帮助读者深入理解Java多线程编程的概念和应用。
|
4天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第5天】在现代软件开发中,多线程编程是一个重要的概念,尤其是在Java这样的多平台、高性能的编程语言中。通过多线程,我们可以实现并行处理,提高程序的运行效率。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制方法,以及一些常见的多线程问题和解决方案。
|
5天前
|
算法 安全 Linux
深入理解操作系统的内存管理:原理与实践
【5月更文挑战第4天】 在现代计算领域,操作系统的内存管理是保证系统稳定、高效运行的关键。本文旨在深入剖析操作系统内存管理的基本原理,包括虚拟内存、物理内存、分页机制和内存交换等概念。同时,文章将探讨如何通过优化内存分配策略,提升系统性能及响应速度。此外,还将讨论当前流行的操作系统(如Linux和Windows)中内存管理的创新技术及其应用案例。
|
7天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
25 3
|
7天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
29 2
|
7天前
|
Java 调度 开发者
Java中的多线程编程:基础与实践
【5月更文挑战第2天】本文将深入探讨Java中的多线程编程,从基础概念到实际应用,为读者提供全面的理解和实践指导。我们将首先介绍线程的基本概念和重要性,然后详细解析Java中实现多线程的两种主要方式:继承Thread类和实现Runnable接口。接着,我们将探讨线程同步的问题,包括synchronized关键字和Lock接口的使用。最后,我们将通过一个实际的生产者-消费者模型来演示多线程编程的实践应用。