Java java지도 시간 JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

Aug 24, 2019 pm 04:41 PM
jvm

JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

이 그림을 예로 들면, .java에서 .class까지의 과정이 컴파일 과정이고, .class에서 기계어 코드까지의 과정이 해석 과정입니다. 아래에서는 별도로 최적화되었습니다. 최적화 과정에서 컴파일 단계의 최적화는 주로 프런트엔드 컴파일러의 최적화이고, 실행 단계의 최적화는 주로 JIT(Just-In-Time) 컴파일러의 최적화입니다.

JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

컴파일러 최적화

#🎜 🎜 # 컴파일 과정

JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

위는 javac의 컴파일 과정도이고, 다음은 is javac 컴파일 프로세스의 주요 본문 코드입니다.

JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

단계는 아래에 자세히 설명되어 있습니다

1.

어휘 분석

소스 코드의 문자 스트림을 a, =, b와 같이 컴파일 프로세스에서 가장 작은 요소인 토큰 집합으로 변환합니다. 정수 .

구문 분석

토큰 시퀀스를 기반으로 추상 구문 트리를 구성합니다. 앞으로 컴파일러는 기본적으로 더 이상 소스 코드 파일에서 작동하지 않으며 후속 작업은 추상 구문 트리를 기반으로 합니다. 추상 구문 트리는 프로그램 코드의 구문 구조를 설명하는 데 사용되는 트리 표현입니다. 노드는 수정자, 반환 값 등과 같은 코드의 구문 구조를 나타냅니다.

기호 테이블 채우기

기호 테이블은 일련의 기호 주소와 기호 정보로 구성된 테이블로, 다양한 컴파일 단계에서 사용됩니다. 예를 들어 의미 분석에서는 대상 코드 생성 단계에서 의미 확인 및 중간 코드 생성에 사용되며 주소 할당의 기초로 사용됩니다.

2. 주석 처리기 이 부분은 컴파일 중에 주석을 처리하는 플러그인 주석 처리기입니다. 구문 트리를 수정할 수 있습니다. 수정되면 컴파일러는 재처리를 위해 위의 첫 번째 단계로 돌아갑니다. 각 루프는 위 그림의 루프백 프로세스입니다.

3. 의미 분석 및 바이트코드 생성 구문 분석 후 생성된 구문 트리는 올바른 구조를 가진 소스 프로그램의 추상화이지만, 소스 프로그램이 논리적이라는 보장은 없습니다. 의미론적 분석의 임무는 구조적으로 올바른 소스 프로그램의 상황에 맞는 특성을 조사하는 것입니다. 예를 들어, 다음 코드의 오류는 의미 분석 단계에서만 확인할 수 있습니다.

boolean a=false;
char b=2;
int c=a+b
로그인 후 복사

이 단계는 다음 4단계로 구성됩니다.

Annotation check

이전에 변수가 선언되었는지 여부 use , 변수와 할당 간의 데이터 유형이 일치할 수 있는지 여부 등 a=1+2를 a=3으로 바꾸는 상수 접기도 있습니다. 따라서 코드에서 a=1+2 및 a=3은 프로그램 실행 중에 CPU 명령 연산량을 증가시키지 않습니다.

데이터 및 제어 흐름 분석

사용하기 전에 프로그램의 로컬 변수에 값이 할당되어 있는지 확인하고, 프로그램의 각 경로가 메소드에는 확인된 모든 예외가 올바르게 처리되었는지 여부 및 기타 문제가 반환 값이 있습니다. 클래스 로딩 중 데이터 및 제어 흐름 분석도 기본적으로 목적은 동일하지만 검증 범위가 다릅니다. 일부 검증 항목은 컴파일 또는 런타임 중에만 실행될 수 있습니다.

Solution to syntactic sugar

Syntactic sugar는 컴퓨터 언어에 일종의 구문을 추가하는 것입니다. 언어의 기능을 향상시킬 수 있습니다. 구문 설탕에는 제네릭, 자동 언박싱 등이 포함됩니다. 이러한 구문은 가상 머신 런타임에서 지원되지 않으며 컴파일 단계 중에 기본 구문 구조로 되돌아갑니다. 이 프로세스를 구문 설탕 디코딩이라고 합니다.

바이트코드 생성

이전 단계에서 생성된 정보(구문 트리, 심볼 테이블)를 바이트코드로 변환하여 디스크에 쓰고, 그런 다음 소량의 코드를 추가하고 변환했습니다. 예를 들어 문자열 추가 작업을 StringBuffer 또는 StringBuilder의 추가() 작업으로 바꿉니다.

이때 Class 파일이 생성됩니다.

语法糖

语法糖是java中添加某种语法,对语言的功能没有影响,但是可以增加程序的可读性。包括泛型、内部类、枚举类等。

1、泛型与类型擦除
泛型可用于类、接口和方法的创建中,用于对放入集合元素的类型的约束。泛型只在程序源码中存在,在编译阶段有解语法糖的步骤,所以在.Class文件中,已经变为了原来的原生类型了。这个过程叫做类型擦除。
泛型擦除前:

public static void main(String[] args){
    Map<String,String> map=new HashMap<>();
    map.put("姓名","小明");
    map.put("性别","男");
    sout(map.get("姓名"));
    sout(map.get("性别"));
}
로그인 후 복사

泛型擦除后:

public static void main(String[] args){
    Map map=new HashMap();
    map.put("姓名","小明");
    map.put("性别","男");
    sout((String)map.get("姓名"));
    sout((String)map.get("性别"));
}
로그인 후 복사

所以ArrayList和ArrayList在运行期时是同一个类。

2、自动拆装箱、循环遍历
这些是java中使用最多的语法糖。编译前:

public static void main(String[] args){
      List<Integer> list=Arrays.asList(1,2,3,4);
      int sum=0;
      for(int i:list){
              sum +=i;
      }
      System.out.println(sum);
}
로그인 후 복사

编译后:

public static void main(String[] args){
      List list=Arrays.asList(new Integer[] {
                Integer.valueOf(1),
                Integer.valueOf(2),
                Integer.valueOf(3),
                Integer.valueOf(4)});
      int sum=0;
      for(Iterator localIterator=list.iterator();localIterator.hasNext();){
                   int i=((Integer)localIterator.next()).intValue();
                   sum +=i;
      }
      System.out.println(sum);
}
로그인 후 복사

可见,自动拆装箱在编译后被转化为了对应的包装和还原方法,如Integer.valueOf()和Integer.intValue()。
遍历循环则把代码还原为了迭代器的实现。

3、条件编译
根据布尔常量值的真假,编译器会把分支中不成立的代码块消除掉。

public static void main(String[] args){
      if(true){
            sout("block 1");
      }else{
           sout("block 2");
     }
}
로그인 후 복사

编译后,代码变为:

public static void main(String[] args){
     sout("block 1");
}
로그인 후 복사

运行期优化

一般情况下,我们将.java编译成.class,.class再解释成机器码。但是也有特殊的情况。有些代码调用比较频繁,比如某个方法或代码块的运行特别频繁,为了提高程序的执行效率,在运行时,虚拟机会把这个代码直接编译成机器码,并进行各种层次的优化。这样的代码称为热点代码。完成这个任务的编译器被称为即时编译器。但是其并不是虚拟机必需的部分。

JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - JVM 최적화

即时编译器的概述

(1)为什么虚拟机要使用解释器和编译器并存的架构?

虚拟机里包含着解释器和编译器。当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。

当程序运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译来提升效率。

(2)为什么虚拟机要实现两个不同的即时编译器?

虚拟机中内置了两个即时编译器,分别为Client Compiler和Server Compiler,又称为C1和C2。

默认只使用其中的一个,至于选择哪个,取决于虚拟机会根据自身版本和宿主机器的硬件性能自动选择运行模式。用户也可以使用“-client”、“-server”进行指定。

(3)程序何时使用解释器执行?何时使用编译器执行?

虚拟机有一个分层编译策略。

第0层:程序解释执行,解释器不开启性能监控功能,可触发第1层编译

第1层:也称为C1编译,将字节码编译为本地代码,进行简单、可靠的优化,如有必要将加入性能监控的逻辑。

第2层:也称为C2编译,将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。

(4)哪些程序代码会被编译为本地代码?如何编译为本地代码?

热点代码包括如下两类,其均把整个方法作为编译对象。

a、被多次调用的方法

b、被多次执行的循环体

热点探测是用来判断一段代码是否为热点代码,其方式有两种:

a、基于采样

b、基于计数器。HotSpot使用的是这种。它为每个方法准备了两类计数器:统计方法被调用次数的方法调用计数器和统计一个方法中循环体代码执行次数的回边计数器。

(5)如何从外部观察及时编译器的编译过程和编译结果?

可以使用 -xx:+PrintCompilation 查看哪些方法被即时编译器编译了。

优化技术有哪些?

虚拟机的即时编译器在生成代码时,采用了如下的代码优化技术。

(1)公共子表达式消除

如果一个表达式E已经计算过了,那如果再次出现E时就不会再对它进行计算。比如:

int d=(a*b)*12+c+(c+b*a)
로그인 후 복사

如果这段代码交给javac编译器,则不会进行任何优化。如果交给即时编译器,会被进行如下步骤的优化:

第一步:消除公共子表达式

int d=E*12+c+(c+E)
로그인 후 복사

第二步:代数化简:

int d=E*13+c*2
로그인 후 복사

(2)数组边界检查消除

数组边界检查是什么?
如果有一个数组foo[],在java语言中访问数组元素foo[i]的时候,系统将会自动进行上下界的范围检查,检查i是否满足0≤i≤foo.length这个条件。

那怎么进行消除呢?
a、把运行期检查提到编译期完成。如foo[3],只要在编译期根据数据流分析来确定foo.length的值,并判断下标“3”没有越界,执行的时候就不用判断了。
b、隐式异常处理。这种思路通常用于空指针检查和算符运算中除数为零的情况。

if(foo!=null){
  return foo.value;
}else{
  throw new NullPointException();
}
로그인 후 복사

被隐式异常处理优化后,变为如下代码:

try{
  return foo.value;
}catch(segment_fault){
  uncommon_trap();
}
로그인 후 복사

除了数组边界检查消除,还有自动装箱消除、安全点消除、消除反射等。

(3)方法内联

把目标方法的代码“复制”到发起调用的方法之中,避免发生真实的方法调用。

public int add(int x1, int x2, int x3, int x4) {  
        return add1(x1, x2) + add1(x3, x4);  
 }  

public int add1(int x1, int x2) {  
        return x1 + x2;  
    }
로그인 후 복사

运行一段时间后JVM会把add1方法去掉,并把代码翻译成:

public int add(int x1, int x2, int x3, int x4) {  
        return x1 + x2 + x3 + x4;  
}
로그인 후 복사

(4)逃逸分析

当一个对象在方法中被定义后,它可能被外部方法所引用,比如作为调用参数传递到其它方法中,这称为方法逃逸。同理,如果被外部线程访问到,它就称为线程逃逸。

对变量进行相应分析就叫做逃逸分析。如果能证明别的方法或线程无法通过任何途径访问到这个对象,则可以为这个变量进行一些优化。

优化的手段有栈上分配、同步消除、标量替换等。以同步消除为例,如果逃逸分析能够确定一个变量不会逃逸出线程,即无法被其它线程访问到,那对这个变量实施的同步措施就可以消除掉了。

以上内容便是关于JAVA虚拟机中JVM优化的全部介绍,更多相关问题请访问PHP中文网:JAVA视频教程

위 내용은 JAVA Virtual Machine(JVM)에 대한 자세한 소개(7) - 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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 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 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 메모리는 주로 다음 영역으로 나뉩니다.

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