?
??
? 分区作用:?
新创建的对象通常先将其分配在新生代中,在新生代中经过若干次GC之后仍未释放的对象,再将它移动到旧生代。为了让内存回收更高效(GC会暂停JVM中的应用),Sun JDK在1.2开始对堆采用了分代管理的方式。在分配对象遇到内存不足时,先对新生代进行GC(Young GC);当新生代GC之后仍无法满足内存空间分配需求时, 才会对整个堆空间以及方法区进行GC (Full GC)
? 相关参数:
-Xms ? ? ? ? ? ? ? ? ? ? ? -- 设置堆内存初始大小
?-Xmx ? ? ? ? ? ? ? ? ? ? ? -- 设置堆内存最大值
-XX:MaxTenuringThreshold ?-- 设置对象在新生代中存活的次数
-XX:PretenureSizeThreshold ?-- 设置超过指定大小的大对象直接分配在旧生代中
? 注意点:当新生代设置得太小时,也可能引发大对象直接分配到旧生代中。
?
? 分区作用:
Eden区为对象通常最初分配到的地方,Survivor区分为S0和S1两块大小相等的区域。JVM进行Minor GC时,将Eden中还存活的对象拷贝到Survivor区中,还会将Survivor区中还存活的对象拷贝到Tenured区中。在这种GC模式下,JVM为了提升GC效率, 将Survivor区分为S0和S1,这样就可以将对象回收和对象晋升分离开来。
? 相关参数:
-Xmn ? ? ? ? ? ? -- 设置新生代内存大小。
-XX:SurvivorRatio ?-- 设置Eden与Survivor空间的大小比例
? 注意点: 图中Virtual部分表示可伸缩的内存空间,当用-Xms在指定堆的初始大小为128m,通过-Xmx指定堆最大为256m时,JVM会根据内存情况在128m与256m之间伸缩。为了避免JVM进行这些伸缩消耗性能,对于能够提供稳定内存空间的用作服务器的JVM,通常将-Xms和-Xmx设置为相等。
? 分区作用:
也被成为持久代,用来存放JVM加载的类型信息。包括: 类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Class类的引用,方法表等。方法区是全局共享的,在一定条件下也会被GC。
? 相关参数:
-XX:PermSize ? ? ? ?--设置Perm区的初始大小
-XX:MaxPermSize ? ?--设置Perm区的最大值
?
? 作用:?
JVM方法栈为JVM线程私有内存,当方法运行完毕后,其对应的栈帧内存会自动释放
? 相关参数:
-Xss ? ? ? ? ? ? ? ? ?--设置方法栈的最大值
? TLAB:
JVM所占用的主要内存都是从堆空间分配的,堆是所有线程共享的,因此在堆上分配内存需要加锁,Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocation Buffer)。其大小由JVM根据运行情况计算得到,也可通过参数-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden空间的百分比,默认值为1%。在TLAB上分配内存不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配。如果对象过大或TLAB用完,则仍然在堆上进行分配。
class="MsoListParagraph">ü???优缺点:在空间中存活对象较多的情况下较为高效,但由于该算法为直接回收不存活对象所占用的内存,因此会造成内存碎片。
?
标记-压缩(Mark-Compact)ü???算法:标记阶段与“标记-清除”算法相同,但在清除阶段有所不同。在回收不存活对象所占用的内存空间后,会将其他所有存活对象都往左端空闲的空间进行移动,并更新引用其对象指针。
ü???过程:
?
ü???优缺点:在“标记-清除”的基础上还需要进行对象移动,成本相对较高,好处则是不产生内存碎片。
??
?
?
图4 Sun JDK中可用的GC方式
?
基于上一小节讲解的跟踪收集器算法,Sun JDK在新生代和老生代进行了不同的算法实现,形成了上图中的GC方式分布。本小节将具体介绍新生代和老生带的GC策略及组合方式。
?
? 算法:复制(Copy)
? 过程:
? 1. 扫描出新生代中存活的对象;
? 2. Minor GC将存活的对象复制到做为To Space的S0/S1区;
? 3. 之前做为To Space/From Spache的S0/S1区对换角色;
? 4. 经历过几次Minor GC仍然存活的对象,放入老生代。
? 算法:复制(Copy)
? 过程:在扫描和复制时均采用多线程方式进行(如下图),并且并行回收GC为大的新生代回收做了很多优化(可以自行扩展阅读相关资料)。
? 优势:在多CPU的机器上其GC耗时会比串行方式短,适合多CPU、对暂停时间要求较短的应用。 ? 配置方式:本身是Server级别多CPU机器上的默认GC方式,也可以通过-XX:+UseParallelGC来指定,并且可以采用-XX:ParallelGCThread来指定线程数。?
? 优缺点:如上图,优点是只有在第一次标记和重新标记阶段需要暂停整个应用,所以能够做到影响应用响应时间很短。缺点是并发标记和并发收集阶段CMS会与应用线程争用CPU资源(用增量CMS模式可以缓解),并且容易产生内存碎片,free-list机制会导致Minor GC效率下降。
? 配置方法:通过-XX:UseConcMarkSweepGC来启动老生代CMS GC;通过-XX:+UseCMSCompactAtFullCollection来启动内存碎片整理功能(整理也会暂停应用)。
?
ü?? Clinet、Server模式默认GC策略
?
新生代GC方式
旧生代和持久代GC方式
Client
串行GC
串行GC
Server
并行回收GC
Parallel Mark Sweep GC
?
?
ü?? Sun JDK GC组合方式
?
新生代GC
旧生代和持久代GC
-XX:+UseSerialGC
串行GC
串行GC
-XX:+UseParallelGC
并行回收GC
Parallel Mark Sweep GC
-XX:+UseConcMarkSweepGC
并行GC
并发GC
当出现Concurrent Mode Failure时采用串行GC
-XX:+UseParNewGC
并行GC
串行GC
-XX:+UseParallelOldGC
并行回收GC
Parallel Mark Conpact
-XX:+UseConcMarkSweepGC
-XX:-UseParNewGC
串行GC
并发GC
当出现Concurrent Mode Failure或Promotion Failed时采用串行GC
不支持的组合方式
1.-XX:+UseParNewGC -XX:+UseParallelOldGC
2.-XX:+UseParNewGC -XX:+UseSerialGC
?
?