java里的静态变量是放在了堆内存还是栈内存
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方败首裂法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所芹神有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如察闭class,static变量。
静态变量与非静态变量的区别
1、存储位置不同
静态变量:存储在全局数据区(静态数据区)。
非静态变量叫动态变量:存储在内存出栈数据区。
2、生命期不同
动态变禅唤誉量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效。
静态变量:程序结束时才释放。
3、作用域不同
动态变量:同样的要根据你定义的位置才能确定,和第二点的一样。
静态变量:当前文件中有效。
扩展资料;
静态变量的作用;
1、对于静态全局变量,源文件静态声明的文件级变量和函数的作用域仅限于文件(仅在文件中可见),即内部连接,因此可以用来限制变量的作用域。
2、对于静态局部变量,虽然函数内静态声明的变量范围与自动局部变量的范围相同(即范围仅在函数内),但存储空间是通过静态分配而不是默认的自动分配获得的。
所以存储空间在不同的区域是不同的(一般来说,静态链竖分配时在编译时在程序数据段中划分存储空间,一次性分配在整个过程中是有效的。而在自动分配时,存储空间是在调用堆栈上分配的,只分配和释放在调用期间),两个调用之间的变量值总是一致的。必须注意,静态局部变量只能初始化一次,这是由编译器保证的。
3、对于静态成员变量,在C++中,类定义中静态声明的成员变量属于类变量,即它们在所有类实例中共享,相反是过程变量。
参考资料来源;百度百科——静态变量
百度百贺段科——动态变量
C语言中 局部变量和全局变量都是存储在什么区
C语言中局部变量存在栈里,全局变量存静态存储区。
局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
扩展资料
C语言中局部变量和全局变量示例:
#includestdio.h
#includemalloc.h
staticints1=0,s2=0,s3=0;//静态变量放在静态区
intg1=0,g2=0,g3=0;//全局变量放在静态区
voidmain()
{
staticints4=0,s5=0,s6=0;spanstyle=font-family:Arial,Helvetica,simsun,u5b8bu4f53;/span//静态变量
inta1=0,a2=0,a3=0;spanstyle=font-family:Arial,Helvetica,simsun,u5b8bu4f53;/span//局部变量友锋放在栈运皮区
charc1[]=aabb;//局部变量放在栈区
char*c2=aabb;//字符常量放在静态区
char*m1=(char*)malloc(1);//堆区
char*m2=(char*)malloc(1);//堆区
char*m3=(char*)malloc(1);//堆区
printf(动态数据区\n);
printf(a1\na2\na3\n,a1,a2,a3);
printf(c1\n,c1);
printf(m1\nm2\nm3\n,m1,m2,m3);
printf(静态数据区\n);
printf(好悄晌s1\ns2\ns3\n,s1,s2,s3);
printf(g1\ng2\ng3\n,g1,g2,g3);
printf(s4\ns5\ns6\n,s4,s5,s6);
printf(c2\n,c2);
}
