2012-10-17 4 views
2

Linux 서버에 verbose : gc on이라는 글래스 피시 서버가 있고 gc.log 파일에 출력이 있습니다.jvm verbosegc 로그 파일 문제

-XX:+PrintGCDetails 플래그를 사용합니다. 생성 된 파일은 다음과 같이 행이 포함 당신이 볼 수 있듯이

14.796: [GC [PSYoungGen: 432125K->45845K(454336K)] 537435K->153491K(624832K), 0.0304470 secs] [Times: user=0.12 sys=0.01, real=0.02 secs] 
15.337: [GC [PSYoungGen: 269819K->25031K(464768K)] 377465K->154113K(635264K), 0.0361400 secs] [Times: user=0.10 sys=0.01, real=0.03 secs] 
15.373: [Full GC (System) [PSYoungGen: 25031K->0K(464768K)] [PSOldGen: 129081K->123718K(170496K)] 154113K->123718K(635264K) [PSPermGen: 92038K->92038K(184384K)], 0.3855460 secs] 

는, 마지막 줄은 [Times: ...] 부분을 포함하지 않습니다.

14.796: [GC [PSYoungGen: 432125K->45845K(454336K)] 537435K->153491K(624832K), 0.0304470 secs] [Times: user=0.12 sys=0.01, real=0.02 secs] 
15.337: [GC [PSYoungGen: 269819K->25031K(464768K)] 377465K->154113K(635264K), 0.0361400 secs] [Times: user=0.10 sys=0.01, real=0.03 secs] 
15.373: [Full GC (System) [PSYoungGen: 25031K->0K(464768K)] [PSOldGen: 129081K->123718K(170496K)] 154113K->123718K(635264K) [PSPermGen: 92038K->92038K(184384K)], 0.3855460 secs] [Times: user=0.38 sys=0.01, real=0.39 secs] 
3617.352: [GC [PSYoungGen: 431872K->8052K(439936K)] 585800K->161981K(718144K), 0.0085710 secs] 
: 다음 GC 이벤트가 발생할 때, 이전 라인의 [Times: ...] 부분을 작성하고 다른 부분 라인이 작성되기 때문에 GC 이벤트 라인은 완전히처럼 우리에게 무언가를 제공, 로그 파일에 기록되지 않습니다 라인이 완료되지 않기 때문에

, 아니 캐리지 리턴이 존재하지 않기 때문에 선이 -XX:+PrintGC 플래그를 사용 multitail

같은 도구에 표시되지 않습니다, 우리는 더 이상이 문제를 가지고 있지 않습니다. 그러나 전체적인 세부 사항이 필요하므로 좋은 해결책은 아닙니다.

JVM 버전, 리눅스에서 실행 :

java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 

그래서 질문 :이 로그 라인 (플러시 트릭의 일종)를 작성하는 JVM을 강제 수 있습니까? 아니면 마지막 부분없이 GC 세부 사항을 가질 수 있습니까? 오픈 JDK에게이 -XX:+PrintGCDetails 보인다 6/7 소스를 확인

+0

동일한 문제 (Java 버전 "1.6.0_34")가 발생합니다. 주위 또는 실제 솔루션을 찾을 수 있었습니까? – pmac72

+0

아직 없습니다. 우리의 다음 단계는 1.7 JVM으로 시도하는 것인데, 아마도 3 개월 이내에 가능할 것입니다. – cporte

+0

1.7 업그레이드의 가능성은 내 상황에 꽤 멀지 만 문제가 해결되면 다시 게시하십시오. 1.7에 새로운 GC 로깅 기능/옵션이 있다는 것을 알고 있습니다. – pmac72

답변

2

TraceCPUTime::~TraceCPUTime() { 
    if (_active) { 
    bool valid = false; 
    if (!_error) { 
     double real_secs;     // walk clock time 
     double system_secs;    // system time 
     double user_secs;     // user time for all threads 

     double real_time, user_time, system_time; 
     valid = os::getTimesSecs(&real_time, &user_time, &system_time); 
     if (valid) { 

     user_secs = user_time - _starting_user_time; 
     system_secs = system_time - _starting_system_time; 
     real_secs = real_time - _starting_real_time; 

     _logfile->print(" [Times: user=%3.2f sys=%3.2f, real=%3.2f secs] ", 
      user_secs, system_secs, real_secs); 

     } else { 
     _logfile->print("[Invalid result in TraceCPUTime]"); 
     } 
    } else { 
     _logfile->print("[Error in TraceCPUTime]"); 
    } 
    if (_print_cr) { 
     _logfile->print_cr(""); 
    } 
    } 
} 

를 세척하지 않고는 오픈 JDK이 bug report-8 덕분에 고정합니다.

TraceCPUTime::~TraceCPUTime() { 
    if (_active) { 
    bool valid = false; 
    if (!_error) { 
     double real_secs;     // walk clock time 
     double system_secs;    // system time 
     double user_secs;     // user time for all threads 

     double real_time, user_time, system_time; 
     valid = os::getTimesSecs(&real_time, &user_time, &system_time); 
     if (valid) { 

     user_secs = user_time - _starting_user_time; 
     system_secs = system_time - _starting_system_time; 
     real_secs = real_time - _starting_real_time; 

     _logfile->print(" [Times: user=%3.2f sys=%3.2f, real=%3.2f secs] ", 
      user_secs, system_secs, real_secs); 

     } else { 
     _logfile->print("[Invalid result in TraceCPUTime]"); 
     } 
    } else { 
     _logfile->print("[Error in TraceCPUTime]"); 
    } 
    if (_print_cr) { 
     _logfile->print_cr(""); 
    } 
    _logfile->flush(); 
    } 
} 

누군가가 6/7에 대해 파일을 제출하면 어쩌면 백 포트가 발생합니다.

+0

좋은 답변입니다! 그것을 바탕으로 나는 다음을 확인하고 발견했다 : http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/rev/8e478700068f 그들은 JDK7로 백 포트 한 것 같다. 날짜를 기준으로 jdk7u12 또는 jdk7u13부터 사용할 수 있다고 말하고 있습니다. – cporte