목차
스택에서의 할당" >스택에서의 할당
스칼라 대체" >스칼라 대체
Java java지도 시간 3분 만에 JVM 이스케이프 분석 이해

3분 만에 JVM 이스케이프 분석 이해

Aug 15, 2023 pm 04:39 PM
jvm

자격을 갖춘 Java 개발자로서 우리 모두는 기본적으로 모든 객체가 힙에 생성된다는 것을 알고 있습니다. 그러나 여기에는 아직 절대적인 단어가 없으며 기본적으로 모든 것을 의미합니다.

어제 인터뷰 중 친구가 모든 객체는 힙에서 생성된다고 말하며 면접관을 비웃었습니다.

오늘은 본문을 시작으로 탈출 분석에 대해 이야기해 보겠습니다.

Escape Analysis(Escape Analysis)는 현재 Java 가상 머신에서 비교적 최첨단 최적화 기술입니다. 이는 Java 프로그램의 동기화 부하 및 메모리 힙 할당 부담을 효과적으로 줄일 수 있는 교차 기능 전역 데이터 흐름 분석 알고리즘입니다. Java Hotspot 컴파일러는 이스케이프 분석을 통해 새 개체 참조의 사용 범위를 분석하고 이 개체를 힙에 할당할지 여부를 결정할 수 있습니다.

이스케이프 분석의 기본 원칙은 : 객체의 동적 범위를 분석하는 것입니다. 객체가 메소드에 정의되면 호출 매개변수로 다른 메소드에 전달되는 등 외부 메소드에 의해 참조될 수 있습니다. 메소드 이스케이프는 다른 스레드에서 액세스할 수 있는 인스턴스 변수에 할당하는 것과 같이 외부 스레드에 의해 액세스될 수도 있습니다. 높은 수준의 탈출.

이스케이프 분석이 켜져 있으면 컴파일러는 다음과 같이 코드를 최적화할 수 있습니다:

  1. 동기 제거: 이스케이프 분석을 통해 하나의 스레드에서만 액세스할 수 있는 개체가 발견된 경우 이 개체에 대한 작업은 다음과 같이 수행될 수 있습니다. 비동기.
  2. 스택에서의 할당: 객체가 스레드에서 탈출하지 못할 것이 확실하다면 스택에서 이 객체에 대한 메모리를 할당하는 것이 매우 좋은 생각입니다. 스택 프레임과 함께 파괴됩니다.
  3. 스칼라 대체: 이스케이프 분석을 통해 외부 메소드에서 접근할 수 없는 객체가 발견되고 이 객체를 해체할 수 있는 경우 프로그램이 실제로 실행될 때 이 객체를 생성하지 않고 직접 여러 개 생성할 수 있습니다. . 이 방법은 대신 멤버 변수를 사용합니다. 객체를 분할한 후 객체의 멤버 변수를 스택에 할당하고 읽고 쓸 수 있습니다.

JVM에서는 다음 매개변수를 통해 이스케이프 분석 활성화 여부를 지정할 수 있습니다.

-XX:+DoEscapeAnalytic: 이스케이프 분석이 켜져 있음을 나타냅니다(JDK 1.7 이후에는 기본적으로 켜져 있음). -XX:+DoEscapeAnalysis :表示开启逃逸分析(JDK 1.7之后默认开启)。

-XX:-DoEscapeAnalysis

-XX:-DoEscapeAnalytic: 나타냄 탈출 분석을 끄십시오. 🎜

동기화 제거

스레드 동기화 자체는 상대적으로 시간이 많이 걸리는 프로세스입니다. 이스케이프 분석을 통해 변수가 스레드를 탈출하지 않고 다른 스레드에서 액세스할 수 없다고 판단하면 읽기 및 쓰기가 전혀 발생하지 않습니다. 경쟁이 발생하면 이 변수에 구현된 동기화 조치를 안전하게 제거할 수 있습니다.

다음 코드는

public void method() {
    Object o = new Object();
    synchronized (o) {
        System.out.println(o);
    }
}
로그인 후 복사

잠금对象o이지만 객체 o의 수명 주기는 method() 메서드와 동일하므로 다른 스레드에서 액세스할 수 없으며 스레드 안전 문제가 발생하지 않습니다. JIT 컴파일 단계에서 차단됩니다. 다음과 같이 최적화되었습니다.

public void method() {
    Object o = new Object();
    System.out.println(o);
}
로그인 후 복사

이를 Lock Elimination이라고도 합니다.

스택에서의 할당

Java 가상 머신에서 Java 힙에 생성된 객체에 대한 메모리 공간을 할당하는 것은 Java 프로그래머에게 거의 상식입니다. 이 객체에 대한 참조를 보유하고 있는 한 힙에 저장된 객체 데이터에 액세스할 수 있습니다. 가상 머신의 가비지 수집 하위 시스템은 더 이상 힙에서 사용되지 않는 개체를 재활용하지만, 재활용 가능한 개체를 표시하고 필터링하거나 메모리를 재활용하고 구성하는 재활용 작업에는 많은 리소스가 필요합니다. 그러나 특별한 경우가 있습니다. 이스케이프 분석을 통해 개체가 스레드 외부로 이스케이프되지 않는 것으로 확인되면 스택에 할당하도록 최적화될 수 있습니다. 이렇게 하면 힙에 메모리를 할당할 필요가 없고 가비지 수집도 필요하지 않습니다.

다음 코드와 같습니다:

public static void main(String[] args) throws InterruptedException {

    for (int i = 0; i < 1000000; i++) {
        alloc();
    }

    Thread.sleep(100000);
}

private static void alloc() {
    User user = new User();
}
로그인 후 복사

코드는 매우 간단합니다. 루프를 100만 번 생성하고 alloc() 메서드를 사용하여 100만 개의 User 객체를 생성하는 것입니다. 여기서 alloc() 메소드에 정의된 User 객체는 다른 메소드에서 참조되지 않으므로 스택 할당 요구 사항을 충족합니다.

JVM 매개변수는 다음과 같습니다.

-Xmx2G -Xms2G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
로그인 후 복사

프로그램을 시작하고 jmap 도구를 통해 인스턴스 수를 확인합니다.

jmap -histo pid

num     #instances         #bytes  class name
----------------------------------------------
1:          3771        2198552  [B
2:         10617        1722664  [C
3:        104057        1664912  com.miracle.current.lock.StackAllocationTest$User
로그인 후 복사

프로그램이 총 104057개의 사용자 개체를 생성한 것을 볼 수 있습니다. 이는 1보다 훨씬 적습니다. 백만. 탈출 분석을 끄고 다시 살펴볼 수 있습니다:

-Xmx2G -Xms2G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
로그인 후 복사

프로그램을 시작하고 jmap 도구를 통해 인스턴스 수를 확인하십시오:

jmap -histo 42928

 num     #instances         #bytes  class name
----------------------------------------------
   1:           628       22299176  [I
   2:       1000000       16000000  com.miracle.current.lock.StackAllocationTest$User
로그인 후 복사

탈출 분석을 끈 후 총 100만 개의 사용자 개체가 생성된 것을 볼 수 있습니다. . 이에 비해 스택 할당은 힙 메모리 소비 및 GC에서 중요한 역할을 합니다.

스칼라 대체

데이터를 더 이상 더 작은 데이터로 분해하여 표현할 수 없는 경우 Java 가상 머신의 원래 데이터 유형(int, long 및 기타 숫자 유형 및 참조 유형 등)은 사용할 수 없습니다. 더 분해되면 이러한 데이터를 스칼라라고 부를 수 있습니다. 반대로, 데이터 조각이 계속해서 분해될 수 있는 경우 이를 집계라고 합니다. Java의 개체는 일반적인 집계입니다.

이스케이프 분석을 통해 객체가 메서드 외부에서 액세스되지 않고 이 객체가 해체될 수 있음을 증명할 수 있다면 프로그램은 실제로 실행될 때 이 객체를 생성하지 않고 대신에 사용할 여러 객체를 직접 생성할 수 있습니다. 대신 이 메서드를 사용하세요.

다음 코드가 있습니다:

public static void main(String[] args) {

    method();
}

private static void method() {
    User user = new User(25);

    System.out.println(user.age);
}

private static class User {

    private int age;

    public User(int age) {
        this.age = age;
    }
}
로그인 후 복사

method()方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()代码会优化为如下:

private static void alloc() {
    int age = 25;

    System.out.println(age);
}
로그인 후 복사

总结

尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。

위 내용은 3분 만에 JVM 이스케이프 분석 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

매우 실용적인 분산 JVM 모니터링 도구입니다! 매우 실용적인 분산 JVM 모니터링 도구입니다! Aug 15, 2023 pm 05:15 PM

이 프로젝트는 개발자가 여러 원격 호스트 JVM을 더 빠르게 모니터링할 수 있도록 설계되었습니다. 프로젝트가 Spring 부트라면 통합하기가 매우 쉽습니다. Spring 부트 프로그램을 빠르게 초기화하고 Jar 패키지를 직접 소개하는 것으로 충분합니다.

JVM 명령줄 매개변수에 대한 자세한 설명: JVM 작업을 제어하는 ​​비밀 무기 JVM 명령줄 매개변수에 대한 자세한 설명: JVM 작업을 제어하는 ​​비밀 무기 May 09, 2024 pm 01:33 PM

JVM 명령줄 매개변수를 사용하면 세부적인 수준에서 JVM 동작을 조정할 수 있습니다. 공통 매개변수는 다음과 같습니다. Java 힙 크기 설정(-Xms, -Xmx) 새로운 세대 크기 설정(-Xmn) 병렬 가비지 수집기 활성화(-XX:+UseParallelGC) 생존자 영역의 메모리 사용량 감소(-XX: -ReduceSurvivorSetInMemory) 중복 제거 가비지 수집 제거(-XX:-EliminateRedundantGCs) 가비지 수집 정보 인쇄(-XX:+PrintGC) G1 가비지 수집기 사용(-XX:-UseG1GC) 최대 가비지 수집 일시 중지 시간 설정(-XX:MaxGCPau)

JVM 가상머신의 기능과 원리 분석 JVM 가상머신의 기능과 원리 분석 Feb 22, 2024 pm 01:54 PM

JVM 가상 머신의 기능 및 원리 분석 소개: JVM(JavaVirtualMachine) 가상 머신은 Java 프로그래밍 언어의 핵심 구성 요소 중 하나이며 Java의 가장 큰 판매 포인트 중 하나입니다. JVM의 역할은 Java 소스 코드를 바이트코드로 컴파일하고 이러한 바이트코드를 실행하는 것입니다. 이 기사에서는 JVM의 역할과 작동 방식을 소개하고 독자의 이해를 돕기 위해 몇 가지 코드 예제를 제공합니다. 기능: JVM의 주요 기능은 다양한 플랫폼에서 Java 프로그램의 이식성 문제를 해결하는 것입니다.

JVM 메모리 관리 포인트 및 주의사항 JVM 메모리 관리 포인트 및 주의사항 Feb 20, 2024 am 10:26 AM

JVM 메모리 사용법 마스터를 위한 포인트 및 주의사항 JVM(JavaVirtualMachine)은 Java 애플리케이션이 실행되는 환경으로, 가장 중요한 것은 JVM의 메모리 관리이다. JVM 메모리를 적절하게 관리하면 애플리케이션 성능이 향상될 뿐만 아니라 메모리 누수 및 메모리 오버플로와 같은 문제도 방지할 수 있습니다. 이 기사에서는 JVM 메모리 사용에 대한 핵심 사항과 고려 사항을 소개하고 몇 가지 구체적인 코드 예제를 제공합니다. JVM 메모리 파티션 JVM 메모리는 주로 다음 영역으로 나뉩니다.

JVM이 32비트인지 64비트인지 확인하는 Java 프로그램 JVM이 32비트인지 64비트인지 확인하는 Java 프로그램 Sep 05, 2023 pm 06:37 PM

JVM이 32비트인지 64비트인지 확인하는 자바 프로그램을 작성하기 전에 먼저 JVM에 대해 논의해보자. JVM은 바이트코드 실행을 담당하는 Java 가상 머신입니다. JRE(Java Runtime Environment)의 일부입니다. 우리 모두는 Java가 플랫폼 독립적이라는 것을 알고 있지만 JVM은 플랫폼 의존적입니다. 각 운영 체제마다 별도의 JVM이 필요합니다. Java 소스 코드의 바이트 코드가 있으면 JVM 덕분에 모든 플랫폼에서 쉽게 실행할 수 있습니다. Java 파일 실행의 전체 과정은 다음과 같습니다. - 먼저 Java 소스 코드를 .java 확장자로 저장하고 컴파일러는 이를 .class 확장자를 가진 바이트코드로 변환합니다. 이는 컴파일 타임에 발생합니다. 이제 런타임에 J

jvm의 가비지 수집 메커니즘은 무엇입니까? jvm의 가비지 수집 메커니즘은 무엇입니까? Feb 01, 2023 pm 02:02 PM

jvm의 가비지 수집 메커니즘은 가비지 수집기라고도 불리는 GC(Garbage Collection)입니다. GC의 기본 원칙: 메모리에서 더 이상 사용되지 않는 객체를 재활용합니다. GC에서 재활용하는 데 사용되는 방법을 수집기라고 합니다. GC는 약간의 리소스와 시간을 소비해야 하므로 Java는 객체의 수명 주기 특성을 분석합니다. GC로 인해 발생하는 Pause를 애플리케이션에 최대한 단축하기 위해 New Generation과 Old Generation에서 수집됩니다.

Java 오류: JVM 메모리 오버플로 오류, 처리 및 방지 방법 Java 오류: JVM 메모리 오버플로 오류, 처리 및 방지 방법 Jun 24, 2023 pm 02:19 PM

Java는 널리 사용되는 프로그래밍 언어입니다. Java 애플리케이션을 개발하는 동안 JVM 메모리 오버플로 오류가 발생할 수 있습니다. 이 오류는 일반적으로 애플리케이션 충돌을 발생시켜 사용자 경험에 영향을 미칩니다. 이 기사에서는 JVM 메모리 오버플로 오류의 원인과 이러한 오류를 처리하고 방지하는 방법을 살펴봅니다. JVM 메모리 오버플로 오류란 무엇입니까? JVM(Java Virtual Machine)은 Java 애플리케이션을 실행하는 환경입니다. JVM에서 메모리는 힙, 메소드 영역, 스택 등 여러 영역으로 나뉩니다. 힙은 생성된 객체를 저장하는 데 사용됩니다.

Linux에서 Tomcat8의 JVM 메모리 구성을 수정하는 방법 Linux에서 Tomcat8의 JVM 메모리 구성을 수정하는 방법 Jun 03, 2023 am 08:43 AM

Tomcat8에서 JVM 메모리 구성을 수정하는 방법 Tomcat에서는 catalina.sh에서 직접 변수를 구성하는 것을 권장하지 않으며 대신 catalina와 동일한 수준의 디렉터리(bin 디렉터리)에 있는 setenv.sh에 작성합니다. 따라서 jvm의 메모리 구성을 수정하려면 setenv.sh 파일을 수정하고(기본적으로는 새 setenv.sh를 만들어야 함) 쓰기(자신의 상황에 따라 크기 수정)가 필요합니다. : 내보내기CATALINA_OPTS="$CATALINA_OPTS-Xms1000m" 내보내기CATALINA_OPTS ="$CATALINA

See all articles