>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22189 个阅读者 刷新本主题
 * 贴子主题:  java比c++强大之处JVM垃圾收集算法 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-27 16:15:48     消息  查看  搜索  好友  邮件  复制  引用

  
java可以自动进行垃圾收集,c++需要手动释放内存,这个功能将程序员解放出来,能将更多的注意力放在需要实现的业务上,这也是java相对c++的一个巨大优势,jvm有哪些垃圾收集算法呢?
  1. 标记清除算法:算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
这种算法的缺点在于,垃圾被回收以后造成了大量不连续的内存碎片。碎片太多可能会导致以后需要分配较大对象时,无法找到连续的足够内存从而频繁触发垃圾收集,降低系统效率。
  1.   复制算法:为了解决“标记,清除”算法的问题一种被称为复制的算法出现了,它将内存平均分为两块,每次只使用其中一块,当这一块存满时触发垃圾收集,将还存活的对象复制到另一块内存,然后将这块内存清掉,这样就不会存在内存碎片的问题。
  2.   标记整理算法:
    复制算法在存活对象较多的时候需要复制的操作也较多,最关键的是只能利用一半的内存,标记整理算法可以解决这个问题,标记整理算法中的标记和标记清除算法一样,要被回收的对象找出来以后让所有存活的对象向一端移动,然后将内存的剩余部分直接清理掉。

  3. 分代收集算法:
    分代收集算法将内存分为新生代和老年代,新生代又分为:较大的Eden区(占80%)和两块Survivor区(各占10%),刚刚创建的对象存放在新生代的Eden区
    ,因为绝大多数的对象(98%)都是朝生夕死的,当Eden区没有足够的空间的时候虚拟机会发起一次Minor Gc,Minor Gc之后,存活对象会进入其中的一块Suvivor区,Eden区被清空,如果Suvivor区内存不够则直接进入老年代。下一次Minor Gc会将Eden和该Suvivor区的存活对象复制到另一块Suvivor区,并将Eden区和该Suvivor区清空。
    在这里我们可以看到相比复制算法,被浪费的空间只有10%。但是前提是绝大部分(90%)的对象在Mino Gc的时候会被回收,如果不满足这个条件Suvivor区大小不够,则存活的对象直接进入老年代。
    为什么需要Survivor区?
    试想一下如果没有Survior区,每次进行Minor Gc,存活的对象直接进入老年代,老年代内存被占满会发生Major Gc,Major Gc执行的速度比Minor Gc慢十倍以上,当有了Survivor区,存活的对象在两块Survior区中倒腾,当倒腾的次数达到16次说明这个对象生命力真的很顽强,才会被放入老年代。这样就减少了Major Gc发生的频次。
为什么需要两块Survivor区?
为了避免内存碎片化的问题,大家想想复制算法是如何解决标记清除算法的内存碎片化问题的,将内存分为大小相等的两块,将存活的对象复制到另一块内存,这里也是一样的道理。

     老年代:
因为老年代中对象的生命力比较顽强,如果采用复制算法那些存活的对象需要被复制很多次,所以老年代采用的是标记整理算法。

     什么样的对象会进入老年代呢?
  1. 大对象会直接进入老年代:
    所谓的大对象就是指需要大量连续内存空间的对象,典型的大对象就是很长的字符串和数组,如果大对象直接在Eden区分配内存空间会导致Eden和Survior之间的大量内存复制,很消耗性能,所以它会直接进入老年代。
  2. 长期存活的对象会进入老年代
    所谓长期存活的对象就是前面所述,来回倒腾十六次还不死的对象。
----------------------------
原文链接:https://blog.51cto.com/11583017/2468307

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-29 14:59:03 重新编辑]
  Java面向对象编程-->图形用户界面(下)
  JavaWeb开发-->Servlet技术详解(Ⅰ)
  JSP与Hibernate开发-->第一个helloapp应用
  Java网络编程-->用Swing组件展示HTML文档
  精通Spring-->CSS过渡和动画
  Vue3开发-->CSS过渡和动画
  《漫画Java编程》勘误及建议
  NIO模式的IO多路复用底层原理
  Java Optional 解决空指针异常总结
  Java关键字final、static使用总结
  Java 语言中十大“坑爹”功能!
  BST 二叉搜索树
  Eclipse和MyEclipse的区别
  害怕面试被问HashMap?
  最实用的10个重构小技巧排行榜,你都用过哪些?
  好消息:《Java网络编程核心技术详解》出版
  Java设计模式:传输对象模式
  正则表达式性能调优
  Java入门实用代码:文件重命名
  jdbc连接各种数据库代码
  JDBC使用8.0驱动包连接mysql设置时区serverTimezone
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。