说道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倍以上;
转载请注明原文地址: https://ju.6miu.com/read-200226.html