Java 성능 최적화 및 프로파일 링 기술
성능 분석 도구를 사용하여 병목 현상을 찾고 개발 및 테스트 단계에서 VisualVM 또는 JProfiler를 사용하며 생산 환경에서 Async-Profiler에 우선 순위를 부여합니다. 2. 객체 생성을 줄이고, 개체를 재사용하고, StringBuilder를 사용하여 문자열 스 플라이 싱을 교체하고, 적절한 GC 전략을 선택하십시오. 3. 장면에 따라 수집 사용을 최적화하고 초기 용량을 선택하고 사전 설정합니다. 4. 동시성 최적화, 동시 컬렉션을 사용하고, 잠금 세분화를 줄이고, 스레드 풀을 합리적으로 설정하십시오. 5. JVM 매개 변수 조정, 합리적인 힙 크기 및 저도 가비지 수집기를 설정하고 GC 로그를 활성화합니다. 6. 코드 레벨에서 반사를 피하고, 래퍼 클래스를 기본 유형으로 바꾸고, 초기화를 지연시키고, 최종 및 정적을 사용하십시오. 7. JMH MicroBenchmark 테스트 및 APM 도구와 결합 된 지속적인 성능 테스트 및 모니터링, 로그 및 덤프 파일을 정기적으로 분석합니다. Java 성능 최적화를 먼저 측정 한 다음 최적화해야하며 시스템 성능을 효과적으로 향상시키기 위해 도구와 방법이 정확합니다.
Java 성능 최적화 및 성능 분석은 응용 프로그램 응답 속도를 개선하고 자원 소비를 줄이며 시스템 안정성을 보장하기위한 핵심 링크입니다. 특히 동시성이 높고 데이터 볼륨이 큰 시나리오에서 합리적인 최적화 전략은 시스템 성능을 크게 향상시킬 수 있습니다. 다음은 몇 가지 핵심 Java 성능 최적화 방향과 일반적으로 사용되는 성능 분석 기술입니다.

1. Positioning Posiparing Performance 병목 현상 : 성능 분석 도구 (프로파일 링 도구) 사용
최적화하기 전에 병목 현상을 먼저 배치해야합니다. 맹인 최적화는 종종 두 배의 노력으로 절반이 발생합니다. 일반적으로 사용되는 Java 성능 분석 도구는 다음과 같습니다.
-
jvisualvm / visualvm
무료, 경량, JDK에 통합. CPU 및 메모리 사용을 모니터링하고 스레드 분석 및 힙 덤프 분석을 수행 할 수 있으며, 이는 예비 조사에 적합합니다. Jprofiler
상업용 도구, 강력한 기능, 지원 CPU 샘플링, 메모리 분석, 스레드 교착 상태 감지, I/O 모니터링 등은 우호적 인 그래픽 인터페이스를 가지고 있습니다.-
Yourkit
또 다른 상용 성능 분석기는 생산 환경 샘플링에 적합한 원격 모니터링 및 메소드 수준 성능 추적을 지원합니다. 비동기 프로파일러
샘플링을 기반으로 한 오픈 소스, 저지대 Linux 성능 분석 도구는 CPU, 메모리 할당 및 잠금 경쟁 분석을 지원하며, 이는 생산 환경에서 특히 사용하기에 적합합니다.
권장 사항 : 개발 및 테스트 단계에서 VisualVM 또는 JProfiler를 사용합니다. 시스템에 과도한 부담을 피하기 위해 생산 환경에서 비동기 프로파일러를 우선 순위를 정하십시오.
2. 주요 최적화 방향
(1) 객체 생성 및 GC 압력을 줄입니다
자주 객체 생성은 쓰레기 수거 (GC)의 부담을 증가시켜 일시 중지 시간이 증가합니다.
최적화 제안 :
- 객체 풀 (예 :
ThreadLocal
Cache, Custom Pool)을 사용하여 개체를 재사용합니다 (짧은 수명주기 및 빈번한 생성이있는 개체에 적합). - 루프에서 임시 객체를 만드는 것을 피하십시오.
- 문자열 스티칭 대신
StringBuilder
사용하십시오 (특히 루프에서). - 일시 중지 시간을 줄이려면 적절한 GC 전략 (예 : G1, ZGC, Shenandoah)을 선택하십시오.
// 문자열 쓰기를 피하십시오. 결과 = ""; for (문자열 s : list) { 결과 = s; // 매번 새 문자열 객체 생성} // StringBuilder SB = New StringBuilder ()로 변경합니다. for (문자열 s : list) { sb.append (들); }
(2) 수집 사용을 최적화하십시오
컬렉션은 Java에서 가장 일반적으로 사용되는 구조이며 부적절한 사용으로 인해 성능 문제가 발생할 수 있습니다.
제안:
- 장면에 따라 적절한 수집 유형을 선택하십시오.
-
ArrayList
임의의 액세스에 적합하며LinkedList
중간 요소를 자주 개입/삭제할 때만 사용됩니다. -
HashMap
빠르게 보이지만 용량 확장을 자주 피하기 위해 초기 용량 및로드 계수에주의를 기울입니다.
-
- 동적 확장의 오버 헤드를 줄이기 위해 세트의 초기 용량을 사전 설정하십시오.
List <string> list = new ArrayList <> (1000); 지도 <문자열, 정수>지도 = New Hashmap <> (512);
(3) 동시성 및 스레드 최적화
멀티 스레드 프로그래밍에서 잠금 경쟁 및 컨텍스트 스위칭은 일반적인 성능 킬러입니다.
최적화 제안 :
- 동시 래퍼 클래스 대신 Concurrent Collection (
ConcurrentHashMap
,CopyOnWriteArrayList
등)을 사용하십시오. - 잠금 과립성을 줄이고 잠금 내에서 시간이 많이 걸리는 작업 (예 : I/O)을 피하십시오.
- 자물쇠가없는 구조 (예 :
AtomicInteger
,LongAdder
) 사용을 고려하십시오. - 너무 많은 스레드로 인한 컨텍스트 전환의 오버 헤드를 피하기 위해 스레드 풀 크기를 합리적으로 설정하십시오.
// CPU 집약적 : 스레드 수 ≈ CPU 코어 수 // I/O 집약적 : 실의 수는 적절하게 증가 할 수 있습니다. ExecutorService Executor = Executors.NewFixedThreadPool (runtime.getRuntime ().
(4) JVM 매개 변수 튜닝
합리적인 JVM 매개 변수 설정은 성능에 중요합니다.
주요 매개 변수 제안 :
- 힙 크기 :
-Xms
및-Xmx
동적 확장을 피하기 위해 동일한 값으로 설정됩니다. - 오른쪽 쓰레기 수집가를 선택하십시오.
- G1GC : 낮은 대기 시간을 추구하는 큰 더미 (4G 이상)에 적합합니다.
- ZGC/SHENANDOAH : 지연에 민감한 응용 분야 (JDK 11/12)에 적합한 초경량 일시 정지 (<10ms).
- 쉬운 분석을 위해 GC 로그를 활성화하십시오.
-xlog : gc*, gc heap = debug, gc compaction = info : file = gc.log : 시간, 태그
3. 코드 레벨 성능 기술
반사의 과도한 사용
반사 성능이 낮고 최적화하기 어렵습니다. 필요한 경우Method
개체를 캐시하거나MethodHandle
사용할 수 있습니다.기본 유형을 사용하여 포장 클래스
를 대체하십시오 컬렉션에서int
사용하는 것이Integer
보다 낫고IntStream
또는fastutil
과 같은 타사 라이브러리를 통해 지원할 수 있습니다.초기화 및 게으른 하중이 지연
대형 물체 또는 시간 소모적 인 작업의 경우Supplier
또는 이중 점검 잠금 장치를 사용하여 게으른 하중을 달성하십시오.final
및static
사용한 최적화
JVM은final
필드 및 정적 방법에 대한 인라인 최적화 기회가 더 좋습니다.
4. 성능 테스트 및 모니터링
최적화는 일회성이 아니며 지속적인 모니터링 및 검증이 필요합니다.
- JMH (Java MicroBenchmark 하네스)를 사용하여 잘못된 성능 측정을 피하기 위해 MicroBenchmark 테스트를 수행하십시오.
- 생산 환경에서 실시간 모니터링을 위해 APM 도구 (예 : Skywalking, Pinpoint, New Relic)를 통합합니다.
- GC 로그, 스레드 덤프 및 힙 덤프를 정기적으로 분석하십시오.
기본적으로 그게 다야. Java 성능 최적화는 "마법"이 아니라 "과학": 먼저 측정 한 다음 최적화하십시오. 병목 현상을 먼저 한 다음 세부 사항 . 도구가 올바르게 사용되면 방향은 반으로됩니다.
위 내용은 Java 성능 최적화 및 프로파일 링 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

먼저, CheckifTefnKeysettingISTINGINTERINGITERINGBOTHOLMEKEYALONEANDFN VOLUMEKEY, thentogglefnlockwithfn escifavailable.2. enterbios/uefiduringbootandenablefunctekysordisordablehotkeymodetoensurevolumeysarerecognized.3.updateOrreeinstalliodriv

TestHepdFinanotherAppTodeMineifTheissueiswithTheFileoredge.2

BreakexitsTheloopimmed SeeforFindingAtArget, 이상적으로 THEFIRSTMATCH.2.ContInuesKIPSTheCurrentitation, 유용한 ortipilteringItemSliketemporaryFiles.3.gotoJumpStoalabeledStatement, 허용 가능한 원형 곡물 류 횡단 부산물

OS/EXEC 패키지를 사용하여 하위 프로세스를 실행하고 Exec.Command를 통해 명령을 작성하되 즉시 실행하지 마십시오. 2. .output ()로 명령을 실행하고 stdout을 잡으십시오. 종료 코드가 0이 아닌 경우 exec.exiterror를 반환하십시오. 3. .start ()를 사용하여 차단하지 않고 프로세스를 시작하고 .stdoutpipe ()와 결합하여 출력을 실시간으로 스트리밍하십시오. . 5. exec.exiterror는 좀비 프로세스를 피하기 위해 실패한 명령의 종료 코드와 STDERR을 얻으려면 처리되어야합니다.

방법 과부하 및 메소드 과부하는 Java에서 다형성을 구현하기위한 두 가지 메커니즘입니다. 1. 메소드 과부하는 같은 클래스에서 발생합니다. 컴파일 타임 다형성에 속하는 동일한 메소드 이름이지만 매개 변수 목록 (숫자, 유형 또는 순서)이 필요합니다. 리턴 유형은 다를 수 있지만 반환 유형만으로는 과부하 할 수 없습니다. 다른 액세스 수정 자 및 예외 선언이있을 수 있습니다. 2. 방법 재 작성은 상속 관계에서 발생합니다. 서브 클래스는 부모 클래스의 기존 메소드의 특정 구현을 제공합니다. 동일한 방법 서명이 필요하며 리턴 유형은 호환됩니다. 액세스 수정자는 더 엄격 할 수 없습니다. 그것은 런타임 다형성에 속합니다. 인스턴스 방법을 사용해야하며 @override 주석을 통해 올바른 다시 쓰기를 보장 할 수 있습니다. 두 사람은 함께 코드 가독성과 확장 성을 향상시킵니다.

중첩 된 Foreach 루프를 최적화하려면 먼저 중복 반복을 피해야하며 시간 복잡성을 O (n × M)에서 O (N M)로 감소시킬 수 있습니다. 둘째, 구조가 진정으로 계층 적이 아닌 경우 SelectMany와 같은 방법을 사용하여 데이터를 평평하게해야합니다. 셋째, 조건부 판단을 통해 미리 뛰어 다니거나 불필요한 처리를 건너 뛰십시오. 넷째, 검색 효율을 향상시키기 위해 사전 또는 해시 세트와 같은 적절한 데이터 구조를 선택하십시오. 다섯째, 작업이 독립적이고 시간이 많이 걸릴 때 평행을 사용하여 사용할 수 있습니다. 여섯째, 복잡한 논리를 독립적 인 방법 또는 쿼리로 추출하여 가독성과 유지 가능성을 향상시킵니다. 최적화의 핵심은 복잡성을 줄이고 데이터를 합리적으로 구성하며 항상 중첩의 필요성을 평가하고 궁극적으로 효율적이고 명확하며 확장 가능한 코드를 달성하는 것입니다.

usespecificexceptionsinsteadofgenericonesto handledifferenterRorconditionspreproprepressandavoidmaskingUnintenderDerrors.2.neverignoreCaughtexceptions; AlwaysLogorre-throwthem, andDocumentIntintentionalIngoreswithcomments.3.validateinputsearlyAndfailSfastByth

컨테이너화 된 Java 응용 프로그램 : Dockerfile 생성, Eclipse-Temurin : 17-Jre-Alpine과 같은 기본 이미지를 사용하고 JAR 파일을 복사하고 시작 명령을 정의하고 DockerBuild를 통해 이미지를 빌드하고 Dockerrun과 함께 로컬로 실행하십시오. 2. 이미지를 컨테이너 레지스트리로 푸시하십시오. Dockertag를 사용하여 이미지를 표시하고 DockerHub 및 기타 레지스트리로 푸시하십시오. 먼저 dockerlogin에 로그인해야합니다. 3. Kubernetes에 배포 : 쓰기 배포 .yaml 배포를 정의하려면 복제본, 컨테이너 이미지 및 리소스 제한 수를 설정하고 Service.yaml을 작성하여 작성하십시오.
