一、划分
1、线程独占区:线程独占区指的是一个线程单独占用的资源
2、线程共享区:多个线程共同会用到的资源。比如:方法区和堆。所有线程共享,一起用。
功能
一、程序技数器:控制代码的执行顺序
二、java虚拟机栈:局部变量表,方法出口等
三、本地方法栈和虚拟机栈:本地方法栈为虚拟机执行native方法服务
四、java堆,存放对象实例,垃圾收集器管理的主要区域
五、方法区:常量,静态变量
二、垃圾回收
回收策略
1、标记-清除算法:产生大量的碎片,使得无法给较大的对象分配内存
2、复制算法:将堆划分成A+B两块区域,先在A区域分配对象,当GC回收的时候,会使用标记算法将垃圾标记回收,再将没有被回收的对象复制到B区域,在清空A区域。
优点:解决了碎片化问题,
缺点:复制耗费时间,且要浪费一半的内存用作空闲面。
适用场景:适用于对象存活率低的场景(年轻代)
3、标记-整理算法:升级版的标记-清除算法,先标记,在整理,在清除
避免了内存的不连续行,防止出现大量内存碎片,不用浪费一半的内存
适用场景:适用于存活率高的场景(老年代)
4、分代收集算法
根据不同的内存分配,选择不同的收集算法。比如:针对老年代使用使用使用什么算法,针对新生代使用什么算法。
垃圾回收器
1、Serial:单线程的。因为单线程所以效率很高,最基本,发展最悠久的
2、Parmew:多线程,也是并发收集
3、Parallel:并行收集,是一种吞吐量优先的垃圾收集器,它在进行垃圾收集时,会尽可能地吞吐运行用户代码的时间,以换取更少的垃圾收集停顿时间。它主要通过标记-清除算法实现,在进行垃圾收集时,会先暂停所有用户线程,然后进行标记-清除操作。
4、Cms:并发清理,收集快,占大量cpu
5、G1 :集齐了前面收集器的优点并行、并发、分代回收、分成一个个内存区域进行回收、空间整合可预测的停顿。
Parallel并行垃圾收集器和 CMS是并发收集器了
我们需要先分清楚这里的两个概念:并发和并行
并发和并行
1、并行指【多个处理器】或者多核的处理器同时处理多个不同的任务。而并发指【一个处理器】同时处理多个任务,
它是逻辑上的同时发生。
2、并行是在同一时刻,有多条指令在多个处理器上同时执行。而并发是在同一时刻只能有一条指令执行,
但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果。
G1和CMS垃圾收集器的主要区别体现在以下四个方面:
1、使用范围:CMS收集器是【老年代】的收集器,可以配合【新生代】的Serial和ParNew收集器一起使用。
而G1收集器则收集范围包括【老年代和新生代】,不需要结合其他收集器使用。
2、停顿时间:CMS收集器以最小的停顿时间为目标。
3、垃圾碎片:CMS收集器使用【“标记-清除”】算法进行垃圾回收,容易产生内存碎片。
而G1收集器使用的是【“标记-整理”】算法,进行了空间整合,降低了内存空间碎片。
4、垃圾对象选择策略: CMS使用【引入计数法】,查找垃圾对象,G1使用【可达性分析法】查找垃圾对象。
GC的分类
Minor GC:发生在年轻代中的GC动作,采用的收集算法是复制(需要复制的对象很少)。
Full GC:主要对老年代的回收,但同时包含了对年轻代的回收(即包含了Minor GC)。采用的收集算法是标记-清除和标记-整理。相比Minor GC慢,执行频率低。
堆
1、新生代-垃圾回收主要对象,包括:Eden、Survivor
2、老年代
3、永久代(方法区的实现):PermGen----->替换为Metaspace(元数据)
回收次数
1.发生Minor GC后有用对象年龄+1并被放入到Suvivor区
2.Eden默认占年轻代8的权重,Survivor区两空间分别占1
两个Survivor区(from、to):发生Minor GC后有用对象年龄+1,并将存活对象从From使用复制算法到To中,清空From空间,当对象年龄达到一定值后进入老年区(默认15)