GC(垃圾回收)
GC算法
GC算法有标记清除法、标记整理、复制算法、引用计数器
堆里面的分区:Eden、from、to、老年区
引用计数法
复制算法
每次垃圾回收(GC)会将Eden活的对象放入移入幸存区from,两个幸存区中谁空谁就是to。一旦Eden区进行了垃圾回收,Eden就为空
当一个对象经过15次(默认值)垃圾回收(GC)还没死,就会进入养老区。
(-XX:MaxTenuringThreshold=999)
通过该命令设置进入养老区的时间
From和To区会发生变化
好处:没有内存碎片
坏处:浪费内存空间
标记清除法
优点:不需要额外的空间
缺点:两次扫描严重浪费时间,会产生内存碎片
标记压缩法
小结
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记清除算法=标记压缩算法>复制算法
没有最好的算法,只有最合适的算法-GC:分代收集算法
年轻代:
- 存活率低(使用复制算法)
老年代: - 区域大,存活率高(使用标记清除(内存碎片不是太多)算法和标记压缩算法混合)
JMM
JMM:Java Memory Model(Java 内存分析模型)
作用:缓存一致性协议,用于定义数据读写规则
JMM定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存(Main Memory)之中,每个线程都有一个私有的本地内存(Local Memory)。
每个线程都有自己的工作区域,都是从主内存拷贝过来
解决共享对象可见性问题(数据不一致):volilate
volilate能保证可见性、顺序性,不能保证原子性