jvm学习的核心(四)---执行引擎和字符串

news2024/9/20 18:52:42

知识点总结于b站宋红康老师,视频链接

文章目录

  • 1.执行引擎
    • 1.1.执行引擎概述
    • 1.2.执行引擎的工作流程
    • 1.3.jvm的解释器和即时编译器(JIT)
      • 1.3.1.解释器,即时编译器概述
      • 1.3.2.常见即时编译器
      • 1.3.3.热点代码探测
  • 1.String Table
    • 1.1 string的基本特性
    • 1.2.string的不可变性
    • 1.3.string对象创建的理解

1.执行引擎

在这里插入图片描述

  1. 执行引擎是Java虚拟机核心的组成部分之一。
  2. “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。

1.1.执行引擎概述

  • JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被TVM所识别的字节码指令、符号表,以及其他辅助信息。
  • 那么,如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。

1.2.执行引擎的工作流程

在这里插入图片描述

  1. 执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于Pc寄存器。
  2. 每当执行完一项指令操作后,Pc寄存器就会更新下一条需要被执行的指令地址。
  3. 当然方法在执行的过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象实例信息,B以及通过对象头中的元数据指针定位到目标对象的类型信息。

1.3.jvm的解释器和即时编译器(JIT)

1.3.1.解释器,即时编译器概述

  • 解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。

  • JIT (Just In Time Compiler)编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。

    说人话就是解释器是用一行就解释一行,而jit则是把程序转换为底层的机器码后再用
    毫无疑问,由于即时编译器翻译了更多的底层语言,那么运行速度是要明显高于解释器的,但是它也需要花费更长时间进行编译,并且使用更多的内存,因此即时编译器在硬件充裕的服务器上是大量使用的

1.3.2.常见即时编译器

  • Java 语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个
    前端编译器(其实叫“编译器的前端”更准确一些)把.java文件转变成.class文件的过程;
  • 也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)
    把字节码转变成机器码的过程。
  • 还可能是指使用静态提前编译器(AOT编译器,Ahead of Time Compiler)直接
    把.java文件编译成本地机器代码的过程。

前端编译器: sun的 Javac、Eclipse JDT中的增量式编译器(ECJ)。JIT编译器:HotSpot VM的c1、c2编译器。
AOT编译器:GNU Compiler for the Java (GcJ) 、Excelsior JET。

1.3.3.热点代码探测

  • 一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为“热点代码”,因此都可以通过JIT编译器编译为本地机器指令。由于这种编译方式发生在方法的执行过程中,因此也被称之为栈上替换,或简称为oSR (on StackReplacement)编译。
  • 一个方法究竟要被调用多少次,或者一个循环体究竟需要执行多少次循环才可以达到这个标准?必然需要一个明确的阈值,JIT编译器才会将这些“热点代码”编译为本地机器指令执行。这里主要依靠热点探测功能。
  • 目前HotSpotVM所采用的热点探测方式是基于计数器的热点探测。
  • 采用基于计数器的热点探测,HotSpot VM将会为每一个方法都建立2个不同类型的
  • 计数器,分别为方法调用计数器(Invocation Counter)和回边计数器(Back
    Edge Counter) 。
  1. 方法调用计数器用于统计方法的调用次数
  2. 回边计数器则用于统计循环体执行的循环次数

1.String Table

1.1 string的基本特性

  1. string声明为final的,不可被继承
  2. string实现了serializable接口:表示字符串是支持序列化的。
  3. 实现了comparable接口:表示string可以比较大小
  4. string在jdk8及以前内部定义了final char[ ] value用于存储字符串数据。jdk9时改为byte[ ](更省内存)
  5. 字符串常量池中是不会存储相同内容的字符串的。
    string的string Pool是一个固定大小的Hashtable,默认值大小长度
    是1009。如果放进string Pool的string非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用string.intern时性能会大幅下降。
  6. 使用-xx :StringTablesize可设置stringTable的长度
  7. 在jdk6中stringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。stringTablesize设置没有要求在jdk7中,stringTable的长度默认值是60013,1009是可设置的最小值。

1.2.string的不可变性

  • string:代表不可变的字符序列。简称:不可变性。
  1. 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有
    的value进行赋值。
  2. 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  3. 当调用string的replace ()方法修改指定字符或字符串时,也需要
    重新指定内存区域赋值,不能使用原有的value进行赋值。
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

1.3.string对象创建的理解

1. 直接引用创建

String a = "123";
String b = "123";

第一次会把“123”放置到字符串常量池,因此a,b引用都指向同一个字符串对象。

2. ”+“拼接字符串

        String a = "123";
        String b = "345";
        String c = a + b;
        String d = "123" + "345";
        System.out.println(a + b == "123345"); //输出为false
        System.out.println(d == "123345");//输出为true   

当没有出现变量进行拼接时拼接完的字符串会放置到字符串常量池,一旦对象中出现变量,则会通过StringBuilder的append拼接两个字符串,然后通过toString方法再new出新的对象。

3. ”new String“拼接字符串

String a = new String("a");

new String创建两个对象,一个在常量池,一个在堆里。

String c = new String("a") + new String("b");

每个new String创建两个对象,最后通过 StringBuilder拼接,然后再通过toString取得新的字符串。(StringBuilder拼接得到的字符串不在常量池)

4. ”a.intern()“方法要点
a.intern()方法是如果常量池中有字符串则返回改字符串引用,反之则创建字符串放进常量池

注意:在jdk6中,该方法会在常量池没有该字符串的情况下,完全创建一个全新的字符串。而在jdk7以后,则常量池引用指向该对象,因此6的时候会多创建一个对象。

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

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

相关文章

Go语言基础入门第三章

常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 const identifier [type] value可以省略类型说明符[type],因为编译器…

法律常识(三)《合同法》中的借款合同租赁合同摘录

目录 参考 一、借款合同 二、租赁合同 参考 中华人民共和国合同法 一、借款合同 第一百九十六条 借款合同是借款人向贷款人借款,到期返还借款并支付利息的合同。 第一百九十七条 借款合同采用书面形式,但自然人之间借款另有约定的除外。借款合同…

瑞吉外卖 对象转换器 公共字段自动填充 文件上传/下载

https://blog.csdn.net/weixin_43715214/category_12022798.html大佬记录项目介绍day01功能架构(1)用户层本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI等技术。而在构建移动端应用时,我们会使用到微信小…

Red Giant Magic Bullet Suite介绍

Red Giant Magic Bullet Suite介绍什么是Magic Bullet SuiteMagic Bullet Suite功能介绍什么是Magic Bullet Suite Magic Bullet Suite是电影制作人不可或缺的一套调色降噪插件,它能够为您制作出和好莱坞一样的效果,为电影制作人提供专业的色彩校正。可…

excel函数应用:最简单的条件求和函数DSUM

SUM系列求和函数是我们日常工作中最常用的函数,相信大部分朋友对SUMIF、SUMIFS、SUMPRODUCT等函数都已经比较熟悉了。但是有一个求和函数大家可能都不熟悉,它就是DSUM函数,用于求数据库中记录的满足给定条件的的字段(列&#xff0…

在中国社科院与美国杜兰大学金融管理硕士项目就读,重焕青春活力

在职场摸爬滚打多年后的你,是否有觉得内心疲惫? 是否进入到职场倦怠期?今天是春节后的首个工作日,新的一年意味着新的开始。你有想过在职继续攻读硕士学位吗?在中国社科院与美国杜兰大学金融管理硕士项目就读&#xff…

vue中实现打印

一、VUE 集成 LODOP插件打印 VUE 集成LODOP插件打印 Lodop、C-Lodop使用说明及样例 C-Lodop插件官网:功能演示 - Lodop和C-Lodop官网主站 参考文章:VUE 集成 LODOP插件打印_廷贺的博客-CSDN博客 二、winodw.print() 打印 print() 方法用于打印当前…

vs2015软件打包及常见问题解决方法

一、如程序文件是64位,而项目设置32位,打包项目编译时遇到如下问题 解决办法:选择打包程序项目的属性窗口设置TargetPlatform属性为对应的值,本项目的文件是64位的所以设置打包生成的程序为64位的,如下: …

【可解释性机器学习】排列重要性(Permutation Importance)及案例分析详解

Permutaion Importance:排列重要性引言工作原理代码示例排列重要性结果解读模型检验特征选择补充分析Partial Dependency PlotSharpley ValueLIME总结参考资料当训练得到一个模型之后,除了对模型的预测感兴趣之外,我们往往还想知道模型中哪些…

DDOS渗透与攻防(三)之socktress攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 DDOS渗透与攻防(二)之SYN-Flood攻击 socktress攻击 攻击协议原理介绍说明-socktress 2008年有Jack C.Louis发现,针对TCP服务的拒绝服务攻击: 消耗被攻击目标系统资源,与攻击目标建立…

xml配置JedisUtil

一.背景 习惯了Bean注解方式往sping容器中注入对象,现使用xml方式注入Bean对象总结下,顺便用帮女朋友解决的Jedis问题当做案例来总结。 二.配置JedisPool 从源码来看,JedisPool的构造函数有N多种 我们使用如下的构造函数来实例化JedisPool…

docker部署Nginx和Tomcat

文章目录 前言 目录 文章目录 前言 一、docker部署Nginx 二、docker部署Tomcat 总结 一、docker部署Nginx 下载镜像:docker pull nginx 后台运行镜像 -d 后台运行 --name"nginx01" 给容器命名 -p 宿主机端口:容器内部端口 docker run -d --name"…

2.SpringAop的jdkcglib动态代理xml注解实现切面

1.Spring 的 AOP 简介 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是…

Linux常用命令——rsync命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rsync 远程数据同步工具 补充说明 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步&#xff0c…

ARMv8 AArch64异常处理机制概览

1 处理机制概述 相对于ARMv7中的异常向量表(Exception Vector Table),ARMv8异常处理机制更为复杂,涉及处理器的异常等级(Exception Levels, ELn)、运行状态(Execution States)和安全…

汉字乱码状态下的编码转换将导致的问题

实验工具notepad编辑器实验过程步骤1:打开notepad,新建一个文本文件,在其中输入一段汉字文本,查看当前编码格式,如下:分析:由上图可见,从右下角可知当前文件是以UTF-8解码显示的&…

微信小程序——页面事件,.启用下拉刷新监听页面的下拉刷新事件,上拉触底事件,停止下拉刷新的效果

一.页面事件1.什么是下拉刷新下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。2.启用下拉刷新启用下拉刷新有两种方式:a.全局开启下拉刷新在 app.json 的window 节点中,将 enableP…

python 蓝桥杯 矩阵拼接

问题描述已知 3 个矩形的大小依次是 a_{1} \times b_{1}, a_{2} \times b_{2}a1b1,a2b2 和 a_{3} \times b_{3}a3b3 。用这 3 个矩形能拼 出的所有多边形中, 边数最少可以是多少?例如用 3 \times 232 的矩形(用 A 表示)、 4 \times 141 的矩形 (用 BB 表示) 和 2 \…

法律常识(一)婚姻法全文

目录 参考 第一章 总 则 第二章 结 婚 第三章 家庭关系 第四章 离 婚 第五章 救助措施与法律责任 第六章 附 则 参考 中华人民共和国婚姻法http://www.gqb.gov.cn/node2/node3/node5/node9/node101/userobject7ai1290.html 《图解中华人民共和国婚姻法》 &#xff…

[架构之路-92]:《软件架构设计:程序员向架构师转型必备》-2-解析软件架构的概念

前言:什么是软件架构?不同的人,有不同的答案。因为架构无处不再,架构又有不同层面。很多人都给架构定义,不同的人,对架构有不同的理解,很难统一。本文是按照作者个人的理解,来展现一…