jvm阶段小节

文章目录

静态变量与局部变量的对比:

我们知道类变量有两次初始化的机会,第一次是在"准备阶段"(链接),执行系统初始化,对类变量设置默认值,另一次则是在"初始化"阶段,赋予程序员在代码中定义的初始值。

和类变量初始化不同的是,局部变量表不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。

动态链接 :

每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。(运行时常量池在方法区里面,元空间)包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。比如:invokedynamic 指令

在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 class 文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用(#------>>>具体名字)。

对象分配的过程

快速分配策略TLAB

对象都是在堆中进行分配吗?
口述不一定,大部分是在堆中分配,也可能在栈上分配,也是为了提高性能,只要经过逃逸分析后确定这个对象只在方法内部有效,不会对外界产生影响,那么就可以将这个对象分配到栈上,对象它也会随着方法调用结束而消失,不会触发GC,提高了性能。

结论:开发中能使用局部变量的,就不要使用在方法外定义。 :

为什么:口述:尽量声明为局部变量有两个方面吧,第一个是线程安全的角度,比如说一个类中我们不声明为局部变量而是声明为类的成员属性时,那如果很多方法访问到它时,多线程环境下同时对它读写,所以可能会引发线程安全问题,那如果声明为局部变量的话,可以将它的作用域范围限制在 一个方法内,可以在一定程度来去避免这种线程安全问题,当然也不一定能解决,还得看方法参数传递呀等等具体情况的话不一样,但是声明这个局部变量的话也其实是线程安全的一种解决思路。第二个方法是GC方面,局部变量比如说我们new对象的话,那它如果在局部变量中声明并且经过逃逸分析后不会逃逸,那么其实对它的内存分配就不是在堆中了,而是在栈上分配,局部变量随着栈消亡而回收,不同像堆那样进过GC,进一步提高了性能。

栈、堆、方法区的交互关系

相关推荐
惜茶7 分钟前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
宁瑶琴20 分钟前
COBOL语言的云计算
开发语言·后端·golang
杰克尼43 分钟前
springCloud_day07(MQ高级)
java·spring·spring cloud
小陈工1 小时前
2026年4月2日技术资讯洞察:数据库融合革命、端侧AI突破与脑机接口产业化
开发语言·前端·数据库·人工智能·python·安全
Zarek枫煜1 小时前
C3 编程语言 - 现代 C 的进化之选
c语言·开发语言·青少年编程·rust·游戏引擎
阿kun要赚马内1 小时前
Python中元组和列表差异:底层结构分析
开发语言·python
NHuan^_^2 小时前
SpringBoot3 整合 SpringAI 实现ai助手(记忆)
java·人工智能·spring boot
前进的李工2 小时前
MySQL大小写规则与存储引擎详解
开发语言·数据库·sql·mysql·存储引擎
Mr_Xuhhh2 小时前
从ArrayList到LinkedList:理解链表,掌握Java集合的另一种选择
java·数据结构·链表