?????????????????????????? ??????? 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应用将停止。
????
?
?
原文:http://429899791.iteye.com/blog/2290118