其中Permanent Generation对应Java虚拟机规范中的Method Area,Old Generation和Young Generation对应JVM Heap。 工具
对象主要在年轻代的Eden区分配(不讨论JIT编译),其实堆也不彻底是线程共享,若是启用了本地线程分配缓冲,优先在线程的TLAB上分配,这个TLAB每一个线程本身独占。少数状况下,也可能会直接分配在年老代。整体上遵照几个规则: spa
一、对象优先在Eden区分配,Eden区空间不足时发起Minor GC,将Eden区和正在使用的一个Survivor区对象转移到另外一个Survivor区,如目标Survivor区空间不足,转移到年老代。 线程
二、须要大量连续内存空间的Java大对象,若是超过设定的阈值,将直接在年老代分配。 日志
三、对象每被移动到Survivor区一次年龄加1,超过设定的阈值仍然存活,将被移动到年老代。 对象
四、Minor GC前,虚拟机会判断年老代是否有连续空间容纳新生代要转移的对象,若是没有,根据参数设置可能引起年老代Major GC。 内存
Minor GC,指新生代GC,发生频率高速度快。 虚拟机
Major GC,也称Full GC,指年老代GC,发生频率低速度慢,通常比Minor GC慢10倍以上。 io