Java 内存学习
不同的数据类型所占用的内存大小不一样;
在java中,变量有值了才可以被读取使用。对于局部变量,声明后什么值也没有,内存中空空如是,如上图的a,b,如果此时去读取使用变量,编译时抛might not have been initialized异常;对于成员变量,JVM会自动赋予变量初始值,形如 int a; boolean b;之类,若为成员变量,则内存中如下:

把值填在变量所使用的内存区域中。
?对象
?因为一个对象当中可以包含许多属性的数据,这些属性可能是基本数据类型,可能是类的对象,所以内存的使用方式与变量的不一样。
声明一个Object类,Object obj;,完了,就像一般的变量一样,内存中会分配一块区域给变量obj,若为成员变量,会被赋值为null。
然后当实例化一个对象:new Object();,完了,产生一个实例,内存会专门为这个实例分配一块区域,内存中如下:

?该区域又会被分给其他的属性变量使用,到这里,还没有吧obj变量代表的引用与产生的对象的实例关联在一起,这两者目前是分开的,内存中情况如下:

?需要让两者产生关联,必须要将对象的实例指定给对象的引用,形如:Object obj = new Object();后,内存如下:

?每个对象的引用占用4个字节的内存空间。
?
到这里,有必要说说栈空间与堆空间,在方法体中声明的变量都保存在栈中,当方法体执行完毕,系统会自动回收栈中的数据。在堆空间里保存的是对象的实例,在为对象实例划分出的大一块内存区域里保存了对象的属性值,属性类型和对象本身的一些类型标记等,但不包括方法(因为方法是指令)以及方法内声明的属性变量,即成员变量与局部变量在内存中的保存区不一样。
?
?
?针对栈与堆,现举一例说明Java大概的内存机制,
有一个类:
?
?然后main方法里这样:
?
注意:1.当类通过class loader载入code area中,在JVM主线程结束之前只会在内存中保存一份,而实例对象在内存中能有多份。
? ? ? ? ? ?2.这里的图没有考虑静态变量与方法的情况,有兴趣的请找相关资料,日后有时间会在此篇笔记补上。
??
?