JVM学习-JVM的自动优化

news2024/10/7 12:25:23

目录

1.语法糖

        1.1默认构造器

        1.2自动拆装箱

        1.3泛型集合取值

        1.4可变参数实现

        1.5 foreach循环

        1.6 switch配合String使用

        1.7 switch配合枚举使用​编辑

        1.8 try-with-resources

        1.9方法重写的桥接方法

2.运行时优化

        2.1分层优化以及逃逸分析

        2.2方法内联

        2.3字段优化


        JVM会进行两部分的优化:一部分是编译时优化,也就是语法糖;另一部分是运行时优化。

1.语法糖

        指的是在对源码编译成字节码的期间,自动生成和转换的一些代码,为减轻程序员的负担所做出的优化。

         1.1默认构造器

        在平常编写类时不写构造方法但程序也会正常运行,这是因为在编译期间会自动生成默认构造器,使用了父类的构造方法。

        1.2自动拆装箱

        装箱是指将基本类型转换为包装类型,拆箱则是将包装类型转换为基本类型。所谓基本类型共八个,分别是int、char、byte、short、long、boolean、float以及double,对应的包装类型则是Integer、Character、Byte、Short、Long、Boolean、Float以及Double,包装类型主要是将这些基本类型包装成对象。两种类型的转换其实是需要调用方法的,比如Integer对象转换成基本类型int需要调用对象的intValue()方法,而int转换成Integer对象则需要调用Integer.valueOf(数字)方法;此时就可以利用语法糖,通过在编译期间自动生成这些代码来实现无需方法调用直接进行类型转换,比如我们可以直接使用Integer x=1和int y=x来进行类型转换,既减轻了编码负担又增加了可读性。

        1.3泛型集合取值

        1.4可变参数实现

        见另一篇博客JVM学习-底层字节码的执行过程-CSDN博客中的可变参数实现部分。

        1.5 foreach循环

        用于所有数组以及实现了Iterable接口的集合,Iterable用来获取集合的迭代器。对于数组来说,foreach在编译期间其实是一个for循环,从第一个开始遍历,且遍历的长度就是数组的长度。对于集合来说则在编译期间变成一个while循环,先是通过集合的iterator()方法获取迭代器,然后通过hasnext()方法查看是否还有下一个元素,如果没有则终止循环;在遍历时由于使用的是迭代器,需要通过.next()方法获取下一个元素,但由于进行了泛型擦除,所以拿到的元素都是Object类型,需要进行强制转换,当然在使用foreach循环时不需要,因为在编译时会自动进行优化。要注意的是foreach遍历的是副本而不是其对象本身,所以使用foreach修改内部元素是无效的
        以list集合为例:
        源码:       

List<Integer> list=new Arrays.asList(1,2,3);
        foreach(Integer i : list){
                     System.out.println(i);                 
         }

        编译后形成的字节码相当于以下代码:

List<Integer> list=new Arrays.asList(1,2,3);
        Iterator it=list.iterator();
        while(it.hasnext()){
                 Integer i=(Integer)it.next();
                 System.out.println(i);
        }

        1.6 switch配合String使用

        1.7 switch配合枚举使用

        1.8 try-with-resources

           1.9方法重写的桥接方法

2.运行时优化

        2.1分层优化以及逃逸分析

        2.2方法内联

        2.3字段优化

        字段优化是针对于普通成员变量或静态成员变量的操作进行的优化,在频繁访问普通成员变量或静态成员变量时,JVM会复制一个副本,这个副本是一个局部变量,由于局部变量存储在栈中而成员变量存储在堆中,所以在运行时就不用再去堆中找成员变量了,直接使用栈中的副本能够节省较多的时间;所以在访问成员变量时既可以手动复制一个副本也可以在运行时让JVM自动优化。

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

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

相关文章

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层&#xff0c;允许你在类 Unix 操作系统&#xff08;包括 Ubuntu&#xff09;上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤&#xff1a; 在 Ubuntu 上安装 Wine&#xff1a; 更新软件包列表&#xff1a; 打开终端并运行以下命令以…

Maya自定义工具架

有时候我们需要自己定义工具架上的内容&#xff0c;比如将一个工具放到工具架上&#xff0c;或者删除一个工具 添加一个工具 例如我们想在多边形建模栏位上添加一个分离按钮&#xff0c;默认 1 先切换到想要添加的工具架栏位 2 打开菜单&#xff0c;找到我们想添加的工具 …

重新认识BIO、NIO、IO多路复用、Select、Poll、Epollo它们之间的关系

目录 一、背景 二、名词理解 &#xff08;1&#xff09;BIO &#xff08;2&#xff09;NIO &#xff08;3&#xff09;IO多路复用 &#xff08;4&#xff09;Select、Poll、Epollo 三、他们之间的关系总结 一、背景 最近又在学习网络IO相关知识&#xff0c;对我们常说的…

GAMES104-现代游戏引擎 1

主要学习重点还是面向就业&#xff0c;重点复习八股和算法 每天早上八点到九点用来学习这个课程 持续更新中... 第一节 游戏引擎导论 第二节 引擎架构分层

[CTF]-Web:部分题目WP

file_include&#xff1a; 爆破 http://61.147.171.105:57268/?filenamephp://filter/convert.iconv.a.b/resourceflag.php

设计模式 -- 2:策略模式

目录 总结部分&#xff1a;策略模式的优点部分代码部分 总结部分&#xff1a; 策略模式和简单工厂模式很像 区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案 而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相…

【Qt问题】vs里直接打开qt项目的ui会崩溃

问题描述&#xff1a; 当我用VS2019开发Qt的时候&#xff0c;在VS编译器里要用到Qt的ui设计&#xff0c;但是双击打开发现直接就崩溃了。 解决办法&#xff1a; 崩溃的原因很简单&#xff0c;是因为VS默认用的qt designer打开&#xff0c;所以会崩溃&#xff0c;我们右键单击…

【运维】StarRocks数据迁移到新集群(针对于集群互通、不互通的情况)

文章目录 一. 迁移整体思路1. 对于新旧集群互通的情况2. 对于新旧集群不互通的情况 二、迁移过程&#xff08;两个集群互通的情况&#xff09;1. 备份过程1.1. 通过mysqlclient与starrocks进行关联1.2. 创建仓库与minio建立联系1.3. 备份数据到minio 2. 迁移过程2.1. 通过mysql…

大衍数列-蓝桥杯?-Lua 中文代码解题第2题

大衍数列-蓝桥杯&#xff1f;-Lua 中文代码解题第2题 中国古代文献中&#xff0c;曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。 它的前几项是&#xff1a;0、2、4、8、12、18、24、32、40、50 … 其规律是&#xff1a;对偶数项&#xff0c;是序号平方再除…

[蓝桥杯练习题]确定字符串是否包含唯一字符/确定字符串是否是另一个的排列

确定字符串是否包含唯一字符 #include<bits/stdc.h> using namespace std; int main(){ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);map<char,int>m;string s;cin>>s;for(int i0;i<s.size();i){if(isalpha(s[i]))s[i]tolower(s[i]);if(…

多租户平台前端存储结构的选择

下图来源于cookie、localStorage 和 sessionStorage的区别及应用实例 既然localstorage无有效期&#xff0c;关闭浏览器还存在&#xff0c;那么用来存储用户的身份信息并不是太合适&#xff0c;先看一下B站中localstorage都存在了啥&#xff0c;原来把我搜索的记录都存在了下来…

ISIS接口认证实验简述

默认情况下&#xff0c;ISIS接口认证通过在ISIS协议数据单元&#xff08;PDU&#xff09;中添加认证字段&#xff0c;例如&#xff1a;一个密钥或密码&#xff0c;用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中&#xff0c;并确保邻居之间的通信是可信的…

pytorch实现分割模型TransUNet

TransUNet是一个非常经典的图像分割模型。该模型出现在Transformer引入图像领域的早期&#xff0c;所以结构比较简单&#xff0c;但是实际上效果却比很多后续花哨的模型更好。所以有必要捋一遍pytorch实现TransUNet的整体流程。 首先&#xff0c;按照惯例&#xff0c;先看一下…

MySQL 篇- Java 连接 MySQL 数据库并实现数据交互

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 JDBC 概述 2.0 实现 Java 连接 MySQL 数据库并实现数据交互的完整过程 2.1 安装数据库驱动包 2.2 创建数据源对象 2.3 获取数据库连接对象 2.4 创建 SQL 语句 2.…

mac激活pycharm,python环境安装和包安装问题

1.PyCharm到官网下载就行 地址&#xff1a;Other Versions - PyCharm (jetbrains.com) 2.MacOS 下载python环境&#xff0c;地址&#xff1a; Python Releases for macOS | Python.org 3.PyCharm环境配置&#xff1a; 4. 如果包下载不下来可以换个源试试 pip install py…

如何在Ubuntu中查看编辑lvgl的demo和examples?

如何在Ubuntu中查看编辑lvgl的demo和examples&#xff1f; 如何在 Ubuntu系统中运行查看lvgl 1、拉取代码 在lvgl的github主页面有50多个仓库&#xff0c;找到lv_port_pc_eclipse这个仓库&#xff0c;点进去 拉取仓库代码和子仓库代码 仓库网址&#xff1a;https://github…

Maven: There are test failures.(已解决)

问题解决办法 进行package打包时报错如下&#xff1a; 然后这些并不能看出是测试的哪里的问题&#xff0c;可以点击上一级进行查看更详细的错误&#xff0c;越向上日志越详细&#xff0c;可以看到是52行出了错误&#xff0c; 52对应代码如下&#xff1a; 原因是存在注册的测…

分享一篇Oracle RAC实战安装11G

分享一次很久以前的Oracle rac项目实施。 1、拓扑结构 基础环境是2台H3C的服务器2台3PAR的双活存储&#xff0c;操作系统centos7.2。借用下别人家的拓扑先&#xff08;这是一套典型的RAC架构&#xff09;。 2、网卡TEAM操作 以eno51和en052组成Team1组为示例&#xff1a; nm…

校园闲置物品交易网站 |基于springboot框架+ Mysql+Java+Tomcat的校园闲置物品交易网站设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen…

章鱼网络 Community Call #19|​开启与 Eigenlayer 的合作

香港时间2024年3月8日12点&#xff0c;章鱼网络举行第19期 Community Call。 在过去的一个月&#xff0c;章鱼网络在成功完成 $NEAR Restaking 功能的安全审计之后&#xff0c;一直在稳步吸引关注。事实上&#xff0c;在整个行业中&#xff0c;我们是极少数已经推出 Restaking …