A. Java构造函数(方法)存储在jvm哪个内存里
存放到方法区当中;
new出来的是实例对象,实例对象才是存放在堆当中;
构造函数对应的是<init>方法,方法信息随着类加载器加载到方法区当中。
栈:
以栈帧为单位,存放的不是方法具体的结构,只是通常一个方法对应一个栈帧,对应的入栈出栈就是栈帧的入栈出栈。栈帧中有局部变量表,操作数栈,方法返回地址,动态链接。其中局部变量表存放局部变量,包括形参,非静态方法默认在第一个索引存放一个this变量;操作数栈用于操作局部变量表和一些值的运算,比如读取表中变量的值进行运算,或存放相应的值到局部变量表中;方法返回地址则是用于记录对应方法的下一条指令的地址;动态链接是符号引用变成的直接引用。
堆:
存放实例对象,在jdk7开始,还存放静态变量和字符串常量池
方法区:
存放类元信息,比如完整类名全称,public,abstract等修饰符,实现的接口有序列表等;方法信息,比如修饰符,返回类型等;JIT代码缓存,也就是被即时编译器编译后的热点代码,用于提高性能;域信息,也就是属性信息,比如修饰符,类型等;运行时常量池,字节码文件中常量池的运行时表现,类似符号引用的记录,不过蕴含的信息更为丰富,而且具有动态性。jdk6及以前,还存放静态变量,运行时常量池中还存放字符串常量池,到了jdk7则移到了堆中。
B. java类中的静态方法是何时创建何时销毁的,存放在内存什么地方
你确定问的是静态方法?静态方法和普通方法一样都是在jvm类加载阶段加载到方法区的,当没有类加载器引用到该类对象时,full gc时就会被销毁。
C. java中 static变量和方法到底是存在内存什么区域
JVM内存总体一共分为了
4个部分(stack segment、heap segment、code segment、data segment)
当我们在程序中,申明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中;
当new 一个对象的时候,此对象放在了heap segment(堆)当中;
而static 的变量或者字符串常量 则存在在 data segment(数据区)中;
那么类中方法的话,是存在在 code segment(代码区)中了。
D. 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区的 !
E. java 静态函数是在栈内存执行 还是在方法区执行 看清楚 是静态函数 不是变量
无论是类方法还是静态方法,都是在栈区调用和执行的
F. java中,静态方法被调用是,存储在内存的哪个区域是栈还是放大区还是两者都有
在JDK8之前,静态成员(静态变量和静态方法)都是存储在方法区(永久代)中的静态区中(这里指类被加载后,静态成员的存储位置)。但在JDK8之后,永久代被移除了,取而代之的是元空间(metaspace)。但元空间中存储的主要是.class文件的元数据信息,静态成员的存储位置由方法区转到了堆内存(heap)中。
不过,不管是JDK8,还是更早的版本中,静态方法的执行(不仅仅是静态方法,还有普通的成员方法)都是在栈内存(stack)中进行的。每个线程都会在栈内存中开辟一个栈,在调用方法时,对应的方法都会在执行这个方法的线程的栈中创建一个“栈帧”,栈帧中保存了局部变量表(基本数据类型和对象引用)、操作数栈、动态连接和返回地址等信息。等到方法执行完毕,栈帧被销毁,对应的内存也将被释放。
G. java静态资源(静态方法,静态属性)是程序一运行就加载到jvm中,还是当被调用的时候才进行加载呢
当类第一次被调用时加载(静态方法,静态属性的加载就是类加载) 。
1、类中的静态属性会被加入到类对象(也可以叫做类的模板,是类的描述) 的构造器中,静态方法也会被加入到类对象中。
2、当第一次使用类时,JVM会通过类加载器,加载类对象,从而初始化静态属性,并装入类的方法,包括静态方法和实例方法(方法不会被调用,只是加载,从这个意义上来说,静态方法和实例方法是类似的)。
3、当创建类的实例对象时,JVM会调用类的构造器,从而初始化类的属性。
(7)静态方法在哪里jvm扩展阅读:
类(包括静态方法、属性)加载过程:
一、加载。
根据一个类的全限定名(如cn.e.h.test.HelloWorld.class)来读取此类的二进制字节流到JVM内部。
将字节流所代表的静态存储结构转换为方法区的运行时数据结构(hotspot选择将Class对象存储在方法区中,Java虚拟机规范并没有明确要求一定要存储在方法区或堆区中)转换为一个与目标类型对应的java.lang.Class对象。
二、连接。
1、验证。
验证阶段主要包括四个检验过程:文件格式验证、元数据验证、字节码验证和符号引用验证;
2、准备。
为类中的所有静态变量分配内存空间,并为其设置一个初始值(由于还没有产生对象,实例变量将不再此操作范围内);
3、解析。
将常量池中所有的符号引用转为直接引用(得到类或者字段、方法在内存中的指针或者偏移量,以便直接调用该方法)。这个阶段可以在初始化之后再执行。
H. Java中的静态方法是什么
静态方法是在类中使用staitc修饰的方法,在类定义的时候已经被装载和分配。
静态方法为类所有,可以通过对象来使用,也可以通过类来使用。
我们之前一直写的mian方法仔细看看,它就是一个静态方法,静态方法使用如下:
I. 静态方法和非静态方法分别在哪个内存区
静态方法在栈区,在加载初就完成装载,非静态方法就是实例方法吧,实例方法在堆区,初始化完成才能使用。