1、内存区域的分类

栈内存:基本类型变量和对象的引用,优势在于存取速度快

堆内存:new创建的对象和数组以及对象的实例化变量,优势在于动态分配内存,但是存取速度相对较慢

2、不同类型的内存分配

(1)基本数据类型:类似int,char,double之类的数据类型

         当使用int a;来定义的时候,会在栈空间分配一个空间来存a(此时为空);当使用int a=2;来定义的时候,会在栈空间分配一个空间来存a,同时去找有没有值为2的内存空间,如果有就把a的地址空间指向2的地址空间,如果没有就创建值为2的地址空间,把a的地址空间指向那个地址空间。

(2)对象

         对对象的内存分配主要是在栈空间存放对象的地址(对应的堆空间的地址),在堆空间存放对象

(3)String

         String其实就是一个类,但是有比较特殊的地方。

         String s = new String(“Hello,World!”); 和 String s = “Hello,World!”; 是不一样的:

         前者和普通类是一样的,后者与基本类型类似,会先去找有没有”Hello,World!”,如果没有才会去创建一个值为”Hello,World!”的对象,然后栈空间存放这个对象的在堆中的地址(记这个栈空间的地址为X,X不是对象在堆中的地址),s在栈空间的值是X。

(4)数组

         栈中存放数组在堆中的首地址,堆中分配数组。

(5)方法调用时的内存分配

         实例变量和对象在堆中,局部变量在栈中(方法执行完成之后就会被回收)

3、垃圾回收机制

(1)方式

         JVM自己回收或者是system.gc();请求回收。

(2)对象

         1)空引用:String s = null;此时s就会被回收

         2)没有引用:String s = “a”;s = “b”;那么a就变成“无主孤魂”就会被回收

         3)过期:方法运行完成后,方法中的局部变量就会被回收

         4)互相引用:对象A引用了对象B,B直接或者间接引用了对象A,而且A和B都不被其他对象所引用,这样也会被回收

(3)垃圾回收算法

http://speed847.iteye.com/blog/373278