jvm内存分配策略有哪些?
1 个回答
慢慢理解世界,慢慢更新自己。java蚂蚁### 内存划分策略:  Serial收集器中,新生代与老年代的内存分配是1:2,然后新生代分为Eden区,From区,To区,比例是8:1:1。 **新生代** 分为Eden,From Survivor,To Survivor,8:1:1 Eden用来分配新对象,满了时会触发Minor GC。 From Survivor是上次Minor GC后存活的对象。 To Survivor是用于下次Minor GC时存放存活的对象。 **老年代** 用于存放存活时间比较长的对象,大的对象,当容量满时会触发Major GC(Full GC) ### 内存分配策略: #### 1) 对象优先在Eden分配 当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC。现在的商业虚拟机一般都采用复制算法来回收新生代,将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。 当进行垃圾回收时,将Eden和Survivor中还存活的对象一次性地复制到另外一块空闲的Survivor空间上,最后处理掉Eden和刚才的Survivor空间。(HotSpot虚拟机默认Eden和Survivor的大小比例是8:1)当Survivor空间不够用时,需要依赖老年代进行分配担保。 #### 2) 大对象直接进入老年代 所谓的大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组,为了避免大对象在Eden和两个Survivor区之间进行来回复制,所以当对象超过-XX:+PrintTenuringDistribution参数设置的大小时,直接从老年代分配 #### 3) 长期存活的对象将进入老年代 当对象在新生代中经历过一定次数(XX:MaxTenuringThreshold参数设置的次数,默认为15)的Minor GC后,就会被晋升到老年代中。 #### 4) 动态对象年龄判定 为了更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中某个年龄所有对象大小的总和>Survivor空间的50%,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。发布于 2022-02-16 01:40 •IP属地 江苏举报评论收藏1
公众号进入网站体验更佳

