| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> JVM执行引擎、及基于JVM的对象的实例化过程 -> 正文阅读 |
|
[Java知识库]JVM执行引擎、及基于JVM的对象的实例化过程 |
目录 在介绍JVM执行引擎前我们先了解一下JVM的整体结构: 总体分为三个部分:类加载子系统(Class Loader Subsystem)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine) java程序执行过程:java程序经过编译后产生字节码文件(Class Files),字节码文件通过类加载器的(加载、链接、初始化)步骤加载进内存,然后执行引擎通过和运行时数据区的交互解释并执行文件。
一、执行引擎?【概述】 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎地结构体系,能够执行那些不被硬件直接支持地指令集格式。 要想了解执行引擎是用来做什么的,我们先来看一看JVM虚拟机想要做什么? ????????JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他的辅助信息。 【执行引擎的结构】 执行引擎包括三部分:解释器、JIT编译器(即时编译器)、垃圾回收器 【执行引擎工作过程】 ?执行引擎就是根据PC寄存器中的下一条指令的地址取得相应的指令,然后执行一条条的字节码指令,从而完成栈中一系列的操作(入栈、出栈)。 ?从外观上看,所有的Java虚拟机的执行引擎的输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。 【解释执行和JIT即时编译】 下图是Java代码编译和执行的过程: ?解释执行需要通过解释器完成,JIT即时编译需要通过JIT编译器完成。那什么是解释器?什么是JIT编译器呢?
? 对于HotSpot VM是目前市面上高性能虚拟机代表作之一。它采用解释器与即时编译器并存的架构。在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短,尽力去选择最合适的方式来权衡编译本地代码的时间和直接解释执行代码的时间。 对于HotSpot JVM来说,会随着程序运行时间的推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。 二、对象的实例化过程【对象创建的常见方式】:
【对象创建的六个步骤】:
【对象的内存布局】 【对象的访问定位】 对象的访问方式主要有两种:句柄访问、直接指针 句柄访问: 直接指针: 三、StringTableString字符串,使用一对""引起来表示。实现了Serializable接口,表示字符串是支持序列化的;也实现了Comparable接口,表示String可以比较大小。String声明为final,不可以被继承。在jdk8以前,其内部定义了final char[] value用于存储字符串数据,jdk9时改为bute[]。 定义String对象的两种方式:
【String的内存分配】
【字符串拼接操作】 字符串拼接面试常见问题:
变量字符串相加的底层原理:是创建了一个StringBuilder对象(jdk5.0之后,之前用的是StringBuffer),并通过调用其 append() 方法将两个字符串添加进字符串缓冲区,最后调用 toString() 方法(类似于new String()),转换为字符串。 如果字符串拼接符号两边都是字符互传常量或常量引用(final修饰),则仍然使用编译期优化,即非StringBuilder的方式。
【intern()的使用】 即保证变量s指向的是字符串常量池中的数据的两种方式:
下面来一道看似简单,但你大概率做不对的面试题:
在解答上述问题前,再抛出一个问题: new String("ab");创建了2个对象:
new String("a") + new String("b");创建了6个对象:
强调:在最后一步toString()方法的调用,不会在字符常量池中在生成"ab"对象 在弄明白这两件事后,我们就很容易地能够弄清楚第一个问题:
下面我们逐行解释一下代码:
下面是在 jdk6 和?jdk7 环境下的图解: ? 对于程序中大量存在的字符串,尤其其中存在很多重复字符串时,使用intern()方法可以节省很多内存空间。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:01:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |