java全局变量与局部变量分别存储在哪个区域

小编 2107

java全局变量一般存储在静态区,局部变量一般存储在栈区。此外,如果涉及基本类型的局部变量,其变量名和值都会存储在虚拟机栈中;而引用类型的局部变量,会把其指向对象存储在堆中,并把这个对象的引用(指针)ss存储在栈中。

1.java全局变量的存储区域

在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。在java中,全局变量是存储于静态数据区中。

2.java局部变量的存储区域

在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量。局部变量是存储在动态数据区的栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

对于局部变量,如果是基本类型,会把值直接存储在栈中;如果是引用类型,比如String ss = new String(“william”),会把其对象存储在堆中,而把这个对象的引用(指针)ss存储在栈。由于指针是私有的,栈销毁后,在内存的中对象没有其他的引用,就会被收回,因此局部变量的生命周期比较短,就是栈的生命周期。

延伸阅读

Java的内存划分为哪几个部分

Java的内存需要划分成为五个部分,包括栈(stack)、堆(Heap)、方法区(Method Area)、本地方法栈(Native Method Stack)、寄存器(pc Register)。

1.java堆

对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。

2.Java虚拟机栈

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧 (Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

3.方法区

方法区用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。方法区是按照内存的作用进行划分的区域,永久代是按照垃圾回收的机制划分的区域。

4.程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里 ,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。

5.本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

6.运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部