1.垃圾收集算法的核心思想
java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。
垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,因此需要开发人员做比较深入的了解。
2.触发主gc(garbage collector)的条件
jvm进行次gc的频率很高,但因为这种gc占用时间极短,所以对系统产生的影响不大。更值得关注的是主gc的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主gc:
①当应用程序空闲时,即没有应用线程在运行时,gc会被调用。因为gc在优先级最低的线程中进行,所以当应用忙时,gc线程就不会被调用,但以下条件除外。
②java堆内存不足时,gc会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,jvm就会强制地调用gc线程,以便回收内存用于新的分配。若gc一次之后仍不能满足内存分配的要求,jvm会再进行两次gc作进一步的尝试,若仍无法满足要求,则 jvm将报“out of memory”的错误,java应用将停止。
由于是否进行主gc由jvm根据系统环境决定,而系统环境在不断的变化当中,所以主gc的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主gc是反复进行的。
3.减少gc开销的措施
根据上述gc的机制,程序的运行会直接影响系统环境的变化,从而影响gc的触发。若不针对gc的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少gc过程中的开销。具体措施包括以下几个方面:
闽公网安备 35060202000074号