jvm内存模型:复制算法

为了解决效率问题,出现了一种称为“复制”(Copying)的收集算法,该算法根据容量将可用内存分为两个大小相等的块,一次仅使用一个。当该内存块用完时,会将尚存的对象复制到另一个块,然后立即清除已用的内存空间。
  jvm内存模型

这样,每次都回收一个内存,并且在分配内存时无需考虑复杂的情况,例如内存碎片。只要移动堆顶部的指针并按顺序分配内存,实现就很简单并且操作效率很高。只是该算法的代价是将内存减少到一半,这太高了。
  但是这种算法的效率相当高,所以,现在的商业虚拟机都采用这种收集算法来回收新生代。为什么新生代可以使用复制算法呢?
  IBM有专门研究表明,新生代中的对象98%都是朝生夕死,所以就不需要按照1:1的比例来划分内存空间。这里鉴于此,新生代采用了如下的划分策略。
  现在把新生代再划分为三部分,一块较大的Eden(伊甸园)和两块较小的Survivor(幸存者)区域。
  回收时,一次将Eden和Survivor中的幸存对象复制到另一个Survivor空间,最后清除刚才使用的Eden和Survivor的空间。HotSpot虚拟机中Eden与Survivor的默认比率为8:1,这意味着每个新一代中的可用内存空间为整个新一代容量的90%(80%10%),而仅占内存的10%将被“浪费”的。
  这样清理完成后,原来的Survivor就空了,并一直保持为空,直到下次MinorGC时,它再作为存活对象的盛放地。两个Survivor就这样轮流当做GC过程中新生代存活对象的中转站。
  相关推荐:【鲁班学院】java高级培训-能懂系列之Map详解
  如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页