GC问题

在java中,当你创建一个对象。javaJVM为其分配内存,调用构造函数并跟踪你使用的对象,当你停止使用一个对象(也就是停止对他的有效引用时),JVM通过垃圾回收器将对象标位释放状态。当垃圾回收器要释放一个对象的内存时,它调用该对象的finalize方法,垃圾回收器以独立的低优先级的方式运行,只是当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。在当你(事实上,你可以调用System.gc()方法强制垃圾回收器来释放这些对象的内存)在以上的描述中,有一些重要的事情需要注意:首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize方法,如果在Applet或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize方法。其次:除非垃圾回收器认为你的Applet或应用程序需要额外的内存,否则它不会试图释放不在使用的对象的内存。换句话说,这是完全可能的,一个Applet给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些内存就退出了。显然,如果你为某个对象定义finalize方法,JVM可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。调用System.gc()也不会起作用,因为它仅仅是给JVM一个建议而不是命令。System.runFinalizersOnExit()方法并不立即试图启动垃圾回收器,而是当应用程序或Applet退出时,它调用每个对象的finalize方法,finalize方法是与java编程中的垃圾回收器有关系。即:当一个对象变成垃圾对象的时候,如果此对象的内存被回收,那么就可以调用系统中定义的finalize方法来完成。当然,java的内存回收可以由JVM来自动完成。system.gc();java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不在使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:
①因内存垃圾过多而引发的内存耗尽
②以及不恰当的内存释放所造成的内存非法引用

触发主GC的条件:

①当应用程序空闲时,即没有应用线程在运行时,GC会被调用,因为GC在优先级最低的线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制的调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会进行两次GC作进一步的尝试,若仍无法满足要求,则JVM将报“out of memory”的错误,java应用将停止。由于是否进行主GC由JVM根据系统环境决定而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。

垃圾收集算法的核心思想是:

对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统的性能,因此需要开发人员有着比较深刻的理解。

堆内存与栈内存:

堆内存实际上指的是优先队列的一种数据结构(自由度大),第一个元素有最高的优先权;栈内存实际上就是满足先进后出的性质的数学或数据结构(自由度小)。

end:大学时写的文章。img