在HotSpot虚拟机中存在三种垃圾回收现象,minor GC、major GC和full GC。
minor GC:对新生代进行垃圾回收,当JVM无法为一个新的对象分配空间时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,因此Minor GC(采用复制算法)非常频繁,虽然它会触发stop-the-world,但是回收速度也比较快。
major GC:对老年代进行垃圾回收
full GC: 同时对新生代、老年代和永久代进行垃圾回收
许多major GC是由minor GC触发的,所以很难将这两种垃圾回收区分开。major GC和full GC通常是等价的,收集整个GC堆。但因为HotSpot VM发展了这么多年,外界对各种名词的解读已经完全混乱了,当有人说“major GC”的时候一定要问清楚他想要指的是上面的full GC还是major GC。
原因: 永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen
jdk1.8中则把永久代给完全删除了,取而代之的是 元空间(MetaSpace)
1.新生代:Eden+From Survivor+To Survivor
2.老年代:OldGen
3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)
元空间没有使用堆内存,而是与堆不相连的本地内存区域。所以,理论上系统可以使用的内存有多大,元空间就有多大,所以不会出现永久代存在时的内存溢出问题。
如果从事java开发相关工作,可以买一本《深入理解java虚拟机》看一下
参考:
https://www.cnblogs.com/baizhanshi/p/5817845.html
《深入理解java虚拟机》
https://www.jianshu.com/p/a7e984a858ca
https://www.jianshu.com/p/66e4e64ff278