프로젝트/토이 프로젝트(개인)

[ONLY JAVA-리플렉션] 자바 내 PC의 CPU, 메모리를 실시간으로 확인하는 프로그래밍 / 자바로 간단하게 프로그래밍 하기/자바 SWING/자바 리플렉션/자바 AWT/자바로 CPU측정/자바 초보 개발자

으노으뇨 2022. 12. 6. 19:04
728x90
반응형
SMALL
개요

자바의 리플렉트를 이용하여 OSMXBean를 구현해보았고 그것을 이용하여 OS의 메모리와 CPU를 체크할 수 있도록 구현하였습니다. 라이브러리를 통해 쉽게 할 수 있다고 하지만, 개발자 스스로 라이브러리의 도움없이 기본 자바 클래스와 인터페이스 만으로 스스로 공부하여 구현하였습니다.

주로 사용된 기술은 아래와 같습니다.

  1. 자바 리플렉트
  2. 자바 Enum 클래스 응용
  3. 자바 인터페이스 상속
  4. 자바 내부 Swing을 이용하여 GUI 그래픽
내용

안녕하세요~! !!ㅎㅎㅎ

 

오늘도 어김없는 자바로 간단하게 프로그램만들어보는 포스팅입니다!!

자바로 간단하게 내 PC의 CPU/메모리를 확인하는 프로그래밍을 만들어보기

이번엔 실시간으로 CPU와 메모리 사용율을 출력받아보는 기능 이용해서 해당 메모리를 우리가 보고 관리할 수 있도록 하는 프로그램을 만들어보겠습니다!!

우선 해당 기능들을 응용했습니다.

  • 리플렉트를 이용해서 클래스의 매서드 동작시키기
  • 자바 내장 JFram 기능을 통해서  윈도우에 띄우기 

참고 할만한 포스팅 : https://uno-kim.tistory.com/227

 

[JAVA] 자바 Enum 클래스를 이용해보기 / 자바 Reflect 응용 / 자바 인터페이스 응용 / 자바 기초 / 자

안녕하세요~~!!! ㅎㅎㅎㅎ 지난 포스팅으로 자바의 기초문법인 리플렉트를 이용해서 https://uno-kim.tistory.com/226 [JAVA] 자바 리플렉트를 이용한 OperatingSystemMXBean클래스로 현재 PC의 CPU를 확인하기 안

uno-kim.tistory.com

간단한 소스들로 진행되겠습니다!!

우선 실제 구동되는 모습을 한번 동영상으로 살펴볼까요~~~??

엄청간단하게 나오는군요!!! 

총 소스는 맨 하단에 있습니다 .참고해주시면 되겠습니다!!!


1. CPU 메모리 출력하기

https://uno-kim.tistory.com/226

 

[JAVA] 자바 리플렉트를 이용한 OperatingSystemMXBean클래스로 현재 PC의 CPU를 확인하기

안녕하세요~!~~~!!!ㅎㅎㅎㅎ 오늘은 리플렉트를 이용해서 OperatingSystemMXBean 클래스를 인스턴스화 하고 해당 클래스내의 메서드를 호출하여 CPU 상태를 확인하는 방법에 대해서 설명하겠습니다. 우

uno-kim.tistory.com

위의 방법대로 CPU의 현재 상태를 가져오면 되겠습니다. 

특히 현재 쓰일 메서드는

getSystemCpuLoad()

입니다. 현재 시스템의 씨피유의 값을 double형태로 아마도 0.@@@@ 이런형태로 출력받으 실수 있으십니다!

물론 조금 다듬어서 저의 경우에는 이넘클래스로 한번 묶어주어서 관리합니다. 

실제 기능은 Enum 클래스인 OSMXBean에서 구현되었구요

해당 이넘은 인터페이스를 상속받는데 상수형으로 상속받습니다. 이 상수들을 이용해서 리플렉션을 돌릴떄 사용하기 위해서입니다.

package Java.Reflect;

interface MyOperatingSystemMXBean
{
	abstract Object getValue();
	
	public final String getCommittedVirtualMemorySize = "getCommittedVirtualMemorySize";
	public final String getFreePhysicalMemorySize = "getFreePhysicalMemorySize";
	public final String getFreeSwapSpaceSize = "getFreeSwapSpaceSize";
	public final String getProcessCpuLoad = "getProcessCpuLoad";
	public final String getProcessCpuTime = "getProcessCpuTime";
	public final String getSystemCpuLoad = "getSystemCpuLoad";
	public final String getTotalPhysicalMemorySize = "getTotalPhysicalMemorySize";
	public final String getTotalSwapSpaceSize = "getTotalSwapSpaceSize";
}

밑에는 이넘클래스입니다. 실제 동작은 아래 getValue()에서 excute메서드로 부터 동작됩니다.

enum OSMXBean implements MyOperatingSystemMXBean
{
	COMMITTED_VIRTUAL_MEMORY_SIZE
	{
		@Override
		public Object getValue()
		{
			return this.excute(getCommittedVirtualMemorySize);
		}
	},
	FREE_PHYSICAL_MEMORY_SIZE
	{
		@Override
		public Object getValue()
		{
			return this.excute(getFreePhysicalMemorySize);
		}
	},
	FREE_SWAP_SPACE_SIZE
	{
		@Override
		public Object getValue()
		{
			return this.excute(getFreeSwapSpaceSize);
		}
	},
	PROCESS_CPU_LOAD
	{
		@Override
		public Object getValue()
		{
			return this.excute(getProcessCpuLoad);
		}
	},
	PROCESS_CPU_TIME
	{
		@Override
		public Object getValue()
		{
			return this.excute(getProcessCpuTime);
		}
	},
	SYSTEM_CPU_LOAD
	{
		@Override
		public Object getValue()
		{
			return this.excute(getSystemCpuLoad);
		}
	},
	TOTAL_PHYSICAL_MEMORY_SIZE
	{
		@Override
		public Object getValue()
		{
			return this.excute(getTotalPhysicalMemorySize);
		}
	},
	TOTAL_SWAP_SPACE_SIZE
	{
		@Override
		public Object getValue()
		{
			return this.excute(getTotalSwapSpaceSize);
		}
	};
	private HashMap<String, Method> methodMap = new HashMap<String, Method>();
	private OperatingSystemMXBean osBean;
	
	OSMXBean()
	{
		this.osBean = ManagementFactory.getOperatingSystemMXBean();
		Method[] methods = osBean.getClass().getDeclaredMethods();
		for (Method method : methods)
		{
			method.setAccessible(true);
			this.methodMap.put(method.getName(), method);
		}
	}
	protected Object excute(String str)
	{
		Object value = null;
		try
		{
			value = this.methodMap.get(str).invoke(this.osBean);
		}
		catch (Exception e)
		{
			// TODO: handle exception
		}
		return value;
	}
}

여기서 처리하고, MemoryUtils에서 위의 과정들을 크게 하나로 묶어서 리턴을 해주는 클래스로 만들었습니다. 

package Java.Reflect;

public class MemoryUtils
{
	/**
	 * @apiNote getCommittedVirtualMemorySize return Long type
	 * @apiNote 배정된 가상 메모리 사이즈 반환(long 타입)
	 */
	static public long getCommittedVirtualMemotySize()
	{
		return (long) OSMXBean.COMMITTED_VIRTUAL_MEMORY_SIZE.getValue();
	}
	/**
	 * @apiNote getFreePhysicalMemorySize return Long type
	 * @apiNote 사용가능한 물리적 메모리 사이즈 반환(long 타입)
	 */
	static public long getFreePhysicalMemorySize()
	{
		return (long) OSMXBean.FREE_PHYSICAL_MEMORY_SIZE.getValue();
	}
	/**
	 * @apiNote getFreeSwapSpaceSize return Long type
	 * @apiNote 스왑가능한 공간 사이즈 반환(long 타입)
	 */
	static public long getFreeSwapSpaceSize()
	{
		return (long) OSMXBean.FREE_SWAP_SPACE_SIZE.getValue();
	}
	/**
	 * @apiNote getProcessCpuLoad return Double type
	 * @apiNote 최근 CPU 사용량을 반환 (double)
	 */
	static public double getProcessCpuLoad()
	{
		return (double) OSMXBean.PROCESS_CPU_LOAD.getValue();
	}
	/**
	 * @apiNote getProcessCpuTime return Long type
	 * @apiNote 자바가 사용되는 프로세스에서 사용된 CPU 시간을 반환합니다.
	 */
	static public long getProcessCpuTime()
	{
		return (long) OSMXBean.PROCESS_CPU_TIME.getValue();
	}
	/**
	 * @apiNote getSystemCpuLoad return Double type
	 * @apiNote 전체 시스템의 최근 CPU 사용량을 반환 (double)
	 */
	static public double getSystemCpuLoad()
	{
		return (double) OSMXBean.SYSTEM_CPU_LOAD.getValue();
	}
	/**
	 * @apiNote getTotalPhysicalMemorySize return Long type
	 * @apiNote 물리메모리의 합계량을 반환 (long)
	 */
	static public long getTotalPhysicalMemorySize()
	{
		return (long) OSMXBean.TOTAL_PHYSICAL_MEMORY_SIZE.getValue();
	}
	/**
	 * @apiNote getTotalSwapSpaceSize return Long type
	 * @apiNote 총 스왑 공간을 반환 (long)
	 */
	static public long getTotalSwapSpaceSize()
	{
		return (long) OSMXBean.TOTAL_SWAP_SPACE_SIZE.getValue();
	}
}

일단 CPU를 출력하는 방법에 대해서는 자바 기존문법을 사용하여서 누구나 따라할 수 있게 작성했습니다.

- 라이브러리 미사용

그래서 이제 MemoryCheck하는 클래스를 만들어서 출력하게끔 해보겠습니다!!

package Java.Reflect;

public class MemoryCheck
{
	public static void main(String[] args) throws InterruptedException
	{
		while (true)
		{
			System.out.println("사용중인 CPU 메모리 : " + MemoryUtils.getSystemCpuLoad());
			System.out.println("사용가능 RAM 메모리 : " + MemoryUtils.getFreePhysicalMemorySize());
		}
	}
}

이 기능이 소스 단 3줄로 나옵니다!! 두구두구두구!!~~ㅎㅎㅎ

ㅇㅓㅇㅜ ... 너무 어지러우니 CPU 메모리만 나오게 해보겠습니다!!!

실시간으로 변하는 모습은 영상을 통해 보겠습니다!!

자바로 CPU를 실시간으로 측정할 수 있다니 대박인데요?!

이제 이것을 콘솔 프로그래밍이 아닌 자바 내장 객체인 JFram을 이용해서 윈도우에 띄워서 보겠습니다


2. 자바로 윈도우 프로그래밍 하기 (JFrame이용)

다른 분들처럼 열심히 JFrame에 대해서 서술하지 않겠으나

모두 자바를 처음 배우실때 JFrame으로 배운다고 들은 것 같습니다. 따라서 설명은 하지않겠습니다.

소스부터 보자면 

package Java.Reflect;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MemoryCheck
{
	public static void main(String[] args) throws InterruptedException
	{
		JFrame window = new JFrame("CPU Memory Check");
		JButton cpuLabel = new JButton();
		JButton memoryLabel = new JButton();
		
		window.add(cpuLabel);
		window.add(memoryLabel);
		window.setBounds(800, 100, 400, 200);
		window.setLayout(new GridLayout(1, 3));
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.setVisible(true);
		
		while (true)
		{
			System.out.println("사용중인 CPU 메모리 : " + MemoryUtils.getSystemCpuLoad());
//			System.out.println("사용가능 RAM 메모리 : " + MemoryUtils.getFreePhysicalMemorySize());
		}
	}
}

이렇게 작성했습니다.

프레임을 선언하고 거기에 버튼으로 라벨인척하게 만들었습니다.

위 소스를 실행하면

이렇게 뭔가 아무것도 안나오는것을 확인 할 수 있습니다.

이제 이 네모칸안에 CPU와 메모리를 실시간으로 받아 출력되어질 수 있게 해보겠습니다!!

package Java.Reflect;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MemoryCheck
{
	public static void main(String[] args) throws InterruptedException
	{
		JFrame window = new JFrame("CPU Memory Check");
		JButton cpuLabel = new JButton();
		JButton memoryLabel = new JButton();
		
		window.add(cpuLabel);
		window.add(memoryLabel);
		window.setBounds(800, 100, 400, 200);
		window.setLayout(new GridLayout(1, 3));
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.setVisible(true);
		
		while (true)
		{
			// Thread.sleep(1000);
			cpuLabel.setText(Math.round(MemoryUtils.getSystemCpuLoad() * 100) + "%");
			memoryLabel.setText(String.valueOf(Math.round(MemoryUtils.getFreePhysicalMemorySize() / 1000)));
		}
	}
}

중간에 쓰레드는 너무 정신없을까봐 1초마다 적용되게했지만 그럼 실시간의 의미를 퇴색하게 되므로

우선 주석처리했습니다 ㅎㅎ이제 한번 실행해보겠습니다.

실시간으로 변하고 있는 모습입니다!!!

이제 최상단의 결과모습과 최종 모습을 하게 됩니다.

사실 녹화프로그램을 돌리고있어서 그렇지만 평소 안정적일땐

위와같이 편안한 숫자가 나오는데... 이것도 캡쳐를 누르는순간 팍 튀네요 신기하네요...

MemoryCheck.java
0.00MB
MemoryUtils.java
0.00MB
MyOperatingSystemMXBean.java
0.00MB
OSMXBean.java
0.00MB

 

파일은 총 4개로 구성되어있고, 기본적인 문법 (이넘, 인터페이스, 클래스)으로만 구현을 하였습니다.

 

복잡하게 팩토리패턴이나 다른 디자인패턴은 적용안했습니다.

사실 몰라서 아니냐구요? 네 맞습니다... 

리플렉트가 아닌 다른 방법으로 해당 클래스를 구현하셨다면 말씀주세요 

배우겠습니다... 다만 sun 패키지를 이용해서 바로 사용하셨다면 음... 네;; 저는 그게 안깔려서요 ㅠ...

그래도 자바로만 프로그래밍 시리즈를 봐주셔서 감사합니다.

https://github.com/uno-km/Study_java/tree/main/src/Java/Reflect

 

GitHub - uno-km/Study_java

Contribute to uno-km/Study_java development by creating an account on GitHub.

github.com

제 깃허브 주소입니다. 계속 관리되고 있는 소스는 위와같으니 한번 참고 바랍니다.

다음에는 자바로 마이닝하는 프로그램을 만들어 보고 소개해드리겠습니다 감사합니다!!

 

728x90
반응형
LIST