针对垃圾回收分代算法将JVM中堆和非堆空间分为三个代:年轻代,年老代,永久代(jdk1.8元空间),年轻代存储新产生的对象,年老代存储年龄大些的对象,永久代则对应方法区,主要存储的是java的类信息,包括解析得到的方法,属性,字段等,永久代基本不参与垃圾回收的。 ##年轻代又分为一个eden区和两个相同的survior区。刚开始新建对象都是放置在eden区,分成这三部分,主要是为了生命周期短的对象尽量留在年轻代,当eden区申请不到空间时,进行minorGc,把存活的对象拷贝到surivor。年老大主要存放生命周期比较长的对象,如缓存对象。 JVM垃圾回收过程描述 1 对象在eden区完成内存分配 2 当eden区满了,再创建对象,会因为申请不到空间,触发MinorGc ,进行年轻代的垃圾回收(eden+1个surivor) 3 minorGc时,Eden不能被回收的对象被放入到空的surivor(eden肯定会被清空),另外一个surivor里不能被GC回收的对象也会被放入到这个surivor,始终保持一个surivor是空的 4 当做第三步时候发现surivor也满了,则这些对象被copy到old区,或者说surivor里面有些对象足够old,也会放入到old区 5 当old区也满了,就会进行fullGc 注意 majorGc和FullGc 是最消耗CPU,会影响程序的响应的,正常情况下是minorGC 操作频繁,FullGC执行次数少,一旦fullGc频繁,基本上就快内存溢出了。 如果在分配对象在eden区没有空间了,会执行一次minorGc 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)这样的目的是避免在eden区和两个surivor里面之间大量的内存拷贝(新生代采用复制算法收集内存)