void fun(){
TestObj to = null;
for(int i=0;i<9999999;i++){
to = new TestObj();
to.testFun1();
to.testFun2();
}
}
对于上面这段代码,我可能new了很多对象,而每new一个对象都会在内存当中给他分配一块内存空间,而这一块内存空间在你的应用程序结束之前是不能被垃圾回收的,因为我的应用程序随时有可能再次的访问这个对象(这个道理很简单,因为这是我申请的我当然有这个权力),但是你new了这么多的对象,肯定要占据很多的内存,考虑一种极限的情况,你的对象把jvm内存给占满了,是不是就会造成内存的溢出了呢?
实际上情况并不是这样的,这个要从java的堆谈起,java的堆是一个运行时数据区,他用来为程序中类的实例分配内存空间,应用程序在通过new、newarray等创建新的对象时,java的堆就会为其分配一块空间,至于何时释放这一块空间,应用程序不用操心。java采用一种动态存储管理技术来约束java的堆,动态存储管理技术要求java的堆自动释放不被引用的对象所占用的内存空间。按照上述的机制,fun()方法在执行第一次for循环时,对象变量to指向本次创建的对象TestObj(),其对应的内存为address1,执行第二次的for循环时,变量to又被指向新的对象TestObj(),其对应的内存为address2,这时第一次for循环创建的对象TestObj()将没有变量引用他,这样的话其对应的在java堆当中的内存address1将被视为垃圾内存而被释放;这样fun()在执行的过程当中java堆只会有最后一次for循环中创建的对象TestObj()的空间addressN,其他都会被视为垃圾而回收,而这仅有的对象addressN也会随着fan()方法的执行完毕而消亡!所以也根本不会出现我以前所担心的内存溢出问题。至于
new TestObj();
这样的语句创建的对象不被具体的变量所引用,他们的生命周期更是在java的堆中灵光一现,执行了这一句以后立刻要被销毁,创建以后立刻被视为垃圾。这样的孩子的命运挺悲摧的,一生下来就被判了死刑。
C++就不一样了,它不管你创建的对象有没有被引用,除非程序中主动去销毁这些对象它都不会去自动的销毁这些对象所占用的内存空间,所有对象所占用的内存将应用程序结束时一起被销毁。