Runtime의 메모리 정보

Runtime 객체의 memory 관련 메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Returns the amount of free memory in the Java Virtual Machine.
* Calling the
* <code>gc</code> method may result in increasing the value returned
* by <code>freeMemory.</code>
*
* @return an approximation to the total amount of memory currently
* available for future allocated objects, measured in bytes.
*/
public native long freeMemory();

/**
* Returns the total amount of memory in the Java virtual machine.
* The value returned by this method may vary over time, depending on
* the host environment.
* <p>
* Note that the amount of memory required to hold an object of any
* given type may be implementation-dependent.
*
* @return the total amount of memory currently available for current
* and future objects, measured in bytes.
*/
public native long totalMemory();

/**
* Returns the maximum amount of memory that the Java virtual machine will
* attempt to use. If there is no inherent limit then the value {@link
* java.lang.Long#MAX_VALUE} will be returned.
*
* @return the maximum amount of memory that the virtual machine will
* attempt to use, measured in bytes
* @since 1.4
*/
public native long maxMemory();
  • max memory :

    VM이 사용하려고 시도한 최대 메모리 크기이다.
    VM option에서 최대로 할당 될 수 있는 메모리 크기인 mx 값을 지정한 경우 mx 값이라고 볼 수 있고
    만약 VM option에 mx 값을 설정하지 않았을 경우 메모리 사용이 많아진다면 변동이 생길 수 있다.

  • total memory :

    현재 할당되어 있는 메모리 크기로 메모리는 시작과 동시에 사용할 수 있는 최대 크기로 할당되지 않고 메모리를 사용하면서 점점 증가한다.

  • free memory :

    total memory에서 사용할 수 있는 메모리의 크기

그림으로 나타내면 위와 같다.

현재 할당 된 메모리에서의 free memory가 아닌 전체 free memory는 아래와 같이 간단한 계산을 통해 구할 수 있다.

1
2
used memory = total memory - free memory
total free memory = max memory - used memory = max memory - (total memory - free memory)

코드로 확인해 보자

아래와 같은 코드가 있을 때 설정을 바꿀 때마다 어떤 식으로 변하는지 보자.

1
2
3
4
5
6
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
System.out.println("max memory (G) : " + runtime.maxMemory() / (1024.0 * 1024 * 1024));
System.out.println("total memory (G) : " + runtime.totalMemory() / (1024.0 * 1024 * 1024));
System.out.println("free memory (G) : " + runtime.freeMemory() / (1024.0 * 1024 * 1024));
}
  1. 설정 X

    1
    2
    3
    max memory (G) : 5.298828125
    total memory (G) : 0.35791015625
    free memory (G) : 0.3541601225733757
  2. ms 설정 (-Xms128m)

    1
    2
    3
    max memory (G) : 5.298828125
    total memory (G) : 0.1201171875
    free memory (G) : 0.11757740378379822
  3. mx 설정 (-Xmx512m)

    1
    2
    3
    max memory (G) : 0.44482421875
    total memory (G) : 0.35791015625
    free memory (G) : 0.3541601225733757
  4. mx, ms 설정 (-Xms128m -Xmx512m)

    1
    2
    3
    max memory (G) : 0.44482421875
    total memory (G) : 0.1201171875
    free memory (G) : 0.11757740378379822
  5. mx, ms 동일하게 설정 (-Xms512m -Xmx512m)

    1
    2
    3
    max memory (G) : 0.4794921875
    total memory (G) : 0.4794921875
    free memory (G) : 0.47447261959314346

5의 결과를 확인 했을 때 최소 메모리 할당 크기가 최대 메모리 할당 크기와 같기 때문에 total emory와 max memory가 같다는 것을 확인할 수 있다.

참고 stackoverflow

Share