[Ubuntu] Linux如何定位java进程占用系统资源使用率高的问题→CPU和内存使用率

一、Linux如何定位java进程占用系统资源使用率高的问题(简单实现)

  1. linux文件夹下先创建一个TheradDemo.java 文件,明显会在10行死循环,此时会大量占用cpu的资源。下面通过linux命令来定位这个问题
import java.util.Scanner;

public class ThreadDemo1{
  public static void main(String[] args) throws Exception{
      System.out.println(" Thread start...");  
	  Thread t = new Thread(new Runnable(){
	  
		@Override
		public void run(){
			for(;;){   //10行-死循环处!!!!!!!
			}
		}
  });
  t.start();
  t.join();
  System.out.println("Thread end ...");
  }}

在这里插入图片描述

  1. 编译并执行以上java文件,
    在这里插入图片描述
  2. jps/ ps 查看当前进程的PID为4641
    在这里插入图片描述
  3. top -p 4641 查看当前进程的资源使用情况
    在这里插入图片描述
  4. top -Hp 4641 查看当前进程里的所有线程使用情况(看到有一个占用CPU最高的线程 4650)
    在这里插入图片描述
    在这里插入图片描述
  5. jstack 4641 输出当前进程中所有线程的调用栈信息

(查看和占用CPU最高的线程号4650相等的nid(16进制 0X122A),找到top命令输出的那个资源占用率高的线程调用栈信息)
在这里插入图片描述

  1. 找到调用栈信息最上面的代码提示(代码文件和行号)。在java代码上具体分析问题
  java.lang.Thread.State: RUNNABLE
	at ThreadDemo1$1.run(ThreadDemo1.java:10)
	at java.lang.Thread.run(Thread.java:745)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取Ubuntu系统中指定进程资源占用情况,可以使用Java中的ProcessBuilder类和Linux命令行工具top。具体步骤如下: 1. 使用ProcessBuilder类启动top命令,并将输出流重定向到Java程序中。 ```java ProcessBuilder pb = new ProcessBuilder("top", "-b", "-n", "1", "-p", "pid"); pb.redirectErrorStream(true); Process process = pb.start(); ``` 其中,pid是指定进程进程号。 2. 读取top命令的输出,解析出需要的资源占用情况。 ```java BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { if (line.startsWith(pid)) { String[] tokens = line.trim().replaceAll("\\s+", " ").split(" "); double cpuUsage = Double.parseDouble(tokens[8]); double memUsage = Double.parseDouble(tokens[9]); // do something with cpuUsage and memUsage } } ``` 在解析top命令的输出时,我们只需要找到指定进程的行,然后提取出CPU使用率内存使用率即可。 3. 将资源占用情况保存到MySQL数据库中。 ```java Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password"); PreparedStatement stmt = conn.prepareStatement("INSERT INTO process_usage(pid, cpu_usage, mem_usage) VALUES (?, ?, ?)"); stmt.setInt(1, pid); stmt.setDouble(2, cpuUsage); stmt.setDouble(3, memUsage); stmt.executeUpdate(); ``` 在保存资源占用情况时,我们可以将进程号、CPU使用率内存使用率保存到MySQL数据库中的一个表中。需要注意的是,需要提前创建好表和相关的数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值