JVM——运行期优化

news2024/11/25 11:01:00

目录

      • 一、分层编译(TieredCompilation)
        • 即时编译器(JIT)与解释器的区别
        • 逃逸分析
      • 二、方法内联(Inlining)
      • 三、反射优化

一、分层编译(TieredCompilation)

JVM 将执行状态分成了 5 个层次:

0层:解释执行,用解释器将字节码翻译为机器码
1层:使用 C1 即时编译器编译执行(不带 profiling)
2层:使用 C1 即时编译器编译执行(带基本的profiling)
3层:使用 C1 即时编译器编译执行(带完全的profiling)
4层:使用 C2 即时编译器编译执行

profiling 是指在运行过程中收集一些程序执行状态的数据,例如【方法的调用次数】,【循环的 回边次数】等

即时编译器(JIT)与解释器的区别

解释器
● 将字节码解释为机器码,下次即使遇到相同的字节码,仍会执行重复的解释
● 是将字节码解释为针对所有平台都通用的机器码

即时编译器
● 将一些字节码编译为机器码,并存入 Code Cache,下次遇到相同的代码,直接执行,无需再编译
● 根据平台类型,生成平台特定的机器码

对于大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。 执行效率上简单比较一下 Interpreter(解释器) < C1 < C2,总的目标是发现热点代码(hotspot名称的由 来),并优化这些热点代码

逃逸分析

逃逸分析===>分析 new Object()对象是否会在循环外被用到或被其他方法所引用,发现其为循环内的局部变量即采用优化手段。
首先分析例子(每次创建1000个对象耗费所需的时间)
在这里插入图片描述

运行后发现大约在第70次循环时速度突然变快,大约在159次时速度一下降低到了三位数(在运行期间Java虚拟机会对代码做一定的优化
在这里插入图片描述
原因是什么呢?
—— JVM 将执行状态分成了 5 个层次

此种优化手段称之为逃逸分析,发现新建的对象是否逃逸。可以使用-XX:-DoEscapeAnalysis关闭逃逸分析

二、方法内联(Inlining)

内联函数
内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来直接进行替换

  private  static int square(final int i){
        return i*i;
    }

如果发现square使热点方法,并且长度不太长时,会进行内联,所谓的内联就是把方法内代码拷贝、粘贴到调用者位置:

System.out.printf(9*9);

还能够进行常量折叠的优化
System.out.printf(81);

例子
在这里插入图片描述
大约在153次后花费时间为0,进行内联后将其看作常量
在这里插入图片描述

三、反射优化

public class Reflect1 {
   public static void foo() {
      System.out.println("foo...");
   }

   public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      Method foo = Demo3.class.getMethod("foo");
      for(int i = 0; i<=16; i++) {
      // 执行反射调用(静态方法,无关联实例对象,因此参数为null)
         foo.invoke(null);  
      }
   }
}

结果:前16次调用性能相对较低,第17次调用开始性能会大大提升

foo.invoke 前面 0 ~ 15 次调用使用的是 MethodAccessor 的 NativeMethodAccessorImpl 实现

invoke方法源码

@CallerSensitive
public Object invoke(Object obj, Object... args)
    throws IllegalAccessException, IllegalArgumentException,
       InvocationTargetException
{
    if (!override) {
        if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
            Class<?> caller = Reflection.getCallerClass();
            checkAccess(caller, clazz, obj, modifiers);
        }
    }
    //MethodAccessor是一个接口,有3个实现类,其中有一个是抽象类
    MethodAccessor ma = methodAccessor;             // read volatile
    if (ma == null) {
        ma = acquireMethodAccessor();
    }
    return ma.invoke(obj, args);
}

在这里插入图片描述
会由DelegatingMehodAccessorImpl去调用NativeMethodAccessorImpl

NativeMethodAccessorImpl源码

class NativeMethodAccessorImpl extends MethodAccessorImpl {
    private final Method method;
    private DelegatingMethodAccessorImpl parent;
    private int numInvocations;

    NativeMethodAccessorImpl(Method var1) {
        this.method = var1;
    }
	
	//每次进行反射调用,会让numInvocation与ReflectionFactory.inflationThreshold的值(15)进行比较,并使使得numInvocation的值加一
	//如果numInvocation>ReflectionFactory.inflationThreshold,则会调用本地方法invoke0方法
    public Object invoke(Object var1, Object[] var2) throws IllegalArgumentException, InvocationTargetException {
        if (++this.numInvocations > ReflectionFactory.inflationThreshold() && !ReflectUtil.isVMAnonymousClass(this.method.getDeclaringClass())) {
            MethodAccessorImpl var3 = (MethodAccessorImpl)(new MethodAccessorGenerator()).generateMethod(this.method.getDeclaringClass(), this.method.getName(), this.method.getParameterTypes(), this.method.getReturnType(), this.method.getExceptionTypes(), this.method.getModifiers());
            this.parent.setDelegate(var3);
        }

        return invoke0(this.method, var1, var2);
    }

    void setParent(DelegatingMethodAccessorImpl var1) {
        this.parent = var1;
    }

    private static native Object invoke0(Method var0, Object var1, Object[] var2);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宜家EDI IFTMBC运输预定确认详解

IFTMBC是宜家与其供应商之间传输的符合EDIFACT标准的报文&#xff0c;在此前的文章如何读懂EDIFACT报文中&#xff0c;我们已经对EDIFACT做了详细的解读。在供应商发给宜家IFTMBF运输预定请求后&#xff0c;宜家会回复IFTMBC运输预订确认给供应商。 本文将从供应商接收宜家发送…

【Java|golang】1798. 你能构造出连续值的最大数目

给你一个长度为 n 的整数数组 coins &#xff0c;它代表你拥有的 n 个硬币。第 i 个硬币的值为 coins[i] 。如果你从这些硬币中选出一部分硬币&#xff0c;它们的和为 x &#xff0c;那么称&#xff0c;你可以 构造 出 x 。 请返回从 0 开始&#xff08;包括 0 &#xff09;&a…

预处理和宏

1.预处理的基本概念 C语言对源程序处理的四个步骤&#xff1a;预处理、编译、汇编、链接。 预处理是在程序源代码被编译之前&#xff0c;由预处理器&#xff08;Preprocessor&#xff09;对程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析&#xff0c;但它会把…

EL表达式

EL的概念JSP表达式语言&#xff08;EL&#xff09;使得访问存储在JavaBean中的数据变得非常简单。EL的作用用于替换作用域对象.getAttribute("name");3. EL的应用&#xff08;获取基本类型、字符串&#xff09;既可以用来创建算术表达式也可以用来创建逻辑表达式。在…

stm32f407探索者开发板(十四)——IO引脚复用和映射

文章目录一、端口复用二、STM32F4的端口复用映射原理三、复用功能映射设置四、端口复用配置过程一、端口复用 端口复用和重映射都是和单片机的I/O口有关系&#xff0c;端口复用是将一个I/O赋予多个功能&#xff0c;通过设置I/O的工作模式来切换不同的功能。重映射是将某些I/O口…

【运维有小邓】特权用户监视

解决方案简介&#xff1a; 使用EventLog Analyzer进行特权用户监控和审核内部用户活动报表企业IT网络的特权用户&#xff08;系统管理员、网络管理员和数据库管理员&#xff09;拥有比普通网络用户更多的权力。他们负责保持系统可用性。他们将有权创建新的用户配置文件并分配权…

PCIE总线

PCIE总线记录描述PCI分类与速度PCIE连接拓扑与角色PCIE接口定义PCIE数据传输方式与中断在PCIE中有两种数据传输方式&#xff1a;PCIE中断&#xff1a;PCIE协议栈与工作流程PCIE地址空间分类实例分析PCIE两种访问方式描述 PCI-Express(peripheral component interconnect expre…

Python调用API接口,实现人脸识别

人生苦短&#xff0c;我用Python 在开始之前&#xff0c;先问问大家&#xff1a; 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的**在线接口SDK模块&#xff08;baidu-aip&#xff09;**进行实现人脸识…

K100多功能嵌入吞吐式电动发卡读写一体机|读卡器技术选型问答

K100多功能嵌入吞吐式电动发卡读写一体机|读卡器技术是一款带卡槽&#xff0c;支持150张标准卡存放&#xff0c;电动式发卡、读写一体&#xff0c;支持磁条卡读卡&#xff0c;发卡&#xff1b;支持符合ISO7816协议的接触式芯片卡发卡&#xff0c;读写卡&#xff1b;支持符合ISO…

【C++详解】——vector类

&#x1f4d6; 前言&#xff1a;本期介绍vector类。 目录&#x1f552; 1. vector的介绍&#x1f552; 2. vector的使用&#x1f558; 2.1 定义&#x1f558; 2.2 iterator&#x1f558; 2.3 空间增长&#x1f558; 2.4 增删查改&#x1f552; 2. vector的模拟实现&#x1f558…

Springboot+ssm微空间私人定向共享文件资料系统java

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.4 Java语言简介 8 2.5Jsp技术 8 3系统分析 9 3.1可行性分析 9 3.1…

Android Studio 编译C/C++生成.so文件

前期准备&#xff1a;下载NDK、CMake方法一&#xff1a;使用AndroidStudio自动创建NativeC/C 项目创建新项目创建项目后&#xff0c;会默认生成两个文件和相关默认配置.若创建好C项目后报错&#xff0c;则需要配置一下NDK路径如果上图配置页面显示无法配置&#xff0c;则需要手…

【疑难解决】EasyCVR集成宇视SDK关闭“按需直播”,一直未拉流是什么原因?

EasyCVR平台不仅能提供丰富的视频能力&#xff0c;还可提供云、边、端分布式海量视频资源的统一管理与运维&#xff0c;从而实现数据采集、处理、汇聚、分析、存储、管理等全环节的视频能力。借助智能分析网关的AI智能检测能力&#xff0c;可实现人脸、人体、车辆、烟火、物体、…

LeetCode-191-位1的个数

1、位运算 我们可以使用位运算来计算二进制串中1的个数。由于异或的性质&#xff0c;0与0异或为0&#xff0c;0与1异或为1&#xff0c;我们可以将n与0进行异或操作&#xff0c;而后逐位判断是否为1&#xff0c;最终将结果进行累加即可。 class Solution { public:int hamming…

Mybatis 基础1

Mybatis基础什么是Mybatis什么是框架ORM介绍快速入门环境搭建MyBatis的相关apiResources构建器SqlSessionFactoryBuilder工厂对象SqlSessionFactorySqlSession会话对象MyBatis 映射配置文件映射配置文件介绍查询功能新增功能修改功能删除功能小结Mybatis核心配置文件介绍核心配…

创建百度百科词条要交费吗?百度百科词条花钱吗?

互联网时代&#xff0c;百度逐渐成为了人们了解信息、搜集信息的主要渠道&#xff0c;越来越多的用户通过百度百科词条认识到了很多知名的人物、产品、品牌或是作品等等&#xff0c;百度百科词条在人们心中的信赖度也是越来越高。 百度百科词条具有权威性&#xff0c;百度百科…

Spring中Bean的生命周期(包含Spring执行流程)

文章目录一、Spring(Bean)执行流程二、Bean生命周期Bean的生命周期演示总结一、Spring(Bean)执行流程 启动容器(启动项目)读取配置文件(初始化) a) 使用xml注册bean b) 配置bean根(扫描)路径将bean存储到Spring中(存操作): 通过类注解进行扫描和装配将bean从Spring读取出来(取…

想要协同办公,企业云盘该怎么选?

信息数字时代&#xff0c;数字资产迎来爆发的同时&#xff0c;资产管理需求也在不断增加。在面对资源容量过大、素材无法大量共享等问题时&#xff0c;怎么让内容生产者和团队管理者更高效进行内容存储&#xff0c;满足项目在多元场景下分发、协作需求&#xff1f;赞奇超级云盘…

MySQL相关面试题

文章目录union 和 unionAll 的区别&#xff1f;drop、delete与truncate的区别 &#xff1f;sql 语句如何优化 &#xff1f;什么是事务 &#xff1f;事务的四个特性(ACID) &#xff1f;事务的隔离级别&#xff1f;索引主要有哪几种分类 &#xff1f;什么时候适合添加索引&#x…

ClickHouse 单机安装及基础知识与 Spark 应用

什么是 ClickHouse? ClickHouse 是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 在传统的行式数据库系统中,数据按如下顺序存储: 处于同一行中的数据总是被物理的存储在一起。 常见的行式数据库系统有:MySQL、Postgres等。 在列式数据库系统中,数据按如下的顺…