jvm阶段小节

文章目录

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

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

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

动态链接 :

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

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

对象分配的过程

快速分配策略TLAB

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

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

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

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

相关推荐
向上的车轮2 分钟前
基于Java Spring Boot的云原生TodoList Demo 项目,验证云原生核心特性
java·spring boot·云原生
Elnaij4 分钟前
从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元
开发语言·c++
程序员清风4 分钟前
快手一面:为什么要求用Static来修饰ThreadLocal变量?
java·后端·面试
逍遥德5 分钟前
Java8 Comparator接口 和 List Steam 排序使用案例
java·spring boot·list·排序算法
chen_ever15 分钟前
golang之go modules
开发语言·后端·golang
郝学胜-神的一滴22 分钟前
Effective Modern C++ 条款26:避免在通用引用上重载
开发语言·c++·程序人生
前行的小黑炭23 分钟前
Android :如何快速让布局适配手机和平板?
android·java·kotlin
草莓熊Lotso25 分钟前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
_BugMan1 小时前
【IDEA】干活?一个IDEA即可,集成开发平台打造攻略
java·ide·intellij-idea
Aczone281 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法