如果把方法区这个逻辑区域看作接口,可以认为永久代是方法区的一个实现
JDK1.6 常量池在方法区
JDK1.7以后,常量池从方法区被移动到堆中
JDK1.8,没有永久代,常量池在元空间
堆内存调优
GC-1.7
GC 1.8
相关参数
GC
频繁收集年轻代
较少收集老年代
基本不动永久代
复制算法: MinorGC
新生代中使用的是MinorGC,这种GC算法采用的是复制算法(copying)
每次使用新生代的Eden和其中一块survior(方便起见,使用的这块survior成为from区,另一块成为to区),当回收时,将Eden和Survior中存活的对象拷贝到另一块Survior空间,最后清理Eden和原来那块survior(from区和to区交换)。并将这些存活下来的对象的年龄设为1,以后对象在Survior区每熬过一次Minor GC,就将对象的年龄+1, 当对象的年龄达到某个值(默认是15,-XX:MaxTenuringThreshold参数设置),这些对象就会成为老年代
注:一些大对象会new到永久代
一般新生代的内存分配 8:1:1,即Eden占80%,另外两个Survior各占10%
复制算法的优缺点: 没有碎片空间,浪费了一些空间(需要一个空的survior作为to区用于等待被使用)
标记清楚/整理:Major GC(Full GC)
老年代GC一般是标记清除(Mark-Sweep)实现或者标记清除和标记整理(Mark-Compact)的混合实现
###### 标记清除
1.标记
从根集合开始扫描,对存活对象进行标记
2.清除
扫描整个内存空间, 回收未被标记的对象, 使用free-list记录该区域
- 优缺点: 不需要额外空间,但两次扫描耗时严重,会产生内存碎片
标记整理
1.标记
2.整理
优缺点:不会产生碎片, 但两次遍历+整理的效率较低
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。