문제

이러한 두 가지 명령을

A:

$ java -Xms10G -Xmx10G myjavacode input.txt

B:

$ java -Xms5G -Xmx5G myjavacode input.txt

나는 두 개의 질문:

  1. 이 명령을 보유 더 많은 메모리를 가진 그것의 매개변수할 것보다 더 빠르게 실행 B?
  2. 어떻게 -Xmx-Xms 에 영향을 미치 프로세스를 실행 및 출력의 내 프로그램입니까?
도움이 되었습니까?

해결책

Java가 사용하는 GC에 따라 다릅니다. 병렬 GC는 더 큰 메모리 설정에서 더 잘 작동 할 수 있습니다. 저는 전문가가 아닙니다.

일반적으로 메모리가 클수록 GC -ED가 덜 빈번해야합니다. 쓰레기를위한 공간이 많이 있습니다. 그러나 GC와 관련하여 GC는 더 많은 메모리를 사용해야합니다. 이는 더 느릴 수 있습니다.

다른 팁

그만큼 -Xmx 인수는 힙이 JVM에 도달 할 수있는 최대 메모리 크기를 정의합니다. 당신은 당신의 프로그램을 잘 알고 그것을로드 아래에서 수행하는 방법을 확인하고 그에 따라이 매개 변수를 설정해야합니다. 낮은 값으로 인해 발생할 수 있습니다 OutofMemoryExceptions 또는 프로그램의 힙 메모리가 최대 힙 크기에 도달하는 경우 성능 저하가 매우 열악합니다. 프로그램이 전용 서버에서 실행중인 경우 다른 프로그램에 영향을 미치지 않기 때문에이 매개 변수를 더 높이 설정할 수 있습니다.

그만큼 -Xms 인수는 JVM의 초기 힙 메모리 크기를 설정합니다. 즉, 프로그램을 시작하면 JVM 이이 양의 메모리를 즉시 할당한다는 것을 의미합니다. 프로그램이 처음부터 많은 양의 힙 메모리를 소비하는 경우 유용합니다. 이것은 JVM이 힙을 지속적으로 증가시키는 것을 피하고 거기서 약간의 성능을 얻을 수 있습니다. 이 매개 변수가 도움이 될지 모른다면 사용하지 마십시오.

요약하면, 이것은 프로그램의 메모리 동작에만 기초하여 결정 해야하는 타협입니다.

어떤 경우에는 너무 많은 메모리가 프로그램 속도를 늦출 수 있음을 발견했습니다.

예를 들어 하중이 증가함에 따라 최대 절전 모드 기반 변환 엔진이 천천히 작동하기 시작했습니다. 우리가 DB에서 객체를 얻을 때마다, 최대 절전 모드는 다시는 사용되지 않을 객체에 대해 메모리를 점검하는 것이 밝혀졌습니다.

해결책은 세션에서 오래된 물건을 퇴거시키는 것이 었습니다.

스튜어트

  1. 할당 항에 따라 달라집니다.는 경우에 당신은 너무 많은 메모리를 할당할 수 있습을 로드된 부분으로 교환하는 참으로 느립니다.
  2. 여부를 당신의 프로그램을 실행하는 느린 또는 빠에 따라 참조 VM 을 처리하고 깨끗합니다.GC 하지 않을 통해 청소 할당된 메모리를 찾을 버려진 객체입니다.그것은 알고있는 그것은 개체와 금액의 메모리 할당 참조에 의해 매핑을 사용합니다.그래서 광범위 단지 크기에 따라 달라집합니다.하는 경우 프로그램으로 동작하는 같은 두 가지 경우 모두에서,유일한 성능에 미치는 영향에 있어야 VM 을 시작할 때,VM 시도를 할당하는 메모리에 의해 제공되는 OS 를 사용하는 경우에는 교환(는 리드 1.)

메모리 할당이 속도에 어떤 영향을 미치는지 말하기는 어렵습니다. JVM이 사용하는 쓰레기 수집 알고리즘에 따라 다릅니다. 예를 들어, 쓰레기 수집가가 전체 컬렉션을 수행하기 위해 잠시 멈추어야하는 경우, 실제로 필요한 것보다 10 개가 더 있으면 수집가에게는 10 개의 쓰레기를 청소할 수 있습니다.

Java 6을 사용하는 경우 JCONSOLE (JDK의 빈 디렉토리)을 사용하여 프로세스에 첨부하고 수집가의 작동 방식을 볼 수 있습니다. 일반적으로 수집기는 매우 똑똑하고 튜닝을 할 필요는 없지만 필요가있는 경우 수집 프로세스를 추가로 조정하는 데 사용되는 다양한 옵션이 있습니다.

> C:\java -X

-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                  set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                  append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                  prepend in front of bootstrap class path
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.

그만큼 -X 옵션은 비표준이며 통지없이 변경 될 수 있습니다.

(복사 붙여 넣기)

이것은 요청 당 대량의 스레드를 생성 한 응용 프로그램 중 하나에서 작업 할 때 항상 질문이었습니다.

그래서 이것은 정말 좋은 질문이며 이것의 두 가지 측면이 있습니다.
1. 내 XMS와 XMX 값이 동일 해야하는지
- 대부분의 웹 사이트와 심지어 Oracle Docs는 동일하다고 제안합니다. 그러나 갑작스런 트래픽 스파이크 또는 부수적 인 메모리 누출이 발생할 경우 힙에 응용 프로그램에 대한 옵션을 제공하기 위해 해당 값 사이에 10-20%의 버퍼를 갖는 것이 좋습니다.

2. 힙 크기가 낮아 응용 프로그램을 시작 해야하는지 여부
- 여기에 문제가 있습니다. GC 알고를 사용하더라도 (G1) 대형 힙에는 항상 트레이드 오프가 있습니다. 목표는 애플리케이션의 동작을 대기 시간 및 처리량 측면에서 GC를 일시 중지 할 수있는 힙 크기로 식별하는 것입니다.
- 예를 들어, 애플리케이션에 스레드가 많으면 (각 스레드에 1MB 스택이 1MB 스택이 있고 기본 메모리에 1MB 스택이 있고 힙에있는 경우) 객체 공간이 무거운 객체 공간을 차지하지 않으면 XMS의 값이 낮습니다.
- 응용 프로그램이 스레드 수가 증가한 많은 객체를 생성하는 경우 STW 일시 정지를 견딜 수 있도록 설정할 수있는 XM의 값을 식별하십시오. 즉, 수신 요청의 최대 응답 시간을 식별하고 최소 힙 크기를 조정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top