黑马JVM总结(二)

(1)栈

栈帧对应一次方法的调用,线程是要执行代码的,这些代码都是由一个个方法组成,线程运行的时候每个方法需要的内存叫做一个栈帧

(2)栈的演示

Frames:相当有栈 方法相当于栈帧,Variables:方法的参数

活动栈帧在我们栈的顶部正在执行的栈帧叫做活动栈帧

method2栈帧执行完释放掉出栈

method1:执行完出栈

主方法再执行,执行结束

(3) 栈的问题辨析

1.栈帧内存在每一次方法结束后都会弹出栈,会自动的被回收掉,不需要垃圾回收管理栈内存

2.栈划分的越大,反而会使线程数变少,划分大了只是能够进行更多次的方法递归调用,并不是划分越大越好,增强运行的效率

3.需要看多个线程对这个变量时共享的或者这个变量对你每个线程是私有的

比如说多个线程调用这个方法,会不会造成 x值的混乱呢?不会的因为x变量是方法内的局部变量,一个线程对应一个栈,线程内每一次方法的调用都会产生一个新的栈帧 ,他们是互不干扰的

如果变量时static的:如果不加线程安全 保护的话,就会产生线程安全问题

如果是共享的需要考虑线程安全问题,你是每个线程私有的就不用考虑线程安全问题

(4)栈问题辨析-线程安全

m1方法不会产生线程安全问题,因为sb是线程内的一个局部变量,是属于每个线程私有的,是线程安全的

m2:不是线程安全的,因为作为方法的参数,意味着可能有其他的线程可能访问到它,他就不是线程私有的啦对多个线程是一个共享的

m3:也不是线程安全的,因为他把结果对象返回啦,其他线程可能拿到这个参数进行修改

main方法中把它作为参数进行修改,其他线程也进行修改,它就是线程共享的啦,多个线程共享一个对象,需要使用StringBuffer

相关推荐
CodeStats2 小时前
【Java 类加载器】Java 类加载器完整体系深度拆解(上):从 JVM 启动到双亲委派模型
java·开发语言·jvm·classloader·双亲委派
CodeStats3 小时前
【Java类加载器】Java 类加载器完整体系深度拆解(下):自定义加载器实战与 SPI 破坏双亲委派(MySQL 驱动揭秘)
java·开发语言·jvm·classloader·双亲委派
Nuanyt6 小时前
JVM常见核心知识梳理02 类加载 字节码技术 双亲委派 Java内存模型 JMM 并发底层 volatile synchronized 常见排障与调优工具
java·开发语言·jvm
焦虑的说说7 小时前
jvm知识汇总
jvm
头茬韭菜9 小时前
第 1 篇:「架构鸟瞰与 Memory 初始化」—— 从 pip install 到三个工厂
jvm·架构·pip·mem0
程序员清风9 小时前
从 JVM 内存模型到 GC 调优:Java 服务性能优化实战
java·jvm·性能优化
OpenAnolis小助手21 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小七在进步1 天前
C++入门(2)
java·jvm·c++
zuozong_1 天前
内存的管理
jvm
SKH.1 天前
网络(5)数据库
jvm·数据库