什么是垃圾?
指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。
java中的变量分为几步数据类型和引用数据类型,基本数据类型(标量)不属于垃圾的范畴,只有引用类型(聚合量)才考虑回收。
notice:
标量:
基础类型和对象的引用可以理解为标量,它们不能被进一步分解。
聚合量:
而能被进一步分解的量就是聚合量,比如:对象。
对象引用:
4.JAVA 对象存储的数据 与 java 的对象和对象引用的区别
标量替换:
对象是聚合量,它又可以被进一步分解成标量,将其成员变量分解为分散的变量,这就叫做标量替换。也就是通过标量替换聚合量。
只有引用类型(聚合量)才考虑回收
这里说的是考虑回收而不是说只要是聚合量就回收,如果一个对象没有发生逃逸,在栈中,那终其一生也只是在stack中存在,不会在heap中创建,所以此时聚合量在随其所在的栈帧的弹栈而消失,不用JVM考虑回收。
运行程序中没有任何指针指向的对象:
指的是存储在heap中的对象实例。
比如一个在栈帧中使用的聚合量,其发生了逃逸,在heap中创建,在这个栈帧中有对于这个聚合量的应用,一旦弹栈,那么heap中的这个对象实例,不会再被引用,此时这个存储在heap中的聚合量就是一个垃圾,需要被JVM当成垃圾回收。
为什么需要GC?
1.对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完。
2.除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片,以便JVM 将整理出的内存空间分配给新的对象。
3.没有GC就不能保证应用程序的正常进行。因为JAVA在诞生起,就摒弃了C++中直接对内存的操作,如果一直创建对象不回收,必然会报OOM。
早期的垃圾回收
也就是在早期的C/C++时代,垃圾回收基本.上是手工进行的。开发人员可以使用 new关键字进行内存申请,并使用delete关键字进行内存释放。比如以下代码:
MibBridge *pBridge = new cmBaseGroupBridge () ;
//如果注册失败,使用Delete释放该对象所占内存区域
if (pBridge->Register(kDestroy)!= NO_ERROR)
delete pBridge;
现在,除了Java以外,C#、Python、 Ruby等语言都使用了自动垃圾回收的思想,也是未来发展趋势。可以说,这种自动化的内存分配和垃圾回收的方式己经成为现代开发语言必备的标准。
Java垃圾回收机制
自动内存管理
网友评论