Java java지도 시간 JVM 이스케이프란 무엇입니까? JVM 이스케이프 분석 원칙 소개

JVM 이스케이프란 무엇입니까? JVM 이스케이프 분석 원칙 소개

Oct 08, 2018 pm 02:58 PM
jvm

이 기사에서는 JVM 이스케이프가 무엇인지 설명합니다. JVM 이스케이프 분석의 원칙에 대한 소개는 특정 참조 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

우리 모두는 Java의 객체가 기본적으로 힙에 할당된다는 것을 알고 있습니다. 호출 스택에는 객체의 포인터만 저장됩니다. 객체가 더 이상 사용되지 않으면 참조 트리를 순회하고 메모리를 회수하기 위해 GC에 의존해야 합니다. 힙에 개체가 너무 많으면 개체를 재활용하고 메모리를 구성하는 데 시간이 많이 걸리며 이는 성능에 영향을 미칩니다. 따라서 일상적인 개발에서 메모리와 시간은 매우 소중합니다. 스택 오버헤드를 최적화하는 방법은 상대적으로 중요한 문제입니다.

여기에서는 이스케이프 분석 관점에서 JVM 최적화에 대해 이야기합니다.

왜 “escape

컴퓨터 언어 컴파일러 최적화 원리에서 이스케이프 분석은 포인터의 동적 범위를 분석하는 방법을 의미하며 컴파일러 최적화 원리의 포인터 분석 및 모양 분석과 관련이 있습니다. 변수(또는 개체)가 메서드에 할당되면 해당 포인터가 전역적으로 반환되거나 참조될 수 있으며, 이는 다른 메서드나 스레드에서 참조됩니다. 이러한 현상을 포인터(또는 참조) 이스케이프라고 합니다. 일반인의 용어로, 객체의 포인터가 여러 메소드나 스레드에 의해 참조되는 경우 이를 객체 포인터(또는 객체)의 이스케이프라고 부릅니다.

인터넷의 한 블로거는 간단하고 직접적인 코드를 사용하여 이스케이프를 이렇게 설명했습니다. 매우 간단하고 참고용으로 사용할 수 있다고 생각합니다.

public StringBuilder escapeDemo1(System a, System b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder;
}
로그인 후 복사

stringBuilder는 메소드의 내부 변수이며 현재는 직접 반환되므로 stringBuilder 다른 곳에서 메서드나 매개변수에 의해 변경될 수 있으므로 해당 범위는 단지 데모1이 아니지만 "이스케이프"됩니다.

그런 다음 코드를 변경할 수 있습니다.

public String escapeDemo2(System a, System b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder.toString();
}
로그인 후 복사

이런 방식으로 StringBuilder는 반환되지 않지만 toString()이면 StringBuilder가 메서드에서 직접 분리되지 않고 이스케이프가 발생하지 않습니다.

이스케이프 분석이란

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

이스케이프 분석의 원리

Java 자체의 한계(객체는 힙에만 할당 가능)를 이해할 수 있습니다. 힙에 할당되는 임시 객체 수를 줄이기 위해 로컬을 정의하겠습니다. 메소드 본문 변수이며 메소드 실행 중에 변수가 이스케이프되지 않습니다. JVM 튜닝 메커니즘에 따르면 클래스의 인스턴스가 먼저 힙 메모리에 생성된 다음 이 객체의 참조가 호출 스택으로 푸시됩니다. 실행은 계속됩니다. 이는 JVM 최적화 방식입니다. 그런 다음 이스케이프 분석을 사용하여 JVM을 최적화합니다. 즉, 스택의 재할당 방법은 먼저 이스케이프되지 않은 변수를 찾아서 힙에 들어가지 않고 변수를 직접 스택에 저장한 후 계속해서 스택을 호출하여 실행합니다. 종료되면 스택 공간이 재활용되고 로컬 변수도 재활용됩니다. 이 작업은 최적화 전에는 힙에, 최적화 후에는 스택에 있으므로 힙에 있는 개체의 할당 및 소멸이 줄어들고 성능이 최적화됩니다.

이스케이프 방법

메서드 이스케이프: 메서드 본문 내에서 호출 매개변수로 메서드에 전달되거나 개체로 직접 반환되는 등 외부 메서드에서 참조할 수 있는 지역 변수를 정의합니다. 혹은 객체가 메소드 밖으로 튀어나오는 것으로 이해될 수 있다.

스레드 이스케이프: 이 개체는 인스턴스 변수에 할당되거나 다른 스레드에서 액세스되는 등 다른 스레드에서 액세스됩니다. 개체가 현재 스레드를 이스케이프했습니다.

이스케이프 분석의 이점

메소드 본문이나 스레드 내에서 개체가 이스케이프되지 않는 경우(또는 이스케이프 분석을 통과한 후 이스케이프에 실패한 경우)

1 스택에 할당

일반 이 경우 , 탈출하지 않는 개체는 상대적으로 큰 공간을 차지합니다. 스택의 공간을 사용할 수 있으면 메서드가 끝나면 많은 개체가 파괴되어 GC 압력이 감소합니다

2. 정의한 클래스 메서드에 동기화 잠금이 있지만 런타임에는 하나의 스레드만 액세스하고 있으며 이스케이프 분석 후 기계어 코드는 동기화 잠금 없이 실행됩니다.

3. 스칼라 교체

Java虚拟机中的原始数据类型(int,long等数值类型以及reference类型等)都不能再进一步分解,它们可以称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化,可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。

开启设置

在JDK 6u23以上是默认开启,这里将设置重新明确一下:
强制开启:   

 -server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
로그인 후 복사

关闭逃逸分析:    

-server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
로그인 후 복사

写在结尾

栈上的空间一般而言是非常小的,只能存放若干变化和小的数据结构,无法存储大容量数据。目前的实现都是采用不那么准确但是时间压力相对较小的算法来完成逃逸分析,这就可能导致效果不稳定。所以,逃逸分析的效果只能在特定场景下,满足高频和高数量的小容量的变量分配结构,才是合适的。

위 내용은 JVM 이스케이프란 무엇입니까? 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를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++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 20, 2024 am 10:26 AM

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

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

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

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

Java는 널리 사용되는 프로그래밍 언어입니다. Java 애플리케이션을 개발하는 동안 JVM 메모리 오버플로 오류가 발생할 수 있습니다. 이 오류는 일반적으로 애플리케이션 충돌을 발생시켜 사용자 경험에 영향을 미칩니다. 이 기사에서는 JVM 메모리 오버플로 오류의 원인과 이러한 오류를 처리하고 방지하는 방법을 살펴봅니다. JVM 메모리 오버플로 오류란 무엇입니까? JVM(Java Virtual Machine)은 Java 애플리케이션을 실행하는 환경입니다. 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 18, 2024 pm 01:39 PM

JVM 메모리 매개변수 설정: 힙 메모리 크기를 합리적으로 조정하는 방법은 무엇입니까? Java 애플리케이션에서 JVM은 메모리 관리를 담당하는 핵심 구성 요소입니다. 그 중 힙 메모리는 객체 인스턴스를 저장하는 데 사용됩니다. 힙 메모리의 크기 설정은 애플리케이션의 성능과 안정성에 중요한 영향을 미칩니다. 이 기사에서는 구체적인 코드 예제를 통해 힙 메모리 크기를 합리적으로 조정하는 방법을 소개합니다. 먼저 JVM 메모리에 대한 기본 지식을 이해해야 합니다. JVM의 메모리는 힙 메모리, 스택 메모리, 메소드 영역 등 여러 영역으로 구분됩니다. ~에

JVM의 작동 원리 이해하기: Java 가상 머신의 원리에 대한 심층 탐구 JVM의 작동 원리 이해하기: Java 가상 머신의 원리에 대한 심층 탐구 Feb 18, 2024 pm 12:28 PM

JVM 원리에 대한 자세한 설명: Java 가상 머신의 작동 원리에 대한 심층적인 탐구에는 특정 코드 예제가 필요합니다. 1. 소개 Java 프로그래밍 언어의 급속한 발전과 광범위한 적용으로 인해 Java Virtual Machine(JavaVirtualMachine, JVM이라고 함) )도 소프트웨어 개발에 없어서는 안될 부분이 되었습니다. Java 프로그램의 실행 환경인 JVM은 크로스 플랫폼 기능을 제공하여 Java 프로그램이 다른 운영 체제에서 실행될 수 있도록 합니다. 이번 글에서는 JVM이 어떻게 작동하는지 알아보겠습니다.

See all articles