程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:

  (1)不要显式调用System.gc()

  此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。

  (2)尽量减少临时对象的使用

  临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。

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

  一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。

  (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的机会。

最新文章

  1. Git命令之资源
  2. 【Yeoman】热部署web前端开发环境
  3. c语言程序
  4. CentOS7下安装MYSQL5.7
  5. web性能优化之:no-cache与must-revalidate深入探究
  6. 0x80029C4A
  7. PhoneGap与WAP站静态化
  8. WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞
  9. 武汉科技大学ACM :1006: 零起点学算法25——求两点之间的距离
  10. puppetSvn集成
  11. cocos2D(八)---- CCMenu && CCMenuItem
  12. assert()函数用法
  13. laravel中间件使用
  14. java语言编写杨辉三角
  15. iOS中 支付宝钱包详解/第三方支付 韩俊强的博客
  16. python程序—用户登录
  17. P1461 海明码 Hamming Codes
  18. supervisorctl安装使用文档
  19. 一些方便系统诊断的bash函数
  20. redis -编译、启动、停止

热门文章

  1. 启动MFC程序的时候报错:0xC0000005: 读取位置 0x00000000 时发生访问冲突
  2. 数据库调优过程(一):SqlServer批量复制(bcp)[C#SqlBulkCopy]性能极低问题
  3. Mac系统下控制鼠标移动
  4. t4 multiple output sample
  5. [转]JqueryEasyUI教程入门篇
  6. [转]MongoDB for Java】Java操作MongoDB
  7. Ruby操作VBA的注意事项和技巧(2):宏里调用和控制窗体以及窗体上的控件、不同workbook之间的宏互相调用
  8. 关于 VS 无法转到定义和无法转到使用的问题
  9. MVC权限管理系统dwpro项目分配按钮没有显示的问题
  10. Bishop的大作《模式识别与机器学习》Ready to read!