Skip to content

Latest commit

 

History

History
113 lines (99 loc) · 13.1 KB

JVM执行引擎、对象实例化、String相关知识.md

File metadata and controls

113 lines (99 loc) · 13.1 KB

目录

前言

大家好,我是苍何。最近思考了一个问题,为什么会出现公司面试造火箭,工作扭螺丝的现象,包括各种八股文的连环大绝杀问到你不会为主,其实这是考察你的知识面以及掌握的深度,而为什么需要这样呢?归其原因,无非是通过筛选找到那些会思考的人,他们需要的并不是CRUD的工具人,而是会思考能创新的工程师。

当你深刻理解到这点,我想不用刻意去学习,在工作中,肯定会吾日三省吾身。

于是乎,这个重新开始学习编程系列文章出来了。

愿与君共勉!

这是JVM系列文章的第二篇,主要是JVM执行引擎、对象实例化、String相关知识。

一、JVM执行引擎

执行引擎就是执行内存中的指令,将字节码指令解释/编译为对应平台上的本地机器指令,充当了将高级语言翻译为机器语言的使者。

1、执行引擎的工作过程

在这里插入图片描述

2、java代码编译和执行的过程

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3、什么是解释器,什么是编译器

在这里插入图片描述

4、为什么说java是半编译半解释型语言

在这里插入图片描述 在这里插入图片描述

5、机器码、指令、汇编语言、高级语言

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

6、HotSpot JVM执行方式

在这里插入图片描述 在这里插入图片描述

7、JIT编译器

在这里插入图片描述 在这里插入图片描述

8、方法调用计数器

在这里插入图片描述 在这里插入图片描述

二、对象实例化

1、创建对象的方式及创建对象步骤

在这里插入图片描述 指针碰撞:如果内存是规整的,那么虚拟机将采用的是指针碰撞法来为对象分配内存,用过的内存在一边,没用过的内存在另一边,中间有个指针,分配内存只需要移动指针即可。

2、对象内存布局

在这里插入图片描述 对象头里主要包含运行时元数据和类型指针,运行时元数据含GC分代年龄,锁状态标识、哈希值等

在这里插入图片描述

3、对象的访问定位

在这里插入图片描述 句柄访问: 堆中维护一个句柄池,对象的移动、只需改变句柄的指针值即可,不需要改变栈中的对象引用,效率要低一些

在这里插入图片描述 *直接指针:

在这里插入图片描述

三、String相关知识

1、String的基本特性

在这里插入图片描述 在这里插入图片描述

2、string的内存分配

JDK7及以后的版本字符创常量池在堆中,JDK7之前字符创常量池在永久代中。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3、字符串的拼接操作

整体而言,常量与常量相加,拼接结果放在常量池,只要其中有一个是变量,结果就在堆中

在这里插入图片描述

4、intern()的使用

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

对于程序中大量存在的字符串,尤其存在很多重复的字符串,使用intern()可以大大提高性能

在这里插入图片描述

5、G1的string去重操作

在这里插入图片描述 在这里插入图片描述