当前位置: 首页 > news >正文

JVM-程序计数器与栈

目录

  • 程序计数器
    • 1:作用:
    • 2:特点:
      • 1:线程私有
      • 2:内存不会溢出
    • 1:介绍:
    • 2:问题辨析:

程序计数器

1:作用:

程序计数器的作用就是记录下一条jvm指令的执行地址,由解释器读取,物理上的结构是寄存器;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具体是这样的:首先将java源代码编译成二进制字节码,二进制字节码就是一些jvm指令,然后解释器会将jvm指令解释成机器码再由cpu读取,而解释器就是从程序计数器获取下一条jvm命令的执行地址。

2:特点:

1:线程私有

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线程通过cpu的调度器来调度,调度器分给线程时间片,当时间片结束的时候会切换到其他线程,所以每个线程都需要一个程序计数器来保存下一条jvm的执行地址。故程序计数器是线程私有的,每个线程都有自己的程序计数器;

2:内存不会溢出

1:介绍:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

栈是一个线程运行时所需要的内存空间;

栈帧:一个方法运行所需要的内存空间;

方法执行:方法1执行,栈帧1入栈,方法1调用方法2,栈帧2入栈,方法2调用方法3,栈帧3入栈,栈帧3执行完结果返回给方法2,方法2执行完结果再返回给方法1;依次出栈

2:问题辨析:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先第一个问题:垃圾回收不会涉及到栈内存,因为栈帧执行完出栈会自动释放内存;

第二个问题:栈内存分配的越大越好嘛?并不是,因为栈内存是每个线程占用的内存大小,如果栈内存变大,总内存不变,那么线程数量会变少。我们可以通过-xss参数来设置栈内存大小,linux和mac默认的栈内存的大小都是1mb;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三个问题:判断局部变量是否线程安全就是要确定这个变量是每个线程私有的还是共有的。如果不是static,那么因为每个线程都会单独开一个栈,多个线程不会有影响,如果是static,那么因为是公共的就会有线程安全问题;

第三个问题再加上扩展:

如果局部变量没有逃离方法的作用范围就是线程安全的。

如果局部变量逃离了方法的作用范围就是线程不安全的;

http://www.lryc.cn/news/498346.html

相关文章:

  • 【kotlin 】内联类(value class / inline class)
  • 【SpringBoot】使用IDEA创建SpringBoot项目
  • C++设计模式(原型、代理、适配器、组合)
  • 如何在CentOS 7上使用FreeIPA设置集中式Linux身份验证
  • vue2播放视频和预览文件的组件以及使用方法
  • 性能之巅:Go语言优化深度探索
  • react + antd desgin 使用form功能时upload,radio,checkbox不能回显的问题
  • 【08】MySQL复杂查询:子查询语句详解与示例
  • Unity 相机旋转及角度限制
  • error=‘null‘], commandType=io.lettuce.core.RedisPublisher$SubscriptionCommand]
  • Golang 字符串字面量表示方法
  • 03_Webpack模块打包工具
  • 【目标跟踪】AntiUAV600数据集详细介绍
  • 十、JavaScript的应用的习题
  • 【Spring】AOP
  • 三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)
  • 鸿蒙Next通过oss上传照片到阿里云
  • 小白爬虫——selenium入门超详细教程
  • nlp培训重点
  • 什么是多模态和模态
  • apache中的Worker 和 Prefork 之间的区别是什么?
  • 系统监控——分布式链路追踪系统
  • 【Python]深入Python日志管理:从logging到分布式日志追踪的完整指南
  • DHCP Client的工作方式
  • docker-常用应用部署dockerfile模板
  • Unity3D学习FPS游戏(13)玩家血量控制
  • TDesign:Switch开关
  • AI在SEO中的应用与关键词优化探讨
  • [docker中首次配置git环境与时间同步问题]
  • 使用lumerical脚本语言创建绘制波导并进行数据分析(纯代码实现)(1)