使用java访问任务管理器中的内存

Posted

技术标签:

【中文标题】使用java访问任务管理器中的内存【英文标题】:Acess memory in task manager using java 【发布时间】:2020-07-09 09:47:24 【问题描述】:

我想查询一下 mysql、MongoDB 和 Neo4j 使用 java 时使用的内存。 我已经搜索过它,但没有找到任何相关的东西。 我的操作系统是 Windows,我正在使用 Eclipse。 谢谢

【问题讨论】:

您的目标是哪个平台? Windows,使用 Eclipse ***.com/questions/47177/… 我认为这个问题至少部分涵盖了答案,@RodrigoCordeiro。如果需要更多说明,请发表评论。 你想获取什么数据?任务的名称以及它使用了多少内存?任务使用的内存量是动态的,即它不是恒定的。您想要在请求的那一刻获得内存量,还是想要监控它在一段时间内的变化? 我想要 MySQL、MongoDB 和 Neo4j 即时使用的内存。我只需要这 3 个程序 【参考方案1】:

我刚刚想出了一个java代码模板来运行windows命令,你需要运行tasklist命令来获得所有进程表以及所有信息,包括每个进程使用的内存。

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TaskMemory 

    public static void main(String[] args) 
        Process process = null;
        if (System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0) 
            String command = "cmd.exe /c tasklist";
            try 
                process = Runtime.getRuntime().exec(command);
             catch (IOException e) 
                e.printStackTrace();
            
        
        if (process != null) 
            InputStream good = process.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(good));
            StringBuffer sb = new StringBuffer();
            String str;

            try 
                for(int i = 0; i < 3; i++)
                    if((str = bufferedReader.readLine()) != null)
                        sb.append(str).append("\n");
                    
                
                while ((str = bufferedReader.readLine()) != null) 
                    if(str.matches("(.*)mysqld.exe(.*)|(.*)mongod.exe(.*)|(.*)neo4j.exe(.*)"))
                        sb.append(str).append("\n");
                    
                
                if (sb.toString().trim().isEmpty()) 
                    InputStream error = process.getErrorStream();
                    bufferedReader = new BufferedReader(new InputStreamReader(error));

                    while ((str = bufferedReader.readLine()) != null) 
                        sb.append(str).append("\n");
                    
                
                System.out.println(sb.toString());
             catch (IOException e) 
                e.printStackTrace();
            
        

    


我只是编辑我的解决方案,以便它可以只抓取 mysql、mongodb 和 neo4j 进程。

【讨论】:

摘自类java.lang.Runtime中方法execjavadocProcessBuilder.start()现在是启动进程的首选方式 【参考方案2】:

据我所知,JDK 的 API 中没有任何东西可以查询主机操作系统的进程。因此,我能想到的唯一选择是使用ProcessBuilder 类来执行主机操作系统命令。

由于您声明您的操作系统是 Windows,以下PowerShell 命令将输出您选择的进程的进程名称和内存使用情况。

Get-Process | Where-Object $_.ProcessName -in 'MySQL','MongoDB','Neo4j' | Select-Object -Property 'ProcessName','WorkingSet' | Format-Table -HideTableHeaders

请注意,我不确定进程名称,因为我不使用 MySQLMongoDBNeo4j 中的任何一个。我假设您确实知道正确的进程名称,因此请记住在运行之前在上述命令中更正它们。

下面的代码使用ProcessBuilder运行上面的[PowerShell]命令并将命令输出重定向到System.out

import java.io.IOException;
import java.lang.ProcessBuilder;

public class PrcBldT2 

    public static void main(String[] args) 
        ProcessBuilder pb = new ProcessBuilder("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                "Get-Process | Where-Object $_.ProcessName -in 'eclipse','oracle' | Select-Object -Property 'ProcessName','WorkingSet' | Format-Table -HideTableHeaders");

        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
        pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
        try 
            Process p = pb.start();
            int result = p.waitFor();
            System.out.println("Exit status = " + result);
        
        catch (IOException | InterruptedException x) 
            x.printStackTrace();
        
    

【讨论】:

以上是关于使用java访问任务管理器中的内存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 任务管理器中 查看某一个进程的cpu占用率?

分配内存时,任务管理器中的物理内存不会改变

关于任务管理器中的进程

任务管理器中CPU不见了

如何像 Windows 任务管理器中显示的那样获得可用的物理内存

Windows Server 2008 R2服务器内存使用率过高,但与任务管理器中进程占用内存和不一致