• JAVA的GC(GarbageCollection)机制


    GC:GarbageCollection

    java中的一个方法运行时候,最起码是两个线程以上,一个是用户线程,也就是我们代码逻辑所在的线程。还有一个就是守护线程,例如常见的GC线程,

    守护线程在没有非守护线程的情况下,会自动销毁,

    垃圾对象:内存中不再被使用的对象

    垃圾回收:JVM自动释放垃圾对象所占用内存

    如果对象再没有被引用变量引用的时候,便称之为垃圾,其所占用的内存将回被JVM所回收。

    GC的具体过程:

    https://www.cnblogs.com/zjm-1/p/9037094.html,我是对着这个文档来理解的,感觉还挺好懂。

    先讲一下Heap的分代:年轻代、老年代、持久代

    年轻代:https://www.cnblogs.com/zjm-1/p/9037094.html,我是对着这个文档来理解的,感觉还挺好懂。

    年轻代内部又分为三个部分:Eden区、Survivor-from区、Survivor-to区。

    一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor-from区。

    年轻代中对象回收的原理:因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

    在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。

    紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。

    这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

    老年代:https://blog.csdn.net/jisuanjiguoba/article/details/80156781

  • 相关阅读:
    Bootstrap 4/3 页面基础模板 与 兼容旧版本浏览器
    Asp.net core 项目实战 新闻网站+后台 源码、设计原理 、视频教程
    C# 数据类型转换 显式转型、隐式转型、强制转型
    C# 多维数组 交错数组的区别,即 [ , ] 与 [ ][ ]的区别
    C#/Entity Frame Core 使用Linq 进行分页 .Skip() .Take() 的使用方法
    利用 Xunsearch 搭建搜索引擎、内容搜索实战
    Delphi
    Python
    Python
    Python
  • 原文地址:https://www.cnblogs.com/lh-masteryi/p/10172169.html
Copyright © 2020-2023  润新知