program tip

실행중인 가비지 수집기 유형 찾기

radiobox 2020. 12. 12. 10:23
반응형

실행중인 가비지 수집기 유형 찾기


Post JSE 5 인체 공학은 사용자에게 적합한 유형의 가비지 수집기를 자동으로 선택하기위한 것입니다.

가비지 수집기의 유형과 JVM 인체 공학에서 선택한 / 현재 설정 한 성능 목표를 확인 / 알 수있는 방법이 있는지 알고 싶습니다.


java -XX:+PrintCommandLineFlags -version

기본 가비지 수집기를 표시합니다. 또한 다양한 운영 체제에 대한 기본 가비지 수집기를 자세히 설명 하는 다음 페이지가 유용하다는 것을 알았습니다 .


import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;

public class GCInformation {

    public static void main(String[] args) {
            try {
                    List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();

                    for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
                            System.out.println(gcMxBean.getName());
                            System.out.println(gcMxBean.getObjectName());
                    }

            } catch (RuntimeException re) {
                    throw re;
            } catch (Exception exp) {
                    throw new RuntimeException(exp);
            }
    }
}

예를 들어 다양한 GC 유형을 알기 위해 다음 명령을 시도하십시오.

java -XX:+PrintCommandLineFlags  GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation

귀하의 질문에 대한 직접적인 대답은 아니지만 이것이 귀하가 찾고있는 것입니다.

Java 6 문서 12 에 따르면 (Java 5뿐만 아니라) :

참조 1 은 다음과 같이 말합니다.

서버 VM을 실행하는 서버급 시스템에서 GC (가비지 수집기)가 이전 직렬 수집기 [...]에서 병렬 수집기로 변경되었습니다.

참조 2 말한다 :

J2SE 5.0부터 응용 프로그램이 시작될 때 시작 관리자는 응용 프로그램이 "서버 클래스"시스템에서 실행 중인지 감지 할 수 있으며, 그렇다면 Java 대신 Java HotSpot 서버 가상 시스템 (서버 VM)을 사용할 수 있습니다. HotSpot 클라이언트 가상 머신 (클라이언트 VM).

또한 참조 2 는 다음과 같이 말합니다.

참고 : Java SE 6의 경우 서버 클래스 시스템의 정의는 최소 2 개의 CPU와 최소 2GB의 물리적 메모리가있는 시스템입니다.

이 정보를 통해 상자가 서버 ( 2 에 따라 ) 인 경우 병렬 GC를 사용하고 있음을 알 수 있습니다. 런타임 중에 GC를 변경하지 않을 것이라고 추론 할 수도 있습니다.

문서를 더 자세히 살펴보면 서버가 아닌 컴퓨터에 대한 올바른 답을 찾을 수 있습니다.


( Java <= 8 )

이 명령은 실행중인 JVM의 GC 유형을 인쇄합니다.

jmap -heap <pid> | grep GC

최신 컴퓨터 (다중 CPU, 대용량 메모리)의 경우 JVM은이를 서버 시스템으로 감지하고 Parallel GCJVM 플래그를 통해 명시 적으로 사용할 gc를 지정하지 않는 한 기본적으로 사용합니다.

예 :

jmap -heap 26806 | grep GC

산출:

8 개의 스레드가있는 병렬 GC


@Update-Java 9 이상용

( @JakeRobb 의 의견에 감사드립니다 .)

Java 9 이후이 질문과 관련된 두 가지 변경 사항이 있습니다.

  • Need to use jhsdb to attach to a java process or launch a debugger.
    Refer: jhsdb
  • The default gc is changed to G1.

Command format:

jhsdb jmap --heap --pid <pid> | grep GC

e.g

jhsdb jmap --heap --pid 17573 | grep GC

Output:

Garbage-First (G1) GC with 8 thread(s)


-XX:+PrintGC
-XX:+PrintGCDetails

This will print what GC is used. In my case it prints:

[GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

Which means that the Parallel Garbage collector is being used for the young generation. "Allocation Failure" means that garbage collection started because there were not enough space in young generation heap part.


Use the GarbageCollectorMXBeans to obtain MemoryPoolMXBeans.


Here's some info about how to programmatically get GC info, but it looks like it may need the name of the GC beforehand. Troublesome.

Edit: try ManagementFactory.getGarbageCollectorMXBeans() and iterate through the returned list. One of these will be active.


You can use -XX flag for JRE to choose the garbage collector of your choice.

Tuning Garbage Collection with the 5.0 Java TM Virtual Machine

Additionally, you can use JConsole to monitor garbage collection.

참고URL : https://stackoverflow.com/questions/5024959/find-which-type-of-garbage-collector-is-running

반응형