How to monitor the resources used by another java vm in a separate java application

48 Views Asked by At

I am looking to monitor the resources used by my Minecraft server using my own custom resource monitor that uses JProgressBars to display a percentage for CPU usage and memory usage. I have the GUI coded for it already, but I have no idea where to even begin to start to code the resource monitoring part. I know I can use Jconsole to monitor the resources or even the Minecraft server's GUI, but I would really like to make my own customized GUI resource monitor for it.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Scanner;

import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Painter;
import javax.swing.Timer;
import javax.swing.UIDefaults;
import javax.swing.border.Border;
import javax.swing.plaf.ProgressBarUI;
import javax.swing.plaf.metal.MetalProgressBarUI;

public class ResourceMonitor {


    public ResourceMonitor() {
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        Font largeFont = new Font("segoe ui black", Font.PLAIN, 14);
        Font smallFont = new Font("segoe ui black", Font.PLAIN, 12);
        Font titleFont = new Font("rockwell", Font.BOLD, 20);
        JFrame frame = new JFrame();
        JLabel label1 = new JLabel(" CPU Usage ");
        JLabel label2 = new JLabel(" RAM Usage ");
        JLabel label3 = new JLabel(" Resource Monitor ");
        JPanel panel1 = new JPanel();       
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        JPanel panel4 = new JPanel();
        JPanel panel5 = new JPanel();
        JPanel panel6 = new JPanel();
        JProgressBar cpuLoad = new JProgressBar();
        JProgressBar ramLoad = new JProgressBar();
        int w = frame.getSize().width;
        int h = frame.getSize().height;
        int x = (dim.width - w) / 3;
        int y = (dim.height - h) / 3;
        var labelColor = new Color(121,192,90);
        var borderColor = new Color(67,70,75);
        var panelColor = new Color(101,67,33);
        var titleColor = new Color(67,70,75);
        var barColor = Color.GRAY;
        var minSize = new Dimension(300, 185);
        Border titleBorder = BorderFactory.createLineBorder(borderColor, 3);
        Border barBorder = BorderFactory.createLineBorder(borderColor, 2);
        ProgressBarUI cpuUI = new MetalProgressBarUI() {

              protected Color getSelectionForeground() {
                return Color.DARK_GRAY;
              }
              protected Color getSelectionBackground() {
                return Color.DARK_GRAY;
              }
        };
        ProgressBarUI ramUI = new MetalProgressBarUI() {

              protected Color getSelectionForeground() {
                return Color.DARK_GRAY;
              }
              protected Color getSelectionBackground() {
                return Color.DARK_GRAY;
              }
        };      
        Runtime python = Runtime.getRuntime();
//Runtime

//JProgressBar 1
        cpuLoad.setUI(cpuUI);
        cpuLoad.setStringPainted(true);
        cpuLoad.setBackground(Color.LIGHT_GRAY);
        cpuLoad.setForeground(barColor);
        cpuLoad.setFont(smallFont);
        cpuLoad.setBorder(barBorder);
//JProgressBar 2
        ramLoad.setUI(ramUI);
        ramLoad.setStringPainted(true);
        ramLoad.setBackground(Color.LIGHT_GRAY);;
        ramLoad.setForeground(barColor);
        ramLoad.setFont(smallFont);
        ramLoad.setBorder(barBorder);
//JPanel 1
        panel1.add(label1); 
        panel1.add(cpuLoad);
        panel1.setBackground(panelColor);
//JPanel 2
        panel2.add(label2);
        panel2.setBackground(panelColor);
        panel2.add(ramLoad);
//JPanel 3
        panel3.add(label3);
        panel3.setBackground(panelColor);
//JPanel 4
        panel4.setLayout(new GridLayout(3,1,0,5));
        panel4.add(panel3);
        panel4.add(panel1);
        panel4.add(panel2);
        panel4.setBackground(panelColor);
//JPanel 5
        panel5.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
        panel5.setLayout(new BoxLayout(panel5, BoxLayout.PAGE_AXIS));
        panel5.add(panel4);
//JPanel 6
        panel6.add(panel5);
        panel6.setBackground(panelColor);
//JLabel 1
        label1.setBackground(labelColor);
        label1.setFont(largeFont);    
        label1.setOpaque(true);
//JLabel 2
        label2.setBackground(labelColor);
        label2.setFont(largeFont);    
        label2.setOpaque(true);
//JLabel 3
        label3.setForeground(titleColor);
        label3.setBackground(Color.LIGHT_GRAY);
        label3.setFont(titleFont);    
        label3.setBorder(titleBorder);
        label3.setOpaque(true);
//JFrame
        frame.add(panel6);       
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Resource Monitor");
        frame.pack();
        frame.setVisible(true);     
        frame.setMinimumSize(minSize);
        frame.setBounds(x, y, 300, 150);
    
    }   
     
    public static void main(String[] args){
        new ResourceMonitor();
    }
}

above is the code for the gui. I am a beginner with java so please try to be as explicit as possible.

I have tried using different MXBeans and such but Im not sure how to use them fully.

0

There are 0 best solutions below