本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片、视频等原文的内容)
若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cnblogs.com/wengshuhang/p/10123903.html
一、垃圾回收---对象存活算法:
1、引用计数器法:在对象身上放上一个计数器,当有引用则加一,引用失效则减一,为零则可回收。(无法解决对象相互引用)
2、可达性分析法(java),GC roots为起始点,从节点向下搜索,搜索路径为引用链,不在引用链的对象则是可回收的对象。
在Java语言里,可作为GC Roots对象的包括如下几种:
a.虚拟机栈(栈桢中的本地变量表)中的引用的对象
b.方法区中的类静态属性引用的对象
c.方法区中的常量引用的对象
d.本地方法栈中JNI(native方法)的引用的对象
就算被Gc标记可回收,也未必死亡,第二次标记则死亡,在第二次标记途中,只要触发了对象的finalize()方法则可不用被回收,这个方法一个对象只能触发一次。
永久代也可被回收
二、四种引用类型:
1.强引用。对形如Object obj = new Object()产生的引用都是都是强引用,只要强引用还存在,jvm就永远不会回收该对象
2.软引用。软引用主要用来指向一些有用但不重要的对象。如果内存足够,jvm不会回收软引用指向的对象,如果内存紧张,在发生溢出错误之前,jvm会回收该对象。
3.弱引用:弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。
4.虚引用也称为幽灵引用或者幻影引用。它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了PhantomReference类来实现虚引用
三、垃圾回收---对象收集算法:
1、标记清楚算法(1、标记清除效率不高,2、产生大量不连续空间)
2、复制算法:将内存划分为大小相等的两块,每次只使用其中的一块。当这块内存用完了,就将还存活的对象复制到另一块内存上,然后把已使用过的内存空间一次清理掉。
优点:每次只对其中一块进行GC,不用考虑内存碎片的问题,并且实现简单,运行高效
缺点:内存缩小了一半
3、标记-整理算法:复制算法不适用年老代的存活情况,存活率高时候需要进行较多的复制操作。让所有存活对象都向一端移动,然后直接清理掉端边界以外的所有内存。
4、分代收集算法:根据对象的存活周期的不同将内存划分为几块,一般就分为新生代和老年代,根据各个年代的特点采用不同的收集算法。新生代(少量存活)用复制算法,老年代(对象存活率高)“标记-清理”算法
四、垃圾收集器:
五、内存分配与回收策略:
新生代中有一个Eden区跟两个Survicor区, -XX:SurvivorRatio=8 的 10M新生代空间
表示8M的eden区跟两个 1M的Survivor区(复制算法)。
超过1m的的对象则直接通过担保分配机制放入年老代
-XX:PertenureSizeThreshold参数可以直接将大于该值得对象直接放入老年代,避免大对象在survivor区相互复制
-XX:MaxTenuringThreshold参数可规定survivor区存活复制的次数进入年老代的阈值,默认为15.
动态对象判定: 相同survivor年龄的所有对象空间大于survivor空间的一半,则大于等于该年龄的对象全部进入年老代。