首页 > 垃圾回收 > Java开发中垃圾回收的最佳做法?
2019
07-17

Java开发中垃圾回收的最佳做法?

  千锋教育一直秉承“用良心做教育”的理念,是中国移动互联网研发人才一体化服务的领导品牌,全力打造移动互联网高端研发人才服务平台。公司总部位于北京,目前已在深圳、上海、郑州、广州、大连、武汉、成都成立了分公司。拥有全国最多、最权威的移动互联网教学就业保障团队,做到了毕业学员业内最高薪水,成为学员最信赖的IT培训机构。千锋教育是中关村移动互联网产业联盟副理事长单位,中国软件协会教育培训委员会认证首家一级培训机构,中关村国际孵化软件协会唯一授权中关村移动互联网学院,拥有全国300多所合作高校,2000多家移动互联网方向合作企业,50多个APP上线项目,每年有数十万名学员受益于千锋教育组织的技术研讨会、技术培训课、网络公开课及免费教学视频。用编程的方式,可以要求(记住这只是一个请求——不是一个命令)JVM通过调用System.gc()方法来运行垃圾回收。

  当内存已满,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。

  对象在被垃圾回收从堆上删除之前,会运行finalize()方法。还是不要用finalize()方法写任何代码。

  1【专注:Python+人工智能Java大数据HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】

  首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。标记过程中 实际上即时上面说的finaLize()的过程。主要缺点一个是效率问题。另外一个是空间问题,标记清除后会产生大量不连续的内存碎片。

  这种算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了。就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。

  复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会遍低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以对应被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

  标记过程仍然与标记-清除算法一样,但是后续步骤不是直接将对可回收对象进行清理,而是让所有存活的对象都向领一端移动,然后直接清理掉端边界以外的内存。

  当代商业虚拟机的垃圾收集都采用的是“分代收集算法” ,根据对象的存活周期的不同,将内存化为几块,一般是把java堆分为新生代和老年代。这样就可以根据各个年代的特点采用最合适的收集算法。


本文》有 0 条评论

留下一个回复