java基础之----jvm介绍
常见的垃圾收集器
参考这篇文章:https://crowhawk.github.io/2017/08/15/jvm_3/
如何判断某个对象为垃圾
引用计数法
目前主流的java虚拟机都摒弃掉了这种算法,最主要的原因是它很难解决对象 之间相互循环引用的问题。尽管该算法执行效率很高。
例如:在testGC()方法中,对象objA和objB都有字段instance,赋值令objA.instance=objB及objB.instance=objA,除此之外这两个对象再无任何引用,实际上这两个对象都已经不能再被访问,但是它们因为相互引用着对象方,异常它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。
可达性分析算法
前主流的编程语言(java,C#等)的主流实现中,都是称通过可达性分析(Reachability Analysis)来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。如下图所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。
常用的垃圾回收算法
复制算法
复制算法把内存分为两部分,两部分大小相同,每次只使用其中一个。一块内存用完后,把活着的对象复制到另一块内存,当前内存块全部回收。这个算法不会产生内存碎片,但是可用内存明显变少。复制算法把内存分为两部分,两部分大小相同,每次只使用其中一个。一块内存用完后,把活着的对象复制到另一块内存,当前内存块全部回收。这个算法不会产生内存碎片,但是可用内存明显变少。
标记-清除算法
标记-清除算法分为两个阶段:标记、清除。在标记阶段,扫描并标记所有需要回收的对象;在清除阶段,统一回收被标记的对象。这个算法的效率并不高,并且清除对象后会产生大量不连续的内存碎片。
标记-整理算法
标记-整理算法与标记-清除算法类似,不同的是,不会直接对垃圾对象进行回收,而是把所有存活的对象都移动到一端,然后清理掉其他部分。
分代收集算法