developer tip

JVM 힙 매개 변수

copycodes 2020. 11. 21. 10:29
반응형

JVM 힙 매개 변수


주제에 대한 질문과 많은 인터넷 검색을 읽은 후에도 여전히 -Xms 옵션을 명확하게 볼 수 없습니다.

내 질문은 : java -Xms=512m -Xmx=512m의 차이점은 무엇 java -Xms=64m -Xmx=512m입니까?

지금은 다음과 같은 대답이 있습니다.

유일한 차이점은 내 응용 프로그램이 실행되는 동안 실행될 가비지 수집 수와 메모리 할당 수입니다. 내가 맞아?

이 답변에 대한 이유는 다음과 같습니다.

설정 -Xms옵션은합니다 512m정말 사용하여 내 응용 프로그램에서 발생하지 않습니다 512M시작 후 실제 메모리. 나는 이것이 최신 OS 가상 메모리 관리 및 지연 페이지 할당과 관련이 있다고 생각합니다. ( 또는 to의 설정 -XmsLinux의 top 또는 Windows의 작업 관리자가보고 한 초기 사용 메모리를 전혀 변경하지 않음 확인했습니다 )512M64M

누군가가이 Xms옵션 의 영향을 이해하도록 도와 주거나 이해하는 데 도움이 되는 링크를 알려줄 수 있습니까?

미리 감사드립니다

마누


링크 뒤에있는 정보를 요약하면 JVM은 -Xms로 지정된 양을 할당하지만 OS는 일반적으로 필요할 때까지 실제 페이지를 할당하지 않습니다. 따라서 JVM은 Xms에 지정된대로 가상 메모리를 할당하지만 필요한 경우에만 실제 메모리를 할당합니다.

Windows의 작업 관리자 대신 Sysinternals의 Process Explorer를 사용하여이를 확인할 수 있습니다.

따라서 -Xms64M과 -Xms512M을 사용하는 것에는 실제 차이가 있습니다. 그러나 가장 중요한 차이점은 이미 지적한 것입니다. 512MB가 정말로 필요하지만 64MB로만 시작하면 가비지 수집기가 더 자주 실행됩니다.


JVM은 초기 힙 수준에서 메모리 사용량으로 시작됩니다. maxheap이 더 높으면 메모리 요구 사항이 현재 메모리를 초과하므로 maxheap 크기로 커집니다.

그래서,

  • -Xms512m -Xmx512m

JVM은 512M으로 시작하며 크기가 조정되지 않습니다.

  • -Xms64m -Xmx512m

JVM은 64M으로 시작하여 mem 인 경우 최대 512 개까지 증가합니다. 요구 사항은 64를 초과합니다.


외에도 표준 힙 매개 변수에서 -Xms-Xmx또한 알고 좋은 -XX:PermSize-XX:MaxPermSize당신이 당신의 파마 세대 공간이 가득 차면 당신은 메모리가 부족할 수 있습니다 힙 다른 세대의 공간을 가질 수있다하더라도 때문에 파마 세대 공간의 크기를 지정하는 데 사용됩니다. 이 링크는 또한 몇 가지 중요한 JVM 매개 변수에 대한 멋진 개요를 제공 합니다.


JVM은 힙 크기를 적절하게 조정합니다. 즉, 애플리케이션에 가장 적합한 힙 크기를 찾으려고 시도합니다. -Xms 및 -Xmx는 단순히 JVM이 힙을 작동하고 크기를 조정할 수있는 범위를 지정합니다. -Xms와 -Xmx가 같은 값이면 JVM의 힙 크기는 해당 값에서 일정하게 유지됩니다.

JVM 시작시 JVM에 큰 힙을 제공해야하는 특별한 이유가없는 한 일반적으로 -Xmx를 설정하고 JVM이 최상의 힙 크기를 찾도록하는 것이 가장 좋습니다.

JVM이 실제로 OS에서 메모리를 요청하는 한 JVM의 플랫폼과 구현에 달려 있다고 생각합니다. 앱에 실제로 필요할 때까지 메모리를 요청하지 않을 것이라고 생각합니다. -Xmx 및 -Xms는 메모리 만 예약합니다.


당신이 쓴 경우 : -Xms512m -Xmx512m 시작할 때 자바는 그 순간에 512m의 램을 자신의 프로세스에 할당하고 증가시킬 수 없습니다.

-Xms64m -Xmx512m 시작하면 java는 자신의 프로세스에 64m의 램만 할당하지만 Java는 512m 동안 메모리 점유를 증가시킬 수 있습니다.

두 번째는 자바에 자동 메모리 관리를 제공하기 때문에 더 낫다고 생각합니다.


나는이 장난감 예제를 만들어 scala, my_file.scala:

object MyObject {

    def main(args: Array[String]) {
        var ab = ArrayBuffer.empty[Int]

        for (i <- 0 to 100 * 1000 * 1000) {
            ab += i
            if (i % 10000 == 0) {
                println("On : %s".format(i))
            }
        }
    }
}

나는 그것을 실행했다 :

scala -J-Xms500m -J-Xmx7g my_file.scala

scala -J-Xms7g -J-Xmx7g my_file.scala

-Xms500m버전 에는 확실히 눈에 띄는 일시 중지가 있습니다. 짧은 일시 중지는 가비지 수집 실행이고 긴 일시 중지는 힙 할당이라는 점을 확신합니다.

참고 URL : https://stackoverflow.com/questions/1098488/jvm-heap-parameters

반응형