JVM 常量池、即时编译与解析器、逃逸分析

news2024/11/23 10:27:14

一、常量池 

1.1、常量池使用 的数据结构

常量池底层使用HashTable

key 是字符串和长度生成的hashValue,然后再hash生成index, 改index就是key;Value是一个HashTableEntry;
1、key
    hashValue = hash string(name, len)
    index = hash to index(hashValue);
    1、根据字符串(即 name)以及字符串的长度计算出hashValue
    2、根据hashValue计算出index,这个index就是key 
2、value
    1、HashtableEntry<oop, mtSymbol>* entry = new entry(hashValue, string());
    2、将Java的string类的实例instanceOopDesc封装成HashtableEntry
    3、struct HashtableEntry {
        INT PTR hash;
        void* key;
          void* value;  instanceopDesc
        HashtableEntry* next;
      };

1.2、JVM底层是如何操作常量池

String s = "1";

1、去字符串常量池中去查, 有直接返回对应的string对象
2、如果没有,就会创建string对象、char数组对象,
3、将这个string对象对应的InstanceOopDesc封装成HashtableEntry,作为StringTable的value进行存储

4、new String()就是在堆上又创建一个对象char[] 指向typeArrayOopDesc

二、即使编译与解析器

2.0 编译过程

  1. .java源文件通过编译器(javac.exe)编译成.class文件
  2. JVM通过ClassLoader对.calss文件进行解释(自解码解释器和JIT即使编译器)—该过程需要调用核心类1

3、说说JVM内的解释器(Just In Time Compiler)和即时编译器(JIT)

作用:解释器和即时编译器(Just In Time Compiler,JIT)是JVM中将字节码转化为机器码的工具。


解释器: 解释器将字节码解析成集器能识别的机器码。解释方式是一行一行的读取,解释到哪就执行到哪。
即使编译器:以方法为单位,将热点代码的字节码一次性转为机器码,并在本地缓存起来的工具。避免了部分代码被解释器逐行解释执行的效率问题。

2.1 编译器

2.1.1 即时编译器种类

    C1
    C2

2.1.2 即时编译器 分层编译

    分层编译
        c1编译器是client模式下的即时编译器
            1、触发的条件相对C2比较宽松:需要收集的数据较少
            2、编译的优化比较浅:基本运算在编译的时候运算掉了 final
            3、c1编译器编译生成的代码执行效率较C2低
        c2编译器是server模式下的即时编译器
            1、触发的条件比较严格,一般来说,程序运行了一段时间以后才会触发
            2、优化比较深
            3、编译生成的代码执行效率较C1更高
        混合编译
            程序运行初期触发C1编译器
            程序运行一段时间后触发C2编译器

2.1.3 编译器与解释器关系

        即时编译器生成的代码就是给模板解释器用的

  • 解释器:程序执行的时候,解释器首先发挥作用,省去了编译器编译时间,加快程序的执行效率
  • 编译器:在程序运行过程中,随着时间的推移,编译器就开始慢慢发挥了作用,把热点代码编译成本地代码后,以后执行相同的代码,即可直接获取,更高的执行效率。
  • 解释器和编译器相互配合,使程序高效执行。

2.1.4 问题分享

分享阿里早年的一个故障
    热机切冷机故障: 冷机启动后有大量代码编译,造成cpu爆炸,机器宕机
        冷机:刚启动的时候
        热机:启动很长时间

2.1.5 热点代码存放位置

热点代码缓存区在 方法区,C++代码中以 CodeCache存在
调优中的一种
server编译器模式下代码缓存大小则起始于 2496KB

client编译器模式下代码缓存大小起始于 160KB

2.1.6 触发条件

热点代码被编译为 硬编码即汇编指令
热点代码
即时编译的最小单位不是一个函数,而是代码块 (for、while)

判断热点代码探测方法

采样式的热点探测

周期性检查线程栈顶,经常出现在栈顶的就是热点代码

  • 优点:简单高效。

  • 缺点:容易受到线程阻塞或其他因素影响

方法调用计数器

client 编译器模式下,N 默认的值 1500
Server 编译器模式下,N 默认的值则是 10000

可通过 -XX:CompileThreadhold设置,在一段时间内被调用次数。当超过一定的时间限度,如果方法的调用次数仍然不足以让它提交给即时编译器编译,那么这个方法的调用计数器就会被减少一半,这个过程称为方法调用计数器热度的衰减(Counter Decay),而这段时间就成为此方法的统计的半衰周期( Counter Half Life Time)。进行热度衰减的动作是在虚拟机进行垃圾收集时顺便进行的,可以使用虚拟机参数 -XX:CounterHalfLifeTime 参数设置半衰周期的时间,单位是秒。
 

回边计数器(Back Edge Counter )

        统计一个方法中循环体代码执行的次数,在字节码中遇到控制流向后跳转的指令称为“回边”( Back Edge )。显然,建立回边计数器统计的目的就是为了触发 OSR 编译。关于这个计数器的阈值, HotSpot 提供了 -XX:BackEdgeThreshold 供用户设置,但是当前的虚拟机实际上使用了 -XX:OnStackReplacePercentage 来简介调整阈值。

2.2 解析器

2.2.1 解释器种类

字节码解释器
Java字节码->c++代码->硬编码

模板解释器

Java字节码->硬编码

2.2.2 运行模式

解析器有三种运行模式
1、-Xint 纯字节码解释器
2、-Xcomp 纯模板解释器
    程序比较大
3、-Xmixed 字节码解释器 + 模板解释器

比较一下这三种运行模式的性能
231
321
与程序大小有关,程序较大时Xcomp会使程序变得更大,编译器很慢

三、逃逸分析

3.1 逃逸

什么对象不会逃逸

局部对象不会产生逃逸

什么对象会逃逸

共享变量,方法返回值,参数 会产生逃逸

3.2 分析 

三种手段

3.2.1 标量替换

public void test2() {
    System.out.println(EA);
    System.out.println(1);
}

3.2.2 锁消除

局部对象new Object(),锁被消除掉

public void test() {
    synchronized (new Object()){
        System.out.println("=============");
    }
}
public void test() {
     System.out.println("=============");
}

3.2.3 栈上对象分配

         不产生逃逸的方法内,对象会部分被分配到栈上面 

参考博客:JVM的mixed mode_yzpyzp的博客-CSDN博客

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

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

相关文章

高级DBA手把手教你解决clickhouse数据库宕机生产事故实战全网唯一

高级DBA手把手教你解决clickhouse数据库宕机生产事故实战演练 一、事故描述 生产环境clickhouse宕机&#xff0c;重启之后&#xff0c;反复重启&#xff0c;重启几秒钟又死了。甲方客户叫天&#xff0c;大老板火冒三丈&#xff0c;天下大乱。老板电话打过来&#xff0c;要求半…

webrtc源码阅读之examples/peerconnection

阅读webrtc源码&#xff0c;从examples中的peerconnection开始。版本m98。 一、 基本流程 server端只是做了一个http server&#xff0c;来转发client端的消息。也就是起到了信令服务器的作用&#xff0c;本篇文章不在研究&#xff0c;感兴趣的可以学习一下用cpp搭建http serv…

Mysql架构篇--Mysql(M-M) 主从同步

文章目录 前言一、M-M 介绍&#xff1a;二、M-M 搭建&#xff1a;1.Master1&#xff1a;1.1 my.cnf 参数配置&#xff1a;1.2 创建主从同步用户&#xff1a;1.3 开启复制&#xff1a; 2.Master2&#xff1a;2.1 my.cnf 参数配置&#xff1a;2.2 创建主从同步用户&#xff1a;2.…

飞桨携手登临解读软硬一体技术优势,共推AI产业应用落地

众所周知&#xff0c;AI应用落地面临着场景碎片化、开发成本高、算力成本高等诸多难题&#xff0c;这对AI框架与AI芯片都提出了非常高的要求&#xff0c;即既要满足端、边、云多场景的部署需求&#xff0c;还需要支持自动化压缩与高性能推理引擎深度联动。因此充分发挥软硬一体…

通过一个简单的例子理解 Python 中的多线程

关于进程和线程的概念可以看这篇文章: https://blog.csdn.net/ThinkWon/article/details/102021274 什么时候需要多线程编程&#xff1f;简单来说就是一个程序里面有比较耗时间的操作&#xff0c;你希望先让它单独跑着&#xff0c;直接开始进行下一步的操作&#xff08;Python默…

centos中部署调用matlab程序

环境&#xff1a; Java8 MATLAB2018b centos7 在本机环境上运行成功后的代码打包部署到服务器上运行会报错&#xff0c;需要在服务器上安装MATLAB的运行环境。 首先下载跟本机MATLAB环境一样的mcr文件。 打开网址 http://cn.mathworks.com/products/compiler/mcr/ 下载对…

Python调用百度地图API实现路径规划提取真实距离、时间

1.注册百度地图开放平台账号 网址&#xff1a;百度地图开放平台 | 百度地图API SDK | 地图开发 2.打开控制台&#xff0c;创建应用、获取AK 如下图所示 桥重点、敲重点、瞧重点 在使用python调用API端口时&#xff0c;我们需要申请的为服务端应用类别&#xff0c;别申请错了…

JS实现简单拼图游戏

JS实现简单拼图游戏 点击“打乱”按钮开始游戏&#xff1b;按下鼠标左键拖动一块到另一块上松开鼠标左键互换。游戏资源为一张图片 我这里名称为 2.jpg&#xff0c;将其与下面的网页文件放在同一目录中即可。 网页文件源码如下&#xff1a; <!DOCTYPE html> <html&…

Chapter 1: Introduction - Why Program? | Python for Everybody 讲义_Cn

文章目录 Python for Everybody课程简介适合所有人的 Python (Why Program?)为什么要学习写程序&#xff1f;创造力和动力计算机硬件架构了解编程单词和句子与 Python 对话术语&#xff1a;解释器和编译器Writing a program什么是程序&#xff1f;The building blocks of prog…

移远通信联合中国移动研究院等伙伴发布5G RedCap和车载模组白皮书

6月28日&#xff0c;在“2023年上海世界移动通信大会(MWC)”上&#xff0c;中国移动研究院联合移远通信等产业合作伙伴&#xff0c;共同发布了《5G RedCap轻量化通用模组技术要求白皮书》以及《车载模组技术发展白皮书》。 白皮书的发布为5G RedCap和车载领域技术和产业的进一步…

pdf加水印怎么加?一分钟学会!

在办公场景中&#xff0c;我们经常需要向客户或同事发送PDF格式的文件。这时就会面临一个问题&#xff1a;如何为我们的劳动成果打上个人烙印呢?答案是通过添加水印来满足我们的需求。但是&#xff0c;如何给PDF添加水印呢?难道要手动一个个添加吗?这无疑非常费力&#xff0…

整合来自多个Aurora数据库数据,亚马逊云科技为用户提供数据分析一体化融合解决方案

亚马逊云科技近日在沙利文联合头豹研究院发布的《2023年中国数据管理解决方案市场报告》中再次获评中国数据管理解决方案的领导者位置&#xff0c;并在增长指数和创新指数上获得最高评分。亚马逊云科技凭借其独特的数据服务和数据湖组合、全面的无服务器选项、打破数据传输壁垒…

ReentrantReadWriteLock源码

介绍 用一个变量如何维护多种状态 在 ReentrantLock 中&#xff0c;使用 Sync ( 实际是 AQS )的 int 类型的 state 来表示同步状态&#xff0c;表示锁被一个线程重复获取的次数。 但是&#xff0c;读写锁 ReentrantReadWriteLock 内部维护着一对读写锁&#xff0c;如果要用一…

软件自动化测试初学者忠告,错过就后悔了

目录 自动化测试进阶 自动化测试的层次 脚本 1-1 不要在实际项目中使用录制和回放 1-2 不要使用暂停 1-3 在循环中超时退出 1-4 不要将自动化测试完全等同于开发 1-5 不要写复杂的代码 1-6 验证逻辑条件的所有选项 1-7 使用编程规范 1-8 使用静态代码分析器 1-9 随…

Jmeter使用beanshell对接口加密,调用AES代码的jar包,CBC模式,有偏移量。

目录 前言&#xff1a; 这是AES加密代码 beanshell中的脚本 前言&#xff1a; 对接口进行加密是保障数据安全的重要措施之一。在JMeter中&#xff0c;你可以使用BeanShell脚本来实现对接口数据的加密处理。 工作中需要对接口进行AES加密&#xff0c;找开发要来了加密的代码…

PADS Logic的格点推荐设置

使用合适的格点大小能有效的提高我们设计的效率以及所设计文件的美观性。 第一步&#xff1a;执行菜单命令工具-选项&#xff0c;如图1所示 图1 设置选项示意图 第二步&#xff1a;在弹出的选项窗口常规栏中可以找到栅格设置&#xff0c;如图2所示&#xff0c;在设计中通常设置…

真无线蓝牙耳机排行榜10强,十款真无线蓝牙耳机盘点

为了帮助大家在这个充满选择的世界中找到最理想的蓝牙耳机&#xff0c;我们特别为您精心挑选了几款备受赞誉的产品&#xff0c;它们在音质、舒适度、功能和性价比等方面都有出色的表现。在本文中&#xff0c;我们将深入探讨这些蓝牙耳机的特点和优势&#xff0c;帮助您更好地了…

es学习知识汇总

es的索引库就相当于mysql的表 es的文档就相当于mysql的一条数据&#xff08;内容&#xff09; 用代码创建索引库到es 新增文档&#xff08;相当于mysql的一条数据&#xff08;内容&#xff09; 模拟将数据库中的到内容新增到es中 查询文档 注&#xff1a;以下 hotel为索引库名…

如何用迅捷PDF转换器在线压缩PDF文件

大家在工作中传输和保存PDF文件&#xff0c;有时发现PDF文件过大不利于保存&#xff0c;这种情况很多人都会对其进行压缩&#xff0c;但在压缩PDF大小的同时&#xff0c;大家也要注意PDF文件压缩后的质量&#xff0c;那么怎么才能又压缩大小&#xff0c;又能保持文件清晰度呢&a…

GitLab安装及代码管理

一、安装 环境&#xff1a;centos7 1.1、下载rpm安装脚本命令 curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash 上边命令里的rpm安装脚本地址可能会随时更新&#xff0c;当前需要用的是哪个地址&#xff0c;可以参考…