본문 바로가기
Java

[Java] 전체 물리 메모리와 남은 메모리 확인

by 탷 2022. 3. 23.

프로그램을 개발하다가 테스트 환경의 메모리 양을 확인해야하는 상황이 발생했다.

처음에는 runtime 함수를, 

두번째는 OS 환경에 의존성이 있는 방법을,

세번째에서야 원하는 결과를 구할 수 있었다.


먼저 간단하게 찾아본 바로는 Runtime 함수를 이용해서 될 줄 알았다.

final long totalMemory = Runtime.getRuntime().totalMemory()/1024/1024;
final long freeMemory = Runtime.getRuntime().freeMemory()/1024/1024;
final long maxMemory = Runtime.getRuntime().maxMemory()/1024/1024;
final long usedMemory = totalMemory - freeMemory;

System.out.println("total memory: " + totalMemory + "M bytes");
System.out.println("free memory: " + freeMemory + "M bytes");
System.out.println("max memory: " + maxMemory + "M bytes");
System.out.println("used memory: " + usedMemory + "M bytes");

 

하지만 위 명령어의 경우 Java 가상머신의 메모리를 불러오는 경우고, 메모리 64기가인 Window 환경과 6기가를 할당한 가상머신에서 테스트를 진행한 결과 아래와 같은 값을 불러온다. 확인하고 싶던 실제 메모리를 불러오는것과는 큰 차이가 있었다.

Window 환경
Linux 환경

여기서, total memory는 JVM의 모든 메모리양을, 

free memory는 JVM의 남은 메모리양을, 

max memory는 JVM이 사용하려고 시도한 최대 메모리양을

used memory는 현재 사용중인 메모리를 구해서 출력시킨것이다.

 


두번째로 찾은 방법은 외부 프로그램을 실행시켜 값을 받아내어 출력시키는 방법인데, window의 경우 systeminfo를 

사용할 수 있었다. cmd를 열어 systeminfo를 입력하면 아래와 같은 값을 확인할 수 있다.

이를 이용하는 명령어는 아래와 같다.

try {
    String output, err;
    String[] cmd = {"systeminfo.exe"};
    Process proc = Runtime.getRuntime().exec(cmd);

    BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    BufferedReader stderr = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

    try {
        while ( (output = stdout.readLine()) != null) {
            System.out.println(output);
            if (output.indexOf("메모리") > 0) {
            	System.out.println(output);
        	}
    	}
        while ( (err = stderr.readLine()) != null) {
            System.out.println(err);
        }
	}
    catch (IOException e) {
    	System.exit(0);
    }
}
catch (IOException e1) {
    System.err.println(e1);
    System.exit(1);
}

 

linux의 경우 free를 이용해 메모리를 확인할 수 있었다. free가 아닌 top 명령어를 입력하면 memory 외에 다른 값들도 확인 할 수 있었지만 필요한건 메모리뿐이였기때문에 free면 충분할 줄 알았다. 

 

 

 여기서 원하는 값만 필터링해서 구해도 됐겠지만, 이 방법을 사용할 경우 os에 의존성이 생겨서 다른 os에서 사용하게 될경우 os를 구분하여 또 새로운 명령어를 추가해줘야하는 상황이 생긴다.

 


그래서 결국 찾은 방법은 OperatingSystemMXBean을 이용하는 방법이다.

 

OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);

long freeMemory = (int)(osBean.getFreePhysicalMemorySize()/1024/1024/1024);
long maxMemory = (int)(osBean.getTotalPhysicalMemorySize()/1024/1024/1024);
    
System.out.println("freeMemory: " + freeMemory + "g");
System.out.println("maxMemory: " + maxMemory + "g");

 

위와 같이 freePhysicalMemorytotalPhysicalMemory 값을 get 해오면 원하던 값들이 출력되는것을 볼 수 있다.

 

 

물론 저 용량을 다 쓰겠다는것도 아니고 쓸수도 없겠지만, 일단 물리적메모리가 얼마나 있나 봐야하는 상황이 있기때문에 구해보았다.

'Java' 카테고리의 다른 글

[Java] 정규식 표현(regular expression - regex) 사용하기  (0) 2022.03.28