当Java虚拟机启动并运行某个程序后,它所能使用的内存总量的上限通常是固定的。在程序刚开始运行的时候,虚拟机中的大部分内存都处于空闲可用的状态。随着程序的运行,不断有空闲的内存区域被分配给程序运行所需的对象来使用。经过一段时间后,虚拟机的内存大概就可以分为三类:当前仍处于空闲状态的内存、正在被程序所使用的内存、程序已经不再使用的内存。第二类和第三类内存的区别就在于其所对应的对象是否处于活跃状态。一个对象对于活跃状态的含义是当前程序中海存在指向该对象的引用。如果没有引用指向i个对象,那么说明该对象无法被运行的程序所使用,他所占用的内存会被当成垃圾来回收。
随着程序的不断运行,虚拟机的内存中可用的空闲空间会越来越少,垃圾越来越多。这时就需要运行垃圾回收器来回收内存中的垃圾区域,一共下次内存分配时使用。Java虚拟机的垃圾回收器是运行在一个独立的线程中的,它会根据当前虚拟机中的内存状态来决定什么时候进行垃圾回收工作。每次垃圾回收时所处理的内存区域的范围也是不同的。垃圾回收器的具体运行时间和频率无法实现预计,取决于垃圾回收器的实现算法。不同的虚拟机实现中的垃圾回收算法也有所不同。
垃圾回收线程和当前应用程序同时在Java虚拟机中运行,因此当前运行程序会受到垃圾回收器的影响。
在垃圾回收器的实现方式中,通常有很多因素需要考虑和权衡,其中与当前运行程序相关的是垃圾回收器的运行方式。一般来说有并发运行和暂停执行两种。并发运行的含义是指垃圾回收器与程序同时运行,而暂停执行在垃圾回收器运行时程序暂停运行。并发运行的方式对程序影响较小,但对垃圾回收器的实现要求较高,实现起来也更复杂。
虽然大多时候垃圾回收器的运行时间和频率是无法预计的,但是程序仍然可以在特定的时间建议垃圾回收器进行回收工作,通过System.gc方法可以建议垃圾回收器立即运行。不过在这种情况下,垃圾回收器也可以选择不运行。