>  기사  >  Java  >  Java 성능 최적화를 위한 일반적인 가비지 수집기는 무엇입니까?

Java 성능 최적화를 위한 일반적인 가비지 수집기는 무엇입니까?

王林
王林앞으로
2023-04-20 11:40:121165검색

일반적인 가비지 수집기 및 알고리즘

제가 제공한 다른 두 기사를 통해 가비지 수집기에 대해 많은 것을 배울 수 있다고 믿습니다. 우리가 정말로 주의를 기울여야 하고 심지어 사용할 수도 있는 가비지 수집기는 다음 네 가지 유형입니다:

직렬 직렬 가비지 수집기

클라이언트 유형의 가상 머신 또는 에 있는 경우 단일 코어가 있는 서버에서는 이 가비지 수집기가 기본 가비지 수집기가 됩니다. Minor GC이든 Full GC이든 모든 애플리케이션 스레드가 일시 중단됩니다. Serial Old는 단일 스레드 구세대 버전이기도 한 구세대에서 사용됩니다. client型的虚拟机或者在单核的服务器上,这种垃圾回收器将会成为默认的垃圾回收器。无论是Minor GC 还是 Full GC ,所有的应用线程都会暂停。在老年代当中使用的是Serial Old,同样是单线程的老年代版本。

client型虚拟机,我们前面提到过编译类型分为client和server,jvm会通过client编译器(单线程)将代码编译成jvm识别的字节码。

可以通过如下标志表示:

    -XX:+UseSerialGC

Parallel 多线程垃圾收集器

在server型虚拟机或多线程服务器上,jdk8默认使用的垃圾收集器类型。

无论是Minor GC还是Full GC都使用多线程的方式去回收垃圾,这两种GC都会造成应用线程的暂停。但是它具有更多的吞吐量,是对于响应时间没有过多要求情况下,最合适的垃圾回收器。

可以通过如下标志查看其状态:

年轻代:

-XX:+UseParallelGC

老年代:

-XX:+UseParallelOldGC

CMS 收集器

其设计初衷是为了减少serial和parallel收集器,在回收时造成的长时间的系统卡顿。

它在发生Minor GC时同样会暂停所有的应用线程,不同之处在于,年轻代使用的不是parallel或者serial,而是使用一款专门适用于CMS的年轻代收集器ParNew

可以通过下面的标志查看:

-XX:+UseParNewGC

CMS在发生Full GC时不再暂停全部应用线程,使用多线程的方式,和应用线程同时运行,清理不在使用的对象。这事得CMS垃圾收集器的停顿时间得到大大的降低。与Parellel收集器相比,极其明显。

缺点

  • CMS需要占用较多的CPU资源,确保在应用线程运行时,gc线程不断地扫描堆空间。

  • 不会对内存进行压缩整理,导致内存碎片化。

如果没有足够的CPU资源,或者内存碎片化达到极限,将会退化成serial收集器。

可以通过下面的标志查看:

-XX:+UseConcMarkSweepGC

G1 收集器

也可以称作垃圾优先收集器(garbage first)。

设计初衷是为了尽量减少处理超大堆(4gb)时发生的卡顿。G1仍然属于分代收集器,但是不同之处是它是逻辑分代

클라이언트 유형 가상 머신, 앞서 언급한 컴파일 유형은 클라이언트와 서버로 구분됩니다. jvm은 클라이언트 컴파일러(단일 스레드)를 통해 jvm이 인식하는 바이트코드로 코드를 컴파일합니다.

다음 플래그로 나타낼 수 있습니다:

-XX:+UseG1GC

병렬 다중 스레드 가비지 수집기

서버형 가상 머신이나 다중 스레드 서버에서 jdk8이 기본적으로 사용하는 가비지 수집기 유형입니다.

Minor GC와 Full GC는 모두 멀티스레딩을 사용하여 가비지를 수집합니다. 두 가지 유형의 GC 모두 애플리케이션 스레드를 일시 중지시킵니다. 그러나 처리량이 더 많고 응답 시간에 대한 과도한 요구 사항이 없을 때 가장 적합한 가비지 수집기입니다.

다음 기호를 통해 상태를 확인할 수 있습니다.

젊은 세대:

System.gc;

구 세대:

rrreeeCMS 컬렉터

재활용 시 직렬 및 병렬 컬렉터로 인해 발생하는 오랜 시간을 줄이기 위한 독창적인 디자인입니다. 시스템이 막혔습니다.
  • Minor GC가 발생하면 모든 애플리케이션 스레드가 일시 중지됩니다. 차이점은 Young Generation이 병렬 또는 직렬을 사용하지 않고 특히 CMS 코드에 적합한 Young Generation Collector를 사용한다는 것입니다.

  • 다음 로고로 확인할 수 있습니다.
  • rrreee

    CMS는 더 이상 Full GC 발생 시 모든 애플리케이션 스레드를 일시 중단하지 않습니다. 멀티스레딩을 사용하여 애플리케이션 스레드와 동시에 실행되고 더 이상 존재하지 않는 개체를 정리합니다. 사용. 이렇게 하면 CMS 가비지 수집기의 일시 중지 시간이 크게 줄어듭니다. Parallel 컬렉터에 비해 매우 분명합니다.

단점

: 🎜🎜🎜🎜CMS는 애플리케이션 스레드가 실행 중일 때 gc 스레드가 지속적으로 힙 공간을 검색하도록 더 많은 CPU 리소스를 점유해야 합니다. 🎜🎜🎜🎜 메모리를 압축하고 정리하지 않아 메모리 조각화가 발생합니다. 🎜🎜🎜🎜CPU 리소스가 부족하거나 메모리 조각화가 한계에 도달하면 직렬 수집기로 퇴화됩니다. 🎜🎜🎜다음 로고로 볼 수 있습니다: 🎜🎜rrreee🎜G1 Collector🎜🎜Garbage First Collector(가비지 우선)라고도 합니다. 🎜🎜원래 설계는 매우 큰 힙(4GB)을 처리할 때 발생하는 지연을 최소화하는 것입니다. G1은 여전히 ​​세대별 수집기에 속하지만 차이점은 논리적 세대입니다. G1은 힙 공간을 여러 영역(Regions)으로 나눕니다. 새로운 세대의 가비지 수집은 여전히 ​​모든 애플리케이션 스레드를 일시 중지하여 살아남은 개체를 이전 세대 또는 생존자 공간에 복사하는 방법을 사용합니다. Old Generation도 여러 영역으로 나누어져 있는데, G1 컬렉터는 한 영역에서 다른 영역으로 객체를 복사하여 정리 작업을 완료합니다. 이는 CMS의 메모리 조각화 문제를 해결합니다. 🎜🎜CMS와 마찬가지로 G1도 Old Generation에서 Full GC가 발생하면 애플리케이션 스레드를 일시 중지하지 않고 백그라운드 스레드가 재활용 작업을 완료합니다. 🎜🎜🎜다음 로고를 통해 확인하세요. 🎜🎜rrreee🎜사실 위 내용은 간단한 설명이므로 실제 구현 내용은 처음에 제공된 글을 참고해주세요. 🎜🎜명시적 가비지 수집🎜🎜🎜여기서 언급된 명시적 가비지 수집은 실제로 아래와 같이 수동으로 실행되는 가비지 수집을 나타냅니다. 🎜🎜rrreee🎜이것은 jvm이 gc Way를 강제하도록 허용하는 일종의 제어입니다. 언제든지 가비지 수집에 이 방법을 사용하지 않는 것이 좋습니다. 🎜🎜이 사양을 사용하면 CMS든 G1이든 어떤 종류의 가비지 컬렉터라도 Full GC가 발생하고 모든 애플리케이션 스레드가 동시에 중지되므로 오랜 시간 동안 지연이 발생합니다. 🎜🎜🎜예외: 🎜🎜🎜🎜🎜성능 분석, 테스트🎜🎜🎜🎜힙 분석🎜🎜🎜🎜위의 상황에서 System.gc를 호출하면 현재 애플리케이션의 문제를 분석하는 데 더 도움이 됩니다. 🎜

위 내용은 Java 성능 최적화를 위한 일반적인 가비지 수집기는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제