1. java静态属性和静态方法仅属于类的一个具体对象么它属于谁
它属于这个类,不属于某个对象。它在内存里跟类的定义信息放在一个区域,而对象是放在另一个区域的
2. java静态变量存储在哪个区
java程序在内存中的存储分配情况:
一、堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 ujiuye
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 ujiuye
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
二、内存分区
而内存分为四个区:stack segment,heap segment,data segment,code segment;
stack 区存放函数参数和局部变量;heap 区存放对象;data 区存放static 的变量或者字符串常量; code 区存放类中的方法;
因此,静态变量是存放在data区的 !
3. 静态变量存储在哪个区
对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。
动态数据区一般就是“堆栈”。 栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。
全局变量和静态变量分配在静态数据区(全局区),本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
4. java中,静态变量存储在哪个区啊,堆还是栈啊,或者说其他地方,谢谢
首先,java里面是没有静态变量这个概念的,不信你自己在方法里面定义一个static
int
i
=0;java里只有静态成员变量。它属于类的属性。至于他放在那里?楼上说的是静态区。我不知道到底有没有这个翻译。但是
深入jvm里是是翻译为方法区的。虚拟机的体系结构:堆,方法区,本地方法栈,pc寄存器。而方法区保存的就是一个类的模板,堆是放类的实例的。栈是一般来用来函数计算的。随便找本计算机底层的书都知道了。栈里的数据,函数执行完就不会存储了。这就是为什么局部变量每一次都是一样的。就算给他加一后,下次执行函数的时候还是原来的样子。
5. 静态变量存储在哪个区
全局变量和静态变量的存储是放在一块的,都放在全局区(静态区),初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间。
6. 在Java JVM里,如果一个变量被声明为final或者static, 那么这个变量的引用以及它的值被存放在哪
static不能用在方法里面,只能修饰类的属性或者方法。
static修饰的变量被放在方法区,因为它属于类变量,是类的一部分。
所有的方法中的普通变量都是在栈中的局部变量表中的,如果是引用类型的变量局部变量表会存放引用对象的地址,这个引用对象实际存储在堆中。如果被final修饰的话代表这个引用类型的变量指向的地址无法被改变。所以final修饰的引用的地址和final修饰的基本数据类型都会放在常量池,常量池位于方法区中。
7. java中,静态方法被调用是,存储在内存的哪个区域是栈还是放大区还是两者都有
在JDK8之前,静态成员(静态变量和静态方法)都是存储在方法区(永久代)中的静态区中(这里指类被加载后,静态成员的存储位置)。但在JDK8之后,永久代被移除了,取而代之的是元空间(metaspace)。但元空间中存储的主要是.class文件的元数据信息,静态成员的存储位置由方法区转到了堆内存(heap)中。
不过,不管是JDK8,还是更早的版本中,静态方法的执行(不仅仅是静态方法,还有普通的成员方法)都是在栈内存(stack)中进行的。每个线程都会在栈内存中开辟一个栈,在调用方法时,对应的方法都会在执行这个方法的线程的栈中创建一个“栈帧”,栈帧中保存了局部变量表(基本数据类型和对象引用)、操作数栈、动态连接和返回地址等信息。等到方法执行完毕,栈帧被销毁,对应的内存也将被释放。
8. java静态资源(静态方法,静态属性)是程序一运行就加载到jvm中,还是当被调用的时候才进行加载呢
当类第一次被调用时加载(静态方法,静态属性的加载就是类加载) 。
1、类中的静态属性会被加入到类对象(也可以叫做类的模板,是类的描述) 的构造器中,静态方法也会被加入到类对象中。
2、当第一次使用类时,JVM会通过类加载器,加载类对象,从而初始化静态属性,并装入类的方法,包括静态方法和实例方法(方法不会被调用,只是加载,从这个意义上来说,静态方法和实例方法是类似的)。
3、当创建类的实例对象时,JVM会调用类的构造器,从而初始化类的属性。
(8)静态属性放在方法区哪里扩展阅读:
类(包括静态方法、属性)加载过程:
一、加载。
根据一个类的全限定名(如cn.e.h.test.HelloWorld.class)来读取此类的二进制字节流到JVM内部。
将字节流所代表的静态存储结构转换为方法区的运行时数据结构(hotspot选择将Class对象存储在方法区中,Java虚拟机规范并没有明确要求一定要存储在方法区或堆区中)转换为一个与目标类型对应的java.lang.Class对象。
二、连接。
1、验证。
验证阶段主要包括四个检验过程:文件格式验证、元数据验证、字节码验证和符号引用验证;
2、准备。
为类中的所有静态变量分配内存空间,并为其设置一个初始值(由于还没有产生对象,实例变量将不再此操作范围内);
3、解析。
将常量池中所有的符号引用转为直接引用(得到类或者字段、方法在内存中的指针或者偏移量,以便直接调用该方法)。这个阶段可以在初始化之后再执行。
9. java里的静态成员变量是放在了堆内存还是栈内
这个要看对象是否为逃逸对象,如果为非逃逸对象,会根据标量替换来把对象分解成若干个被这个方法使用的成员变量所代替,这些代替的成员变量在栈帧或寄存器上分配空间
10. 静态方法和非静态方法分别在哪个内存区
静态方法在栈区,在加载初就完成装载,非静态方法就是实例方法吧,实例方法在堆区,初始化完成才能使用。