GC(Garbage collection) 英语直译,垃圾收集
【编程中的小确幸】:
你是幸运的,作为一名JAVA程序员,有些时候室内打扫卫生不需要你做,自有人替你打扫,这样想一想是不是很爽。
但是作为一名资深从C,C++,走过来的人来说,在C和C++里面是要求程序员强制回收垃圾的。
===================================================================================
【举个栗子】:
java中创建一个数据,必须NEW一个对不对,这就是占用的内存,必须有一个方法需要回收当这个数组不再被需要时所占用的内存。其实就是由New调用的在不可访问内存中锁调用的数据。很多程序员也习惯于把一个数组所有引用设置为null这就是强制垃圾回收,
这里为什么要讲到内存泄漏问题?这是因为虽然我们在jAVA里面会有垃圾自动回收机制,我们很多时候不用去管他,但是这个习惯如果带到C或C++,就会导致内存泄漏。
===================================================================================
【C,C++内存泄漏】:
C,C++明确要求程序员释放不再被需要的内存。如果忘记了,可能就是一个几百个字节。也许你运行在一个至少几百兆的内存中,但是当这个方法可能正在一个循环中被调用,你可以想想接下来多么恐怖了。内存不够用了,接下来的新数组分配不到足够的内存时。就会造成你的程序崩溃, 这也是因为可用的内存池逐渐减少的原因。
===================================================================================
【什么时候调用GC?】:
同样用代码说明这个例子:
void usaArray(int size){ int[] firstArray=new int[size]; int[] secondArray=firstArray; int[] thirdArray=secondArray; }
就是这个简单的代码:
执行到最后,返回,指向这个数组的三个引用全没了,就好像干了无用功一样,这个数组开辟的内存空间不久就被回收了。
================================================================================
【什么情况下触发】:
1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当 应用忙时,GC线程就不会被调用,但以下条件除外。
2)Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不 足, JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。