찾다
Javajava지도 시간JVM 이스케이프란 무엇입니까? 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으로 문의하시기 바랍니다. 삭제
一个分布式 JVM 监控工具,非常实用!一个分布式 JVM 监控工具,非常实用!Aug 15, 2023 pm 05:15 PM

该项目为了方便开发者更快监控多个远程主机jvm,如果你的项目是Spring boot那么很方便集成,jar包引入即可,不是Spring boot也不用气馁,你可以快速自行初始化一个Spirng boot程序引入jar包即可

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内存主要分为以下几个区域:堆(He

Java程序检查JVM是32位还是64位Java程序检查JVM是32位还是64位Sep 05, 2023 pm 06:37 PM

在编写java程序来检查JVM是32位还是64位之前,我们先讨论一下JVM。JVM是java虚拟机,负责执行字节码。它是Java运行时环境(JRE)的一部分。我们都知道java是平台无关的,但是JVM是平台相关的。我们需要为每个操作系统提供单独的JVM。如果我们有任何java源代码的字节码,由于JVM,我们可以轻松地在任何平台上运行它。java文件执行的整个过程如下-首先,我们保存扩展名为.java的java源代码,编译器将其转换为扩展名为.class的字节码。这发生在编译时。现在,在运行时,J

Java错误:JVM内存溢出错误,如何处理和避免Java错误:JVM内存溢出错误,如何处理和避免Jun 24, 2023 pm 02:19 PM

Java是一种流行的编程语言,在开发Java应用程序的过程中,可能会遇到JVM内存溢出错误。这种错误通常会导致应用程序崩溃,影响用户体验。本文将探讨JVM内存溢出错误的原因和如何处理和避免这种错误。JVM内存溢出错误是什么?Java虚拟机(JVM)是Java应用程序的运行环境。在JVM中,内存被分为多个区域,其中包括堆、方法区、栈等。堆是用于存储创建的对象的

揭秘JVM工作原理:深入探索Java虚拟机的原理揭秘JVM工作原理:深入探索Java虚拟机的原理Feb 18, 2024 pm 12:28 PM

JVM原理详解:深入探究Java虚拟机的工作原理,需要具体代码示例一、引言随着Java编程语言的迅猛发展和广泛应用,Java虚拟机(JavaVirtualMachine,简称JVM)也成为了软件开发中不可或缺的一部分。JVM作为Java程序的运行环境,能够提供跨平台的特性,使得Java程序能够在不同的操作系统上运行。在本文中,我们将深入探究JVM的工作原

如何有效地调整JVM堆内存大小?如何有效地调整JVM堆内存大小?Feb 18, 2024 pm 01:39 PM

JVM内存参数设置:如何合理调整堆内存大小?在Java应用程序中,JVM是负责管理内存的关键组件。其中,堆内存是用于存储对象实例的地方,堆内存的大小设置对应用程序的性能和稳定性有着重要影响。本文将介绍如何合理调整堆内存大小的方法,并附带具体代码示例。首先,我们需要了解一些关于JVM内存的基础知识。JVM的内存分成了几个区域,包括堆内存、栈内存、方法区等。其中

提升应用性能:五款不可或缺的JVM监控工具提升应用性能:五款不可或缺的JVM监控工具Feb 19, 2024 am 08:08 AM

五款必备JVM监控工具,让你的应用运行如虎添翼!在当今的软件开发领域,Java已经成为最受欢迎的编程语言之一。然而,随着应用程序的复杂性不断增加,如何保证应用程序的高性能和稳定运行成为了一个重要的挑战。为了解决这个问题,我们引入了一些JVM监控工具,这些工具可以帮助我们实时监控和调优应用程序的性能。本文将介绍五款必备的JVM监控工具,包括VisualVM、J

See all articles

핫 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를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.