当前位置: 移动技术网 > IT编程>开发语言>Java > Java---Static内存图详解

Java---Static内存图详解

2019年03月09日  | 移动技术网IT编程  | 我要评论

案例:

输出结果

内存图:

执行流程:

java文件通过编译成class文件,class文件通过类加载器加载到方法区中,程序首先会加载核心类库,也就是你的程序想要运行所需要的一些最基本的类。接着程序会找代码主方法所在的类,将staticdemo1.class这个类加载到方法区中,这个类中没有属性,但有一个静态方法main,此时将staticdemo1.class这个类所在内存分成两部分,一部分是非静态区域,一部分是静态区域,main方法加载到静态区域,但并未执行,这一步仅仅是将mian方法存储到方法区,mian方法是由jvm调用的,jvm调用main方法,mian方法开始在栈中执行,在栈中开辟一块空间。然后接着按照代码顺序往下执行, 接着执行person p1 = new person();准备创建person对象,要创建对象必须先找到对应person类,此时发现内存中并没有person类,然后就开始加载person类(person类是在第一次使用的时候才会加载,比如有300个类,不是全部一起加载的,是当你需要用到哪个类才会加载对应的类),加载person类时发现有对应的属性和方法,person类将空间分成静态和非静态两部分,将name,age,tostr()加载到非静态区域,将kongfu加载到静态区域,由于kongfu是一个静态属性,java在编译和运行时候会给这个属性一个默认值,string类型默认值为null,这个过程叫做kongfu属性初始化,此时kongfu属性在方法区中有了具体的大小,也就意味着kongfu属性在方法区占用了一块内存 ,就会产生对应的内存地址0xacal,加载完person类后发现并没有对象,也就意味着静态变量先于对象而存在,静态变量是随着类的加载而加载到方法区中的,在方法区被赋予默认值,静态变量可以不依附于对象,没有对象也能使用静态变量,可以用过类名来调用,所以静态变量也称类变量。加载完person类,开始创建p1对象,首先在栈中mian方法区开辟一块空间p1,在堆内存中开辟一块空间,地址为0xbcd3,将地址赋值给p1,p1顺着地址可以找到这块空间,而空间里有对应的属性,分别赋上默认值,在给kongfu赋默认值时,发现kongfu是一个静态属性,然后程序会去方法区的对应类中寻找是否有对应的静态属性,找到之后会把方法区中对应静态属性的地址0xacal拿过来,然后堆内存中的kongfu属性通过地址找到方法区中kongfu属性。接着下行代码,开始给属性复制,name赋值为梅超风,age赋值为50,给kongfu赋值时,kongfu会根据地址一直找到方法区中的kongfu,将默认值null覆盖,然后赋值为九阴白骨爪。接着执行代码person p2 = new person();同理,先找到对应的person类,此时发现person类已经在方法区中加载了,此时就不会再重复加载了,因为类只加载一次,既然person类已经加载了,就直接创建p2对象,同理,分别在堆内存和栈中开辟空间,地址赋值,属性赋值,kongfu根据地址找到方法区中的kongfu,经原来的九阴白骨爪覆盖,重新赋值为蛤蟆功。所以会打印出两个蛤蟆功。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网