发新话题
打印

垃圾清理势在必行——java垃圾收集算法

垃圾清理势在必行——java垃圾收集算法

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进程中的开支。详细措施包括以下几个方面:
  (1)不要显式调用System.gc()
  此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而添加主GC的频率,也即添加了间歇性停顿的次数。
  (2)尽量减少暂时对象的运用
  暂时对象在跳出函数调用后,会成为垃圾,歌瑞尔少用暂时变量就相当于减少了垃圾的产生,从而延伸了呈现上述第二个触发条件呈现的时间,减少了主GC的机会。
  (3)对象不用时最好显式置为Null
  普通而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC搜集器判定垃圾,从而提高了GC的效率。
  (4)尽量运用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)
  由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如Str5=Str1+Str2+Str3+Str4,这条语句执行进程中会产生多个垃圾对象,由于对次作“+”操作时都必需创建新的String对象,但这些过渡对象对系统来说是没有实践意义的,只会添加更多的垃圾。防止这种情况可以改用StringBuffer来累加字符串,因StringBuffer是可变长的,它在原有基础上进行扩增,不会产生两头对象。
  (5)能用根本类型如Int,Long,就不用Integer,Long对象
  根本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好运用根本变量。
  (6)尽量少用静态对象变量
  静态变量属于全局变量,不会被GC回收,它们会不断占用内存。
  (7)分散对象创建或删除的时间
  集中在短时间内少量创建新对象,特别是大对象,会导致突然需求少量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而添加主GC的频率。集中删除对象,道理也是一样的。它使得突然呈现了少量的垃圾对象,闲暇空间肯定减少,从而大大添加了下一次创建新对象时强迫主GC的机会。
jiyizhen-buy.com颈椎保健枕太空记忆枕 igerl.com歌瑞尔内衣

TOP

发新话题