Java学习笔记12

GC(垃圾回收)

GC算法

GC算法有标记清除法、标记整理、复制算法、引用计数器
堆里面的分区:Eden、from、to、老年区

引用计数法

Java学习笔记12

复制算法

Java学习笔记12

每次垃圾回收(GC)会将Eden活的对象放入移入幸存区from,两个幸存区中谁空谁就是to。一旦Eden区进行了垃圾回收,Eden就为空
当一个对象经过15次(默认值)垃圾回收(GC)还没死,就会进入养老区。
(-XX:MaxTenuringThreshold=999)
通过该命令设置进入养老区的时间
From和To区会发生变化
Java学习笔记12
好处:没有内存碎片
坏处:浪费内存空间

标记清除法

Java学习笔记12
优点:不需要额外的空间
缺点:两次扫描严重浪费时间,会产生内存碎片

标记压缩法

Java学习笔记12

小结

内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记清除算法=标记压缩算法>复制算法
没有最好的算法,只有最合适的算法-GC:分代收集算法
年轻代:

  • 存活率低(使用复制算法)
    老年代:
  • 区域大,存活率高(使用标记清除(内存碎片不是太多)算法和标记压缩算法混合)

JMM

JMM:Java Memory Model(Java 内存分析模型)
作用:缓存一致性协议,用于定义数据读写规则
JMM定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存(Main Memory)之中,每个线程都有一个私有的本地内存(Local Memory)。
每个线程都有自己的工作区域,都是从主内存拷贝过来
Java学习笔记12
解决共享对象可见性问题(数据不一致):volilate
volilate能保证可见性、顺序性,不能保证原子性