欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > JVM-程序计数器与栈

JVM-程序计数器与栈

2025/2/23 23:59:45 来源:https://blog.csdn.net/2301_79748665/article/details/144271343  浏览:    关键词: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,那么因为是公共的就会有线程安全问题;

第三个问题再加上扩展:

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com