CGLIB 동적 프록시 개체 GC 문제 해결 | JD 클라우드 기술 팀

1. 문제가 발견된 경로

최근에는 개발이 완료된 후 새로운 시스템이 출시될 예정인데, 많은 양의 시스템 호출로 인해 코어 인터페이스에서 먼저 스트레스 테스트를 수행합니다. 코어 인터페이스는 기본적으로 순수한 메모리 작업만 수행하므로 핵심 인터페이스의 압력 테스트 QPS는 최대 수천 개가 될 수 있습니다.

압력 테스트 용기 구성: 4C8G

우선 동시성 10으로 시작해서 결과적으로 cpu는 100%까지 치솟지만 코어 인터페이스의 qps는 200 정도에 불과하다. 따라서 jvm의 가비지 컬렉션을 관찰한 결과 younggc는 매우 빈번하지만 fullGC의 수는 0입니다.

둘째, 자세한 문제 해결 프로세스

압력 테스트가 시작되자마자 컨테이너 cpu가 100%까지 치솟았기 때문에 cpu 사용량 문제를 먼저 찾아내고 cpu 사용량이 가장 많은 프로세스를 찾아야 합니다. top 명령을 사용하여 프로세스 ID를 찾고 스트레스 테스트의 Java 애플리케이션 프로세스 ID임을 확인한 다음 Jinchenxi의 CPU 사용률이 가장 높은 스레드를 찾으면 top -p 프로세스 ID를 사용할 수 있습니다. -H 이 프로세스 정보 아래에 스레드의 CPU 사용량을 표시하는 명령입니다.

top

top -p 进程ID -H

그림의 PID 열은 스레드 ID를 10진수로 표시한 다음 16진수로 변환한 후 jstack 시스템 프로세스 ID | grep 16진수 스레드 ID 명령을 통해 해당 스레드 정보를 찾습니다. 즉, 스레드가 절반 정도를 차지합니다. CPU의 .

jstack 系统进程ID | grep 16进制线程ID

이때 Finalizer 쓰레드가 있는데 이 쓰레드가 하는 일은 무엇일까요?

이 스레드는 java.lang.ref.Finalizer.ReferenceQueue에서 새 객체를 계속 반복하면서 대기합니다. Finalizer 스레드가 대기열에 새 객체가 나타난 것을 발견하면 객체를 팝하고 finalize() 메서드를 호출하고 Finalizer 클래스에서 참조를 제거하므로 다음 번에 GC가 다시 실행될 때 Finalizer 인스턴스와 참조된 개체는 가비지 수집될 수 있습니다. 이 스레드가 논스톱으로 작동했다면 Finalizer의 대기열에 GC를 기다리는 가비지 개체가 많다는 의미입니다. 이 시점에서 다른 명령을 사용하여 수집 대기 중인 가비지 개체를 확인할 수 있습니다.

jmap -finalizerinfo 进程ID
Count Class description
-------------------------------------------------------
32221 com.jd.price.deep.exact.entity.coupons.DeepExactCouponVo$$EnhancerByCGLIB$$200e6ee6
14908 com.jd.pricedoor.compute.promotion.MultiplePromotion$$EnhancerByCGLIB$$a59933de
11982 java.util.zip.Deflater
1 java.net.SocksSocketImpl

위의 결과를 통해 비즈니스 객체가 많다는 것을 알 수 있으며, 클래스 이름에서 이러한 객체는 CGLIB 동적 프록시에 의해 생성되고 이러한 동적 프록시 클래스는 기본적으로 finalize 메서드를 구현하므로 이러한 객체는 반드시 먼저 가비지 수집됩니다. finalize 메서드를 실행하여 종료자의 대기열에 백로그됩니다.

3. 문제 해결 방법

위의 조사 과정을 통해 다수의 비즈니스 객체가 CGLIB를 통해 동적 프록시 클래스를 생성하고 이러한 프록시는 시스템에서 요청을 처리할 때 생성되는 임시 객체이며 요청이 완료된 후 이러한 임시 객체를 가비지 수집해야 함을 알 수 있습니다. 결과적으로 종료자 스레드 실행이 CPU 리소스를 자주 점유합니다.

위의 분석 결과에 따르면 다음과 같은 몇 가지 솔루션이 있습니다.

1. 빈번한 가비지 수집이 필요한 객체에 대해 CGLIB를 사용하여 동적 프록시를 생성하지 마십시오.수동으로 정적 프록시 클래스를 생성할 수 있습니다.

2. 객체 재사용, 임시 객체 생성 최소화.

저자: Jingdong Retail Cao Zhifei

출처: JD 클라우드 개발자 커뮤니티

MyBatis-Flex 표절에 대한 해명 MyBatis-Plus Arc 브라우저 공식 출시 1.0, Chrome 대체 OpenAI 공식 출시 Android 버전 ChatGPT VS Code 최적화 이름 난독화 압축, 내장 JS 20% 감소! LK-99: 최초의 실온 및 압력 초전도체? 머스크는 "제로위안으로 구입"하고 @x 트위터 계정을 털었다. 파이썬 운영위원회는 PEP 703 제안을 받아들여 글로벌 인터프리터 잠금을 선택 사항으로 만들 계획이다 .시스템의 오픈 소스 및 무료 패킷 캡처 소프트웨어 방문 횟수 스택 오버플로 크게 떨어졌고 Musk는 LLM으로 대체되었다고 말했습니다.
{{o.이름}}
{{이름}}

Acho que você gosta

Origin my.oschina.net/u/4090830/blog/10092153
Recomendado
Clasificación