面试题解答系列:堆里面的分区:Eden,survival from to,老年代,各自的特色

在垃圾回收算法中,有一个算法称之为复制算法。其基本思想是把内存分为大小相等的2块,每次只在其中一块区域内进行内存分配,当发生GC时,将这块区域内存活的对象复制到另一个区域内,而后对这块区域进行Full GC,这样能够保证内存的连续性,减小了空间碎片的产生.而后这种方式牺牲了一半的内存使用空间。Eden区与Survior区的概念也由此得来。java

一、Eden区算法

Edeb区位于JVM中的新生代,是新对象分配内存的地方,因为堆是全部线程共享的,因此在堆上分配内存须要加锁。数组

而Sun JDK为了提高效率,会为每一个新建的线程分配一个独立的内存区域,这块区域称之为TLAB(Thread Location Allocation学习

Buffer).在TLAB上分配内存是不须要进行加锁的,因此Eden区域的对象内存分配会优先在TLAB上进行.如果对象过大或者是TLAB的内存空间使用完,则对象的内存分配会在堆上进行。若是Eden区内存耗尽,则会触发Minor GC(Young GC)。线程

二、From Survivor和To Survivor区cdn

针对新生代对象"朝夕生死"的特色,将新生代划分为3块区域u,分别为Eden、From Survior、ToSurvior,比例为8:1:1。对象

From和To是相对的,每次Eden和From发生Minor GC时,会将存活的对象复制到To区域,并清除内存。To区域内的对象每存活一次,它的"age"就会+1,当达到某个阈值(默认为15)时,ToSurvior区域内的对象就会被转移到老年代。内存

能够经过设置参数-XX:MaxTenuringThreshold来设置晋升的年龄。字符串

虚拟机提供了一个参数:-XX PertenureSizeThreshold 使得大于这个参数的对象直接在老年代中分配内存,这样就避免了在Eden区域以及Survior区域进行大量的内存复制。虚拟机

三、老年代

老年代中是存活时间久的大对象(很长的字符串或者是数组),所以老年代使用标记-整理算法。当老年代容量满的时候,会触发一次MajorGC (FullGC)

若是有什么问题能够私信我,还有一些关于java资料均可以私信问我要。

欢迎你们扫下方二维码加java学习技术交流群,一块儿夯实基础,提高自我价值

相关文章
相关标签/搜索