JVM垃圾回收器

一、语言发展历史

  1、c / c++、、、

    1.需要手动管理

    2.忘记释放 --- 就会出现内存泄漏,从而导致内存溢出。

    3.释放多次 一个线程空间莫名其妙被另一个释放了

     4.开发效率低

  2、java  python  go、、、

    1.方便内存管理

    2.GC  Garbage Collection  应用线程只管分配,垃圾回收器负责回收

   3、rust

    1.所有权

二、GC Algorithms

  1、Mark - Sweep (标记清除)

 

      根据GC Roots 标记,然后清除,但是容易产生碎片化。 

  2、Copying (拷贝)

      直接把内存一分为二,把有用的直接整个copy 到另一个位置,但是浪费空间。

  3、Mark - Compact (标记压缩)

      先进行标记,然后整理,虽然没有碎片化,但是效率低。

 三、Java8中新生代和老年代

       过程:大部分在eden 生成,当eden 满时,对eden 进行回收,剩下存活的则放到survivor1 里,下次eden 再次满时,把eden 存活的和survivor 存活的放到survivor,反复多次还存活的放到 tenured 里,就不用每次去检查存活的。

四、Garbage Collectors

 

  1、GC的演化(随着内存大小的增长而演进)

    ①、几兆 --- 几十兆:Serial 单线程STW垃圾回收 新生代 老年代

    ②、几十兆 --- 上百兆1G:parallel 并行多线程

    ③、几十G:Concurrent GC

 

    

    

 

posted @ 2023-09-24 17:21  ki1616  阅读(6)  评论(0编辑  收藏  举报