垃圾回收机制与内存泄漏之间的关系

                                   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应用将停止。

    

猜你喜欢

转载自429899791.iteye.com/blog/2290118
今日推荐