jvm阶段小节

文章目录

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

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

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

动态链接 :

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

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

对象分配的过程

快速分配策略TLAB

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

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

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

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

相关推荐
白日梦想家681几秒前
JavaScript性能优化实战系列(三篇完整版)
开发语言·javascript·性能优化
请注意这个女生叫小美几秒前
C语言 实例20 25
c语言·开发语言·算法
fundroid2 分钟前
Kotlin 泛型进阶:in、out 与 reified 实战
android·开发语言·kotlin
奋斗的小方3 分钟前
01 一文读懂UML类图:核心概念与关系详解
java·uml
m0_706653234 分钟前
用Python创建一个Discord聊天机器人
jvm·数据库·python
枫叶丹45 分钟前
【Qt开发】Qt系统(十一)-> Qt 音频
c语言·开发语言·c++·qt·音视频
长安城没有风8 分钟前
Java 高并发核心编程 ----- 线程池原理与实践(上)
java·juc
Remember_9938 分钟前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
tlwlmy9 分钟前
python excel图片批量导出
开发语言·python·excel
散峰而望11 分钟前
【基础算法】穷举的艺术:在可能性森林中寻找答案
开发语言·数据结构·c++·算法·随机森林·github·动态规划