什么是JVM:
JVM是一种规范或者说是一种理念。现在主要有三种JVM。
Sun公司的HotSpot(我们常说的JVM)
BEA公司的JRockit
IBM公司的J9vm
虚拟机内存结构图:
堆区:
jdk1.7版本及之前的版本堆区内存图:
注:当我们创建对象时候是在堆内存的新生代内存区中的伊甸园区进行创建的对象。策划
程序运行过程中内存分配图:
官方文档精华描述图:
注:jdk1.6版本之前常量池放在方法区
jdk1.7版本常量池放到了堆内存中
jdk1.8版本常量池放到了元空间中
jdk1.8:
jdk1.8将最初的永久代取消了,由元空间进行替代。
目的是为了将HotSpot与JRockit两个虚拟机为标准
jdk1.8 堆内存图:
GC是什么:
频繁收集 Young区:复制算法(Copying)
较少收集 Old区
基本不动 Perm区
什么是复制算法:
简单的语言描述复制算法的原理:
当对象在Eden区和from区(from区就是新生代的两个小的区域,不一定是哪一个)不停创建后,当这两片内存空间占用达到90%的时候进行一个Minor GC,如果对象还能够存活,并且还能被另一块空间所容纳(也就是to区域),则使用复制算法将这些依然存活的对象复制到另一块区域中即to区。这时候之前的Eden区域和from区域已经是空的了,这时候当创建对象的时候把刚刚清理掉的from区当作to区,把to区当作from区继续进行 Minor GC。
复制算法的补充:
如果说对象存活率达到了高于百分之十那么就会像老年代借用一块内存作为分配担保。
标记-清除算法:
如同他的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有的需要回收的对象,在标记完成后统一进行回收。
主要有两点不足:
一个是效率问题
一个是空间问题,会产生大量的内存碎片。
标记清楚算法示意图:
标记-整理算法:
标记整理算法主要是发生在老年代,标记过程仍然是与“标记-清除”一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有的存活对象都向一方移动,然后直接清除掉边界以外的内存。