在垃圾回收算法中,有一个算法称之为复制算法。其基本思想是把内存分为大小相等的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学习技术交流群,一块儿夯实基础,提高自我价值