大家好,我是苍何。最近思考了一个问题,为什么会出现公司面试造火箭,工作扭螺丝的现象,包括各种八股文的连环大绝杀问到你不会为主,其实这是考察你的知识面以及掌握的深度,而为什么需要这样呢?归其原因,无非是通过筛选找到那些会思考的人,他们需要的并不是CRUD的工具人,而是会思考能创新的工程师。
当你深刻理解到这点,我想不用刻意去学习,在工作中,肯定会吾日三省吾身。
于是乎,这个重新开始学习编程系列文章出来了。
愿与君共勉!
这是JVM系列文章的第二篇,主要是JVM执行引擎、对象实例化、String相关知识。
执行引擎就是执行内存中的指令,将字节码指令解释/编译为对应平台上的本地机器指令,充当了将高级语言翻译为机器语言的使者。
指针碰撞:如果内存是规整的,那么虚拟机将采用的是指针碰撞法来为对象分配内存,用过的内存在一边,没用过的内存在另一边,中间有个指针,分配内存只需要移动指针即可。
对象头里主要包含运行时元数据和类型指针,运行时元数据含GC分代年龄,锁状态标识、哈希值等
句柄访问: 堆中维护一个句柄池,对象的移动、只需改变句柄的指针值即可,不需要改变栈中的对象引用,效率要低一些
JDK7及以后的版本字符创常量池在堆中,JDK7之前字符创常量池在永久代中。
整体而言,常量与常量相加,拼接结果放在常量池,只要其中有一个是变量,结果就在堆中
对于程序中大量存在的字符串,尤其存在很多重复的字符串,使用intern()可以大大提高性能