• 垃圾回收机制


    谈谈对jvm虚拟机的了解:

    jvm包含,堆,栈,方法区,

    堆内存: 是分配所有对象实例,垃圾回收主要区域

    堆内存又分为:老年代,年轻代

    大对象就是需要消耗较大的内存空间 对象超过设置值的大小会直接进入老年代(数组,字符串)

    长期存活的对象会进入老年代,一个对象的创建首先会进入年轻代每次GC回收他没被回收就会age+1,age=15就会进入老年代 

     对象动态年龄判断机制

    老年代空间分配担保机制

    方法区(元数据区):虚拟机加载的类信息,常量,静态变量

    直接内存:非jvm堆外内存对的堆外内存NIO会直接操作,读写效率高

    java虚拟机如何判断对象存活:

    引用计数法:A引用B就会给A的引用计数器加1,断开则减1,当对象引用计数器为0则判定这个对象为垃圾GC需要回收,但是A引用B,B又引用A则导致对象一直存活

    可达性分析法:从GCroot根开始直接找到对象,或间接找到对象称为可达也是存活对象,反之不可达

    那些方法可以成为GCroot:虚拟机栈引用对象,本地方法栈引用对象,静态属性引用对象,常量引用对象、

    对象的引用分类:1.强引用,普遍存在的对象引用

                                 2.软引用,内存溢出前回收

                                 3.弱引用,下次垃圾回收

                                 4.虚引用,形同虚设

    四种垃圾回收算法:

    1,标记清除算法:首先标记出所有需要回收的对象,标记完成后统一回收,这样的回收方式会产生大量不连续的内存碎片

    2,标记整理算法:为了解决标记清除算法所产生大量不连续的内存碎片,在垃圾回收之后会集中整理内存区域,得到未使用的区域,虽然内存碎片被集中整理了但是这种效率比较低,那么新的解决方案又来了。

    3,复制算法:复制算法就是把内存划分为大小相同的两块(一分为二)每次只留其中一块,当这一块内存用完了就将还存活的对象复制到另外一块上,然后再把这块内存一次性的清理掉,

    好处:效率高,没碎片适合朝生夕死的内存区域,

    缺点:内存利用率低,且不适合在对象存活率高的老年代使用!

    4.分代回收算法:JVM中使用的是分代回收算法,对于新生代采用复制算法,并且为了最大化的利用空间将内存划分为8:1:1 对于老年代或者元数据区因为对象存活率比较高,采用标记清理/整理算法

    垃圾回收器:

    垃圾收集器是内存回收的具体实现,

    Serial收集器:单线程收集器垃圾收集时必须暂停其他线程的所有工作,直到收集结束为止  优点:简单高效

    ParNew收集器:ParNew是Serial的多线程版本,新生代采用复制算法,老年代采用标记整理算法,它可以和并发收集器一起配合工作

    CMS收集器优缺点:优点:并发收集,低停顿,缺点:对CPU资源敏感,无法处理浮动垃圾,它使用标记清理算法会产生大量的空间碎片,执行的不确定性,会存在上次垃圾还没回收完,垃圾回收又被触发的情况

  • 相关阅读:
    【AWS系列】第八讲:AWS Serverless之S3
    webpack是如何解析模块的
    如何检查Apache Kafka服务运行状态
    SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质
    【校招VIP】“推电影”第一期电影详情模块前端代码作业评审
    PHP 变量
    【Python知识】列表的十个技巧
    怎么监控上网记录?监控上网记录的软件推荐
    Linux下基于Electron的ZeroTier客户端GUI
    andoroid gradle7.0 添加libs arr Failed to resolve
  • 原文地址:https://blog.csdn.net/weixin_51014035/article/details/125549724