首页 > 学院 > 操作系统 > 正文

Java 减少GC开销的几个措施

2024-06-28 16:02:54
字体:
来源:转载
供稿:网友

具体措施包括以下几个方面:

  (1) 不要显式调用System.gc()   此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。      (2) 尽量减少临时对象的使用   临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。

  (3) 对象不用时最好显式置为Null

  (4) 尽量使用StringBuffer,而不用String来累加字符串   由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer是可变长的,它在原有基础上进行扩增,不会产生中间对象。      (5) 能用基本类型如Int,Long,就不用Integer,Long对象

  (6 ) 尽量少用静态对象变量   静态变量属于全局变量,不会被GC回收,它们会一直占用内存。      (7) 分散对象创建或删除的时间   集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC的机会。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表