这篇文章主要讲解了“jvm垃圾回收机制的原理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jvm垃圾回收机制的原理”吧!
垃圾回收机制原理:
jvm如何判断一个对象是不是垃圾?
使用可达性分析法去对一个GC roots对象进行分析,从一个节点GC ROOT 开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点也就是垃圾。
java 中可作为 GC Root 的对象有:
1.虚拟机栈中引用的对象(本地变量表)
2.方法区中静态属性引用的对象
3. 方法区中常量引用的对象
4.本地方法栈中引用的对象(Native 对象)
对垃圾进行回收的垃圾回收算法:
1.Mark-Sweep(标记-清除)算法
这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。标记-清除算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。
2.Copying(复制)算法 新生代GC算法
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。
这种算法虽然实现简单,运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。
很显然,Copying 算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,
那么 Copying 算法的效率将会大大降低。
在复制算法中,当第二个步骤往复一次,jvm内对象年龄加一,当jvm往返15次,年龄达到15时,新生代会转为老年代。
3.Mark-Compact(标记-整理)算法
标记整理算法在标记清除方法的基础之上,也就是先对垃圾进行标记清除之后,再使存活对象向另一侧移动,进行整理。
4.Generational Collection(分代收集)算法
分代收集算法是目前大部分 JVM 的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(TenuredGeneration)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。
对于新生代采取标记复制算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少,但是实际中并不是按照 1:1 的比例来划分新生代的空间的,一般来说是将新生代划分为一块较大的 Eden 空间和两块较小的Survivor 空间,每次使用 Eden 空间和其中的一块 Survivor 空间,当进行回收时,将 Eden和 Survivor 中还存活的对象复制到另一块 Survivor 空间中,然后清理掉 Eden 和刚才使用过的 Survivor 空间。
老年代的特点是每次回收都只回收少量对象,所以使用标记整理算法。
注意,在堆区之外还有一个代就是永久代(Permanet Generation),它用来存储 class类、常量、方法描述等。
对永久代的回收主要回收两部分内容:废弃常量和无用的类。
感谢各位的阅读,以上就是“jvm垃圾回收机制的原理”的内容了,经过本文的学习后,相信大家对jvm垃圾回收机制的原理这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。