浅谈GC(最后更新时间:20170328)

说道GC,不得不提及一下内存模型,JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。
简单来说,堆是Java代码可及的内存,留给开发人员使用的;非堆是JVM留给自己用的,包含方法区、JVM内部处理或优化所需的内存(如 JIT Compiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。
堆分为年轻代,年老代,jdk7中还有永久代,jdk8中替换为元空间(已经不存在对空间中);而GC发生在年轻代和年老代中,年轻代内存分为Eden和S0和S1(内存比例8:1:1),当类被加载到堆中时,现在Eden区画一片区域,然后开始加载;当内存不足时,就回触发MinorGC,jvm会将可达的对象移至S0中,下一次MinorGC时,会将S0以及S1做交换,当S区中的标记对象的年龄达到16,会将S区中的对象移至老年代,当老年代空间不足,会触发FullGC,FullGC比MinorGC的执行效率上要慢10倍以上;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章