Java6和6之前,常量池是存放在方法区(永久代)中的。
Java7,将常量池是存放到了堆中。
Java8之后,取消了整个永久代区域,取而代之的是元空间。运行时常量池和静态常量池存放在元空间中,而字符串常量池依然存放在堆中。
GC 垃圾收集器有哪些?
CMS
- CMS Concurrent Mark Sweep 并发标记清除
- 初始化标记:GC root 根可以直接关联到的对象,速度比较快。
- 并发标记:主要标记过程,标记全部的对象,注:和用户线程一起并发运行。
- 重新标记:由于并发标记时,用户线程依然运行,因此正是清理前,再次修正,
- 并发清除和并发重置: 基于标记结果,直接清楚对象。
- 其中初始标记和重新标记是独占系统资源的,而并发标记和并发清除是可以和用户线程一起执行的。从整体上来说,CMS收集不是独占式的,他可以在应用程序运行过程中进行垃圾回收。
G1收集器
G1收集器与前面的CMS收集器相比有两个显著的改进,一是G1收集器是给予 标记整理 算法实现的收集器,也就是说不会产生内存碎片,这对于长时间运行的应用系统来说非常重要。而是他可以精确的控制的停顿,G1收集器可以实现在基本不牺牲吞吐量的前提下完成低停顿的内存回收,这是由于它能够极力地避免全区域的垃圾收集,之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个Java堆(包括新生代、老年代)划分为多个大小固定的独立区域(Region),并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域(这就是Garbage First名称的来由)。区域划分及有优先级的区域回收,保证了G1收集器在有限的时间内可以获得最高的收集效率。