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

这篇具有很好参考价值的文章主要介绍了JVM 常量池、即时编译与解析器、逃逸分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、常量池 

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

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即使编译器)—该过程需要调用核心类JVM 常量池、即时编译与解析器、逃逸分析,jvm

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

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


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

2.1 解析器

2.1.1 解释器种类

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

模板解释器

Java字节码->硬编码

2.1.2 运行模式

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

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

2.2 编译器

2.2.1 即时编译器种类

    C1
    C2

2.2.2 即时编译器 分层编译

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

2.2.3 编译器与解释器关系

JVM字节码解释器负责解释执行Java字节码。它逐条解释字节码指令,并将其转换为机器代码以在底层硬件上执行。字节码解释器的优点是它可以立即执行字节码,无需等待编译过程。
即时编译器(JIT),它负责将字节码转换为本地机器代码。即时编译器在运行时动态地将热点代码(频繁执行的代码)编译成机器码,以提高执行速度。它通过分析代码的执行情况和优化技术来生成高效的机器码。即时编译器的主要优势是它可以将热点代码编译成高度优化的机器码,从而提高程序的执行性能。

  • 解释器:程序执行的时候,解释器首先发挥作用,省去了编译器编译时间,加快程序的执行效率
  • 编译器:在程序运行过程中,随着时间的推移,编译器就开始慢慢发挥了作用,把热点代码编译成本地代码后,以后执行相同的代码,即可直接获取,更高的执行效率。
  • 解释器和编译器相互配合,使程序高效执行。
  • 字节码解释器在程序启动时负责执行字节码,而即时编译器则在运行时对热点代码进行编译优化。两者共同工作,以提供高性能的Java程序执行环境。

2.2.4 问题分享

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

2.2.5 热点代码存放位置

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

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

2.2.6 触发条件

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

判断热点代码探测方法

采样式的热点探测

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

  • 优点:简单高效。

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

方法调用计数器

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

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

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

回边计数器(Back Edge Counter )

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

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

三、逃逸分析

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博客文章来源地址https://www.toymoban.com/news/detail-516370.html

到了这里,关于JVM 常量池、即时编译与解析器、逃逸分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(一)

    Java语言是最为流行的面向对象编程语言之一, Java运行时环境(JRE)拥有着非常大的用户群,其安全问题十分重要。近年来,由JRE漏洞引发的JVM逃逸攻击事件不断增多,对个人计算机安全造成了极大的威胁。研究JRE安全机制、JRE漏洞及其挖掘、JVM逃逸攻防技术逐渐成为软件安

    2024年02月11日
    浏览(32)
  • jvm 什么是常量池,常量池定义 class常量池

    首先需要理解下Java的class文件,以及class文件结构: 1. Class文件 是一组以8个字节为基础单位的 二进制流 ,各个数据项目严格按照顺序紧凑地排列在文 件之中, 中间没有任何分隔符 ,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据, 没有空隙存在 。当遇到

    2024年02月11日
    浏览(38)
  • JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)

    先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm) 堆内存是各个线程共享的区域 它用于存储已经被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区 这里解释一下方法

    2023年04月14日
    浏览(52)
  • JVM运行时数据区——字符串常量池位置的调整

            在JDK6及之前,使用永久代来实现方法区,字符串常量池(StringTable)是在 永久代(方法区)中 的,但是方法区的回收效率不高,在Full GC时才会回收。           在JDK7中,将字符串常量池 转移到了堆中 ,分配在年轻代和老年代中。         在JDK8中,为了 融合

    2024年02月16日
    浏览(33)
  • JVM中的编译器

    JVM中集成了两种编译器,Client Compiler和Server Compiler,它们的作用也不同。Client Compiler注重启动速度和局部的优化,Server Compiler则更加关注全局的优化,性能会更好,但由于会进行更多的全局分析,所以启动速度会变慢。两种编译器有着不同的应用场景,在虚拟机中同时发挥作

    2023年04月20日
    浏览(36)
  • 深入理解 JVM 之——动手编译 JDK

    更好的阅读体验 huge{color{red}{更好的阅读体验}} 更好的阅读体验 本篇为深入理解 Java 虚拟机第一章的实战内容,推荐在学习前先掌握基础的 Linux 操作、编译原理基础以及扎实的 C/C++ 功底。 该系列的 GitHub 仓库:https://github.com/Doge2077/learn-jvm 系统准备 在官方文档上要求编译

    2024年02月10日
    浏览(34)
  • 形象谈JVM-第二章-认识编译器

    我在上一章《形象谈JVM-第一章-认识JVM》提到的“翻译”,其实就是我们今天所说的“编译”的概念。 上一章原文链接:https://www.cnblogs.com/xingxiangtan/p/17617654.html 原文: 【 虚拟机的职责是将字节码翻译成对应系统能够识别并执行的机器码, 比如在linux系统,java文件被javac编译

    2024年02月13日
    浏览(41)
  • 一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

    JVM : Java Virtual Machine ,也就是 Java 虚拟机 所谓虚拟机是指:通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即:虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中,且它的硬件系统功能是通过软件模拟出来的。 JVM 通

    2024年01月23日
    浏览(49)
  • 学习笔记-JVM-工具包(JVM分析工具)

    常用工具 JDK工具 ① jps: JVM Process status tool:JVM进程状态工具,查看进程基本信息 ② jstat: JVM statistics monitoring tool : JVM统计监控工具,查看堆,GC详细信息 ③ jinfo:Java Configuration Info :查看配置参数信息,支持部分参数运行时修改 ④ jmap:Java Memory Map :分析堆内存工具,du

    2024年02月13日
    浏览(69)
  • 【JVM学习】Class文件解析

    最近为了加深对于JAVA的理解,在复习JVM,这里面的内容大部分都是比较确定的、文档性质的内容,目前并没有特别的总结。但是看到类文件结构,手痒,想写了个解析文件的解析器,那就简单记录下吧。 详细内容不记了,太多了,有兴趣的同学看虚拟机相关书籍了解,这里

    2023年04月13日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包