JVM笔记

来源:互联网 发布:梦幻古龙asp注册源码 编辑:程序博客网 时间:2024/04/19 22:04

一、垃圾回收算法:

垃圾回收算法有以下几种:

1.标记-清除算法:先标记需要回收的对象,然后回收。

缺点:标记和清除的效率都不高;会产生内存碎片(碎片太多会导致不断触发新的垃圾回收)

2.复制(Copying)算法:内存容量分为两块,一块用完了,复制存活对象到另外一块上。然后一次性清除已经使用过的内存块。

优点:无碎片。缺点:需要预留空间,存在浪费。

相关知识:由于大多数对象的生存时间都很短,所以需要预留的空间可以分配的比较小。HotSpot虚拟机Eden和Survivor比例为8:1.而Survivor中有两块(From/To),所以浪费的空间只有10%。但要注意,极端情况我们也要考虑,一般考虑使用老年代的空间来"担保",也就是说,如果Survivor空间万一不够,就直接复制到老年代中去。

这种算法目前被商用虚拟机广泛使用。常用于新生代。

3.标记-整理算法:某些情况下,可能对象存活率比较高,复制效率会降低。

老年代就有这样的特点:对象存活率高,而且没有额外空间对它进行分配担保,就不能使用Copying算法,只能使用标记-清理或者标记-清除。

标记整理算法相对标记-清除进行了一个改进,先标记,然后不是直接回收,而是让存活对象都向一端移动,然后直接清理边界以外的内存。

 

二、内存分配与回收策略

1.对象创建优先在新生代。2.大对象(长字符串和数组)可直接进入老年代(仅适用于Serial和ParNew两款收集器):以避免Eden和Survivor之间发生大量拷贝。

3.长期存活的对象进入老年代。对象每在Survivor区中移动一次(From和To可能来回交替),年龄就增大一岁。到了一定年龄,就被晋升到老年代。通过参数-XX:MaxTenuringThreshold来设置。默认为15

4.动态年龄判断。如果在Survivor空间中相同年龄所有对象大小的综合大于Survivor空间的一半,该年龄以上的对象直接进入老年代,无须等到MaxTenuringThreshold值。

5.空间分配担保

新生代Eden内存已经不够用,将进行Minor GC,虚拟机监测之前每次晋升到老年代的平均大小是否大于老年代剩余空间,如果大于,直接FullGC。如果小于,判断是否允许担保失败(HandelPromotionFailure),如果不允许,则进行FullGC。


0 0