大第一类间接步入老二十世纪
大第一类就是需要大量已连续缓存内部空间的第一类(比如说:字符串、字符串)。JVM模块-XX:PretenureSizeThreshold 能增设大第一类的大小不一,假如第一类少于增设大小不一会间接步入老年代,不会步入年青代,那个模块只在 Serial 和ParNew两个废弃物过滤器下有效率。
为何要这样呢?
为的是防止为大第一类重新分配缓存时的拷贝操作方式而减少工作效率。
长年生存的第一类将步入老二十世纪
难道软件包选用了分代搜集的价值观来管理缓存,所以缓存拆解时就必须能辨识什么样第一类应放到实力派,什么样第一类应放到老二十世纪中。为的是努力做到这一点,软件包给每一第一类两个第一类年纪(Age)计时器。
假如第一类在 Eden 长大并经过第二次 Minor GC 后仍然能够生存,因此能被 Survivor 可容的话,将被终端到 Survivor内部空间中,并将第一类年纪设为1。第一类在 Survivor 中每挨过一次 MinorGC,年纪就减少1岁,当它的年纪减少到一定某种程度(预设为15岁,CMS过滤器预设6岁,相同的废弃物过滤器会略为有点儿相同),就会被晋升为到老二十世纪中。第一类晋升为到老二十世纪的年纪共振频率,能通过模块-XX:MaxTenuringThreshold 来增设。
第一类静态年纪推论
现阶段放置第一类的Survivor地区里(其中几块地区,放第一类的那块s区),一大批第一类的总大小不一大于那块Survivor地区缓存大小不一的50%(-XX:TargetSurvivorRatio能选定),所以这时大于等同于这批第一类年纪最小值的第一类,就能间接步入老二十世纪了,比如Survivor地区里现在有一大批第一类,年纪1+年纪2+年纪n的数个年纪第一类八倍少于了Survivor地区的50%,此时就会把年纪n(含)以上的第一类都放进老二十世纪。那个准则其实是期望那些可能是长年生存的第一类,尽快步入老二十世纪。第一类静态年纪推论监督机制一般是在minor gc之后促发的。
老二十世纪内部空间重新分配借款监督机制
年青代每天minor gc以后JVM单厢排序下老二十世纪余下需用内部空间
假如那个需用内部空间大于年青金沟线原有的所有第一类大小不一之和(包括废弃物第一类)
就会看两个“-XX:-HandlePromotionFailure”(jdk1.8预设就增设了)的模块是否增设了
假如有那个模块,就会看看老二十世纪的需用缓存大小不一,是否大于以后每一次minor gc后步入老二十世纪的第一类的平均大小不一。假如上一步结果是大于或者以后说的模块没有增设,所以就会促发一次Full gc,对老二十世纪和年青代一起拆解一次废弃物,假如拆解完还是没有足够内部空间放置新的第一类就会发生”OOM”
当然,假如minor gc之后余下生存的需要挪动到老二十世纪的第一类大小不一还是大于老二十世纪需用内部空间,所以也会促发full gc,full gc完之后假如还是没有内部空间放minor gc之后的生存第一类,则也会发生“OOM”

