转载:http://www.cnblogs.com/songxh-scse/p/5887977.html
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