힙 설정
-XMX3550M : JVM의 최대 힙 메모리를 3550m로 설정하십시오.
-XMS3550M : JVM의 초기 힙 메모리를 3550m로 설정하십시오. 이 값은 쓰레기 수집이 완료 될 때마다 JVM 재 할당 메모리를 피하기 위해 -xmx와 동일하게 설정할 수 있습니다.
-XSS128K : 각 스레드의 스택 크기를 설정하십시오. JDK5.0 이후, 각 스레드 스택 크기는 1m이며 그 전에는 각 스레드 스택 크기는 256K입니다. 응용 프로그램 스레드의 필수 메모리 크기에 따라 조정해야합니다. 동일한 물리적 메모리 에서이 값을 줄이면 더 많은 스레드가 생성 될 수 있습니다. 그러나 운영 체제는 여전히 프로세스의 스레드 수에 제한이 있으며 약 3000 ~ 5000 범위의 경험 값으로 무한히 생성 할 수 없습니다.
-XMN2G : 힙 메모리 젊은 세대 크기를 2G로 설정하십시오. 전체 힙 메모리 크기 = 젊은 세대 크기 + 구식 크기 + 영구 생성 크기. 영구 생성은 일반적으로 64m 크기가 고정되어 있으므로 젊은 세대를 늘린 후에는 구형 세대의 크기가 줄어 듭니다. 이 값은 시스템 성능에 큰 영향을 미치며 Sun은 공식적으로 전체 힙의 3/8로 구성을 권장합니다.
-xx : permsize = 256m : 힙 메모리 영구 생성의 초기 값을 256m로 설정하십시오. (Eclipse와 같은 IDE의 초기화 매개 변수 인 것 같습니다)
-xx : maxnewsize = size : 새로 생성 된 객체가 메모리를 점유 할 수있는 최대 값.
-xx : maxpermsize = 512m : 영구 생성의 최대 값을 512m로 설정하십시오.
-XX : Newratio = 4 : 힙 메모리 젊은 세대 (Eden 및 2 개의 생존자 영역 포함)의 비율을 힙 메모리 구식 (지속적인 세대 제외)으로 설정합니다. 4로 설정되면 젊은 세대 대 노인 세대의 비율은 1 : 4입니다.
-XX : Survivorratio = 4 : 젊은 세대의 힙 기억의 에덴 지역의 생존자 지역과의 비율을 설정합니다. 4로 설정된 2 개의 생존자 구역의 비율 (JVM 힙 메모리 젊은 세대는 기본적으로 2 개의 생존자 구역이 있습니다)과 하나의 Eden Zone은 2 : 4이고, 하나의 생존자 구역은 전체 세대의 1/6을 차지합니다.
-xx : maxtenuringthreshold = 7 : 구조 공간 (생존자 영역)에서 7 번 움직이면 노인에 물체가 배치되고 재활용되지 않은 것을 의미합니다.
0으로 설정되면, 젊은 세대 물체는 생존자 지역을 통과하지 않고 구식으로 직접 들어갑니다. 구식의 더 많은 응용을 위해서는 효율성을 향상시킬 수 있습니다.
이 값이 더 큰 값으로 설정되면, 젊은 세대 대상은 생존자 지역에서 여러 번 복사되어 젊은 세대의 물체의 생존 시간을 증가시키고 젊은 세대에서 물체가 재활용 될 확률을 높일 수 있습니다.
재활용기 선택
JVM은 직렬 수집기, 병렬 수집기 및 동시 수집기의 세 가지 옵션을 제공하지만 직렬 수집기는 작은 데이터 볼륨에만 적합하므로 여기에서 선택은 주로 병렬 수집기 및 동시 수집기를위한 것입니다.
기본적으로 JDK5.0은 이전에 일련의 수집기를 사용했습니다. 다른 수집기를 사용하려면 시작시 해당 매개 변수를 추가해야합니다. JDK5.0 이후 JVM은 현재 시스템 구성을 기반으로 지능적인 판단을 내릴 것입니다.
일련의 수집가
-xx :+useerialgc : 직렬 수집기를 설정합니다
병렬 수집기 (처리량 우선 순위)
-xx :+useparallelgc : 가비지 수집기를 병렬 수집기로 선택하십시오. 이 구성은 젊은 세대에만 유효합니다. 즉, 위의 구성 하에서 젊은 세대는 동시 컬렉션을 사용하는 반면, 구형 세대는 여전히 직렬 컬렉션을 사용합니다.
-xx : parallelgcthreads = 20 : 병렬 수집기의 스레드 수, 즉 동시에 수집되는 스레드 수를 구성합니다. 이 값은 프로세서 수와 동일하도록 가장 잘 구성됩니다.
-xx :+useparalleloldgc : 구식 쓰레기 수집 방법을 병렬 컬렉션으로 구성하십시오. JDK6.0은 이전 세대의 병렬 컬렉션을 지원합니다.
-xx : maxgcpausemillis = 100 : 각 젊은 세대 쓰레기 수집에 대한 최대 시간 (밀리 초)을 설정합니다. 이 시간을 충족 할 수 없다면 JVM은이 값을 충족시키기 위해 젊은 세대의 크기를 자동으로 조정합니다.
-xx :+useadaptivesizepolicy :이 옵션을 설정 한 후 병렬 수집기는 젊은 세대 영역의 크기와 해당 생존자 면적 비율을 자동으로 선택하여 대상 시스템에 의해 지정된 최소 응답 시간 또는 수집 주파수를 달성합니다.
이 매개 변수는 병렬 수집기를 사용할 때 켜는 것이 좋습니다.
동시 수집기 (응답 시간이 선호 됨)
-xx :+useparnewgc : 젊은 세대를 동시 컬렉션으로 설정하십시오. CMS 컬렉션과 동시에 사용할 수 있습니다. JDK5.0 이상, JVM은 시스템 구성에 따라 자체적으로 설정 하므로이 값을 다시 설정할 필요가 없습니다.
전체 이름 ConcurrentLowpausecollector 인 CMS는 JDK1.4의 이후 버전에 도입 된 새로운 GC 알고리즘입니다. JDK5 및 JDK6에서 더욱 개선되었습니다. 주요 적합한 시나리오는 응답 시간의 중요성이 처리량 요구 사항보다 크고, 쓰레기 수집 스레드 및 응용 프로그램 스레드를 공유하는 프로세서 리소스를 견딜 수 있으며 응용 프로그램에는 비교적 많은 장기간 개체가 있다는 것입니다. CMS는 지상의 재활용, 즉 노인의 재활용에 사용됩니다. 목표는 응용 프로그램 일시 중지 시간을 최소화하고, FullGC 발생 가능성을 줄이고, 응용 프로그램 스레드와 동시에 쓰레기 수집 스레드를 사용하여 노인을 표시하고 지우는 것입니다.
-XX :+USECONCMARKSWEEPGC : 구식을 동시 컬렉션으로 설정하십시오. 테스트에서 이것을 구성한 후 -xx : newratio = 4의 구성이 유효하지 않습니다. 따라서 현재 -xmn으로 젊은 세대의 크기를 설정하는 것이 가장 좋습니다.
-xx : cmsfullgcsbeforecompaction = : 동시 수집기가 메모리 공간을 압축하거나 구성하지 않으므로 일정 기간 동안 실행 한 후 "조각"이 생성되어 작동 효율이 줄어 듭니다. 이 매개 변수는 FullGC를 실행 한 후 메모리 공간을 압축하고 구성하도록 설정합니다.
-xx :+usecmscompactatfullcollection : 이전 세대의 압축을 켜십시오. 성능에 영향을 줄 수 있지만 메모리 조각화를 제거 할 수 있습니다.
-xx :+cmsincrementalMode : 증분 수집 모드로 설정합니다. 일반적으로 단일 CPU 상황에 적용됩니다.
-xx : cmsinitiationoccupancyfraction = 70 : 구식 공간이 70%에 도달하면 구식이 젊은 세대의 물체를 받아 들일 수있는 충분한 공간을 갖도록 CMS가 실행되기 시작 함을 의미합니다.
참고 : 두 개의 쓰레기 수집기 인 ThreasCollector 및 ConcurrentLowPauseCollector를 사용하는 경우 멀티 스레딩을 준비하려면 적절한 메모리 크기가 있어야합니다.
다른
-xx :+scavengebeforefullgc : 차세대 GC는 FullGC보다 우선합니다.
-xx : -disablexplicitgc : calling system.gc ()를 억제하지만 JVM의 GC는 여전히 유효합니다.
-xx :+maxfdlimit : 파일 설명자 수의 제한을 최대화합니다.
-xx :+usethreadpriorities : 로컬 스레드 우선 순위 API를 활성화합니다.
-xx : softreflupolicymspermb = 0 : "소프트 참조"객체는 마지막 액세스 후 0 밀리 초에서 살아남을 수 있습니다 (기본값은 1 초).
-XX : TargetSurvivorratio = 90 : 생존자 공간의 90%가 점유 될 수 있습니다 (기본값은 50%). 생존자의 사용률을 높이십시오 - 당신이 그것을 초과하면, 당신은 쓰레기 수집을 시도합니다.
보조 정보
-xx : -citime : 인쇄 JIT 컴파일에서 시간이 소비됩니다
-xx : errorfile =./hs_err_pid.log : 오류 로그 또는 데이터를 지정된 파일에 저장
-XX : -ExtendedDtraceProbes : Solaris 특이 적 DTRACE 프로브를 켭니다
-xx : heapdumppath =./java_pid.hprof : 힙 정보를 내보낼 때 경로 또는 파일 이름을 지정합니다.
-xx : -heapdumponoutofMemoryError : 메모리 오버 플로우가 처음 발생하는이 시점에서 힙에 관련 정보를 내보내십시오.
-xx : onerror = ";": 치명적인 오류가 나타나면 사용자 정의 명령을 실행하십시오
-XX : OnoutOfMemoryError = ";": 처음으로 메모리 오버플로를 만나면 사용자 정의 명령을 실행합니다.
-xx : -printclasshistogram : ctrl-break를 만나 후 클래스 인스턴스의 원주부 정보 인쇄 Jmap-Histo 함수와 동일합니다.
-XX : -PrintConcurrentLocks : Ctrl-Break를 만나 후 동시 잠금에 대한 관련 정보 인쇄 JSTACK-L 기능과 동일합니다.
-xx : -printcommandlineflags : 명령 줄에 나타나는 마크 인쇄
-XX :-프린트 컴파일 : 메소드가 컴파일 될 때 관련 정보를 인쇄합니다
-xx : -printgc : GC마다 관련 정보를 인쇄합니다
-xx : -printgcdetails : GC마다 세부 정보를 인쇄합니다
-xx : -printgctimestamps : 각 GC의 타임 스탬프를 인쇄하십시오
-xx : -traceclassloading : 클래스의로드 정보를 추적하십시오
-xx : -traceclassloadingpreorder : 참조 된 모든 클래스의 로딩 정보를 추적합니다.
-xx : -traceclassresolution : 상수 풀 추적
-xx : -traceclassunloading : 클래스 언로드 정보 추적
-xx : -traceloaderconstraints : 클래스 로더 제약 조건에 대한 관련 정보 추적
JVM 서비스 튜닝 연습
서버 : 8CUP, 8GMEM
예를 들어
Java-XMX3550M-XMS3550M-XSS128K-XX : Newratio = 4-xx : Survivorratio = 4-xx : maxpermsize = 16m-xx : maxtenuringthreshold = 0
조정 계획 :
-xmx5g : JVM의 최대 메모리를 5g로 설정하십시오.
-XMS5G : 초기 JVM 메모리를 5G로 설정하십시오. 이 값은 쓰레기 수집이 완료 될 때마다 JVM 재 할당 메모리를 피하기 위해 -xmx와 동일하게 설정할 수 있습니다.
-xmn2g : 젊은 세대의 크기를 2g로 설정하십시오. 전체 힙 메모리 크기 = 젊은 세대 크기 + 구식 크기 + 영구 생성 크기. 영구 생성은 일반적으로 64m 크기가 고정되어 있으므로 젊은 세대를 늘린 후에는 구형 세대의 크기가 줄어 듭니다. 이 값은 시스템 성능에 큰 영향을 미치며 Sun은 공식적으로 전체 힙의 3/8로 구성을 권장합니다.
-xx :+useparnewgc : 젊은 세대를 병렬 컬렉션으로 설정하십시오. CMS 컬렉션과 동시에 사용할 수 있습니다. JDK5.0 이상, JVM은 시스템 구성에 따라 자체적으로 설정 하므로이 값을 다시 설정할 필요가 없습니다.
-XX : ParallelGCTHREADS = 8 : 병렬 수집기를 구성 할 스레드 수, 즉 동시에 수집 된 스레드 수를 구성합니다. 이 값은 프로세서 수와 동일하도록 가장 잘 구성됩니다.
-xx : Survivorratio = 6 : 젊은 세대의 에덴 지역과 생존자 지역의 크기 비율을 설정합니다. 경험에 따르면, 두 생존자 구역과 하나의 에덴 구역의 비율은 2 : 6이고, 생존자 구역은 전체 세대의 1/8을 차지합니다.
-xx : maxtenuringthreshold = 30 : 쓰레기의 최대 연령 (횟수)을 설정합니다. 0으로 설정되면 젊은 세대 물체는 생존자 지역을 통과하지 않고 이전 세대에 직접 들어갑니다. 구식 세대의 더 많은 응용을 위해 효율성을 향상시킬 수 있습니다. 이 값이 더 큰 값으로 설정되면, 젊은 세대 물체는 생존자 지역에서 여러 번 복사하여 물체와 젊은 세대의 생존 시간을 증가시키고 젊은 세대에서 재활용 될 확률을 높일 수 있습니다. 30으로 설정하면 생존자 공간에서 30 번 이동하고 재활용되지 않은 경우 객체가 구식에 배치되어 있음을 의미합니다.
-XX :+USECONCMARKSWEEPGC : 구식을 동시 컬렉션으로 설정하십시오. 이 매개 변수를 테스트하고 구성하면 매개 변수 -xx : newratio = 4가 유효하지 않습니다. 따라서 -XMN으로 젊은 세대의 크기를 설정하는 것이 가장 좋으 므로이 매개 변수는 권장되지 않습니다.
참조 - JVM 힙 메모리 생성
가상 기계의 힙 메모리는 젊은 세대, 구세대 및 영구 세대의 세 가지 세대로 나뉩니다. 그 중에서도 지속적인 세대는 주로 Java 클래스 정보를 저장하는데, 이는 쓰레기 수집가가 수집 할 Java 객체와 거의 관련이 없습니다. 따라서 젊은 세대와 고령자 사이의 구분은 쓰레기 수집에 더 큰 영향을 미칩니다.
젊은 세대
새로 생성 된 모든 객체는 먼저 젊은 세대에 배치됩니다. 젊은 세대의 목표는 가능한 한 빨리 짧은 수명주기를 가진 물체를 수집하는 것입니다. 젊은 세대는 세 가지 영역으로 나뉩니다. 하나의 에덴 지역, 2 개의 생존자 지역 (일반적으로).
대부분의 객체는 에덴 지역에서 생성됩니다. 에덴 지역이 가득 차면 여전히 살아남은 물체는 생존자 지역 (둘 중 하나)에 복사됩니다. 하나의 생존자 지역이 가득 차면,이 지역의 생존 물체는 다른 생존자 지역으로 복사됩니다. 다른 생존자 지역도 가득 차면, 이전 생존자 지역에서 복사 한 물체는 여전히 "임기 지역"으로 복사됩니다.
두 생존자 지역은 대칭적이고 순서대로 관계가 없으므로 에덴 지역에서 복사 한 물체가있을 수 있으며 동시에 동일한 생존자 지역의 다른 생존자 지역에서 복사 된 물체가있을 수 있습니다. 그리고 기존 지역 (상대)에 복사 된 물체 만. 더욱이, 생존자 지역에는 항상 비어있는 하나가 있습니다. 특별한 경우, 프로그램 요구에 따라 생존자 영역은 다중 (2 개 이상)로 구성 될 수 있으며, 이는 젊은 세대의 물체 존재 시간을 증가시키고 구식 세대에 배치 될 가능성을 줄일 수 있습니다.
더 오래된 세대
젊은 세대의 N (구성 가능한) 쓰레기 수집 후에도 여전히 생존하는 물체는 구식 세대에 배치됩니다. 따라서 노인 사람들은 수명주기가 길어있는 물건을 저장하는 것으로 간주 될 수 있습니다.
지속적인 세대
Javaclass, Method 등과 같은 정적 데이터를 저장하는 데 사용되는 지속적인 생성은 쓰레기 수집에 큰 영향을 미치지 않지만 일부 응용 프로그램은 동적으로 동적으로 증가하는 유형을 저장하려면 상대적으로 큰 지속적인 생성 공간을 설정해야합니다. 영구 생성 크기는 -xx : maxpermsize =로 설정됩니다.
요약
위는 Java Virtual Machine (JVM Tuning) 최적화에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!