学习笔记系列开头惯例发布一些寻亲消息
链接:https://baobeihuijia.com/bbhj/contents/3/190801.html

java垃圾回收(stop the world)
- 专注于堆和方法区的垃圾回收,年轻代,老年代,永久代
- 判断对象是否还存活?(区分尸体)
- 引用计数算法
- 给每个对象保存一个整型的引用计数器类型,用于记录对象被引用的情况
- 缺点就是无法处理循环引用的情况,导致内存泄漏
- 可达性分析算法
- finalization机制(死前挣扎机制)
- 用于在对象被回收时进行资源释放,比如关闭文件,套接字和数据库连接等。
- 由于finalize的存在,对象有三种状态
- 可触及的:活着
- 可复活的:finalize重写过并且还没有执行,因此有机会进行死亡逃脱
- 不可触及的:直接打死

-
垃圾回收(三种算法清理尸体)
- 复制算法(常用在新生代这种回收率较高的块上):有一块是专门用来备用的,清除的时候将存活对象复制到备用上,然后清除当前使用的内存块,交换两个的块的角色
- 标记-清除算法:挨个清理,容易产生内存碎片,维护一个空闲列表,是一种非移动式的回收算法
- 标记-压缩清除:在标记清除的基础上加上了内存碎片的整理,而不是维护一个列表,因此是一种移动式的回收算法
-
增量收集算法:(解决stop the world)
每次垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。使用这种方式,由于在垃圾回收过程中,间断性地还执行了应用程序代码,所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。
-
分代算法和分区算法:针对不同情况用不同的垃圾回收算法

-
内存溢出OOM和内存泄漏ML
-
stop the world,所有的GC都会有这种情况
-
GC的并发和并行
-
concurrent
- 并发:多个事情在同一段时间内同时发生:用户线程和垃圾回收线程同时执行,不会停顿用户进程
-
STW
- 并行:多个事情在用一个时间点上同时发生:多条垃圾回收并行,用户处于等待状态
- 串行:相对于并行,单线程运行
-
安全点: 数量需要适中,安全点实质上是一条指令(一般选择执行时间较长的指令作为安全点)
- 抢先式中断:控制权在安全点,把所有线程挂起,没有运行到安全点的就恢复让运行到安全点
- 主动式中断:线程运行到这里主动询问,主动挂起
-
安全区:是扩展的安全点,在区域的任何位置GC都是安全的,安全区的对象引用关系不会变化
- JVM会忽略标记进入到安全区的线程,线程还可以自主运行没有被停(因为其中的每句都是安全的)
- 但等到线程出来的时候,就检查GC是否完成,完成了就可以走,没完成就得等着(要是进入了不安全区域,而且这个线程还没有被停住,就容易让JVM和改变后的引用关系发生冲突)
-
引用(是有引用的可触及的对象,所以不会被判定为尸体,但是不一定有引用就会存活,也分情况)