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