Java 가비지 콜렉션 로그 메시지


96

가비지 수집 정보를 로그에 덤프하도록 Java를 구성했습니다 ( verbose GC ). 로그의 가비지 수집 항목이 무엇을 의미하는지 잘 모르겠습니다. 이러한 항목의 샘플은 아래에 게시되어 있습니다. 나는 Google에서 주변을 검색했지만 확실한 설명을 찾지 못했습니다.

나는 몇 가지 합리적인 추측을 가지고 있지만 항목의 숫자가 의미하는 바에 대한 엄격한 정의를 제공하고 신뢰할 수있는 출처에 의해 뒷받침되는 답변을 찾고 있습니다. Sun 문서를 인용하는 모든 답변에 대한 자동 +1. 내 질문은 다음과 같습니다.

  1. PSYoungGen은 무엇을 의미합니까? 이전 (어린?) 세대와 관련이 있다고 생각하지만 정확히 무엇입니까?
  2. 두 번째 삼중 항 숫자와 첫 번째 숫자의 차이점은 무엇입니까?
  3. 이름 (PSYoungGen)이 두 번째가 아닌 첫 번째 세 개의 숫자에 지정된 이유는 무엇입니까?
  4. 삼중 항의 각 숫자 (메모리 크기)는 무엇을 의미합니까? 예를 들어 109884K-> 14201K (139904K)에서 GC 109884k 이전의 메모리는 14201K로 줄어 듭니다. 세 번째 숫자는 어떤 관련이 있습니까? 두 번째 숫자 세트가 필요한 이유는 무엇입니까?

8109.128 : [GC [PSYoungGen : 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0.0454530 초]

8112.111 : [GC [PSYoungGen : 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0.0934560 초]

8112.802 : [GC [PSYoungGen : 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0.0682690 초]


전체 힙, 힙의 젊은 세대 부분, gc 작동 방식에 대한 마이너 gc, 확인 예 : cubrid.org/blog/dev-platform/…
MarianP

답변:


90

대부분은 GC Tuning Guide에 설명되어 있습니다 (어쨌든 읽으면 좋을 것입니다).

명령 줄 옵션을 사용 -verbose:gc하면 힙 및 가비지 컬렉션에 대한 정보가 각 컬렉션에서 인쇄됩니다. 예를 들어, 다음은 대규모 서버 애플리케이션의 출력입니다.

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

여기서 우리는 두 개의 마이너 컬렉션과 하나의 메이저 컬렉션을 볼 수 있습니다. 화살표 앞뒤의 숫자 (예 : 325407K->83000K첫 번째 줄에서)는 각각 가비지 컬렉션 전후의 라이브 개체의 결합 된 크기를 나타냅니다. 부 수집 후 크기에는 가비지 (더 이상 살아 있지 않음)이지만 회수 할 수없는 일부 개체가 포함됩니다. 이러한 개체는 종신 세대에 포함되거나 종신 세대 또는 영구 세대에서 참조됩니다.

괄호 안의 다음 숫자 (예 : (776768K)첫 번째 줄에서 다시)는 힙의 커밋 된 크기입니다. 운영 체제에서 더 많은 메모리를 요청하지 않고 Java 객체에 사용할 수있는 공간의 양입니다. 주어진 시간에 하나만 사용할 수 있으므로이 수에는 생존자 공간 중 하나가 포함되지 않으며 가상 머신에서 사용하는 메타 데이터를 보유하는 영구 생성도 포함되지 않습니다.

라인의 마지막 항목 (예 0.2300771 secs:)은 수집을 수행하는 데 걸린 시간을 나타냅니다. 이 경우 약 1/4 초입니다.

세 번째 줄의 주요 컬렉션 형식은 비슷합니다.

에서 생성되는 출력 형식은 -verbose:gc향후 릴리스에서 변경 될 수 있습니다.

왜 당신의 PSYoungGen이 있는지 모르겠습니다. 가비지 수집기를 변경 했습니까?


gc 로그 파일은 어디에서 찾을 수 있습니까?
Mr Lou

7
이 답변은 원래 질문을 실제로 다루지 않습니다. 나는 michaeljoseph의 대답이 더 낫다고 느낍니다. Ethan이 묻는 질문을 해결하고 원래 예제를 더 잘 분석합니다. 그의 대답에는 두 가지 문제가 있지만 (그의 링크는 이제 죽었고 rafa.ferreria는 다른 하나를 지적했습니다) Oracle 문서를 역류시키는 것은 아닙니다.
Dirk

127
  1. PSYoungGen은 마이너 컬렉션에 사용중인 가비지 수집기를 나타냅니다. PS는 Parallel Scavenge를 나타냅니다.
  2. 첫 번째 숫자 세트는 젊은 세대의 이전 / 이후 크기이고 두 번째 세트는 전체 힙에 대한 것입니다. ( 가비지 컬렉션 문제 진단 은 형식을 자세히 설명합니다)
  3. 이름은 해당 세대와 수집기를 나타내며 두 ​​번째 집합은 전체 힙에 대한 것입니다.

연관된 전체 GC의 예는 이전 및 영구 세대에 사용 된 수집기를 보여줍니다.

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

마지막으로 예제 로그 출력의 한 줄을 세분화합니다.

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mb가 GC 이전에 사용, 14MB는 GC, 최대 젊은 세대의 크기 후에 사용 137Mb
  • 675Mb의 힙 GC, 이전에 사용 581Mb의 GC, 후에 사용 힙 의 1Gb 최대 힙 크기
  • 작은 GC 는 JVM 시작 이후 8109.128 초에 발생 했으며 0.04 초가 걸렸 습니다.

8
사소한 주석 일뿐입니다. '()'사이의 값은 최대 크기가 아니며, 영원히 최대 크기입니다. GC가 힙을 덜 해제 할 수없는 경우이 제한은 작동 시스템에 더 많은 공간이 필요하며이 값은 증가합니다. 물론 정의 된 한계를 존중합니다 : -Xmx
rafa.ferreira 2011 년

@ rafa.ferreira 나는 paranthesis 즉 1119040K의 값이 커밋 된 힙 크기라고 생각합니다. GC는 어디서나 '최대 힙'크기를 인쇄한다고 생각하지 않습니다. 참조 1참조 2
rohitmohta 2015 년

23

자세한 GC 로그를 얻을 수 있음을 언급하고 싶었습니다.

-XX:+PrintGCDetails 

매개 변수. 그러면 대답과 같이 PSYoungGen 또는 PSPermGen 출력이 표시됩니다.

또한 -Xloggc:gc.log동일한 출력을 생성하는 것처럼 보이지만 -verbose:gc첫 번째 출력 파일을 지정할 수 있습니다.

사용 예 :

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

데이터를 더 잘 시각화하려면 gcviewer 를 사용해 볼 수 있습니다 (최신 버전은 github 에서 찾을 수 있음 ).

매개 변수를 올바르게 작성하도록주의하십시오. "+"를 잊어 버렸습니다. 오류 메시지없이 JBoss가 시작되지 않습니다!


3
java가 다시 시작되면 gc.log를 덮어 씁니다 (예 : 메모리 문제가있어서 바람둥이를 다시 시작하고 gc.log를보고 싶은 경우). 또는 적어도 GC 로그를 회전하면 가능합니다. gc 로깅을 제어하는 ​​다른 많은 옵션이 있습니다. oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html을 참조하십시오 . 특히 고려하십시오-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.