java内存结构和gc算法有很多种,二者也是互相决定的;使用不同的gc算法的jvm会有不同的内存结构。这里就简单整理下常见的sun jvm内存结构和回收算法。
一、java的内存结构
java的内存分为如上几块。
Virtual:如果 -Xms指定的值比-Xmx的小,那么两者的差值就是图上所示的virtual区域
Perm:永久区,主要用来放JVM自己的反射对象,比如类对象和方法对象等。对于spring hibernate这些需要动态类型支持的框架,这个区域需要足够的空间。这个区域不属于heap中。
Young:这里是较新的对象活跃区域。新创建的对象处于Eden区中,经过一次回收的对象会转移到From区;From区再经过一次回收会转移到To区;To区再经过一次回收就会移出Young区转移至Tenured(Old)区。
Tenured(Old):这里是经过数次GC后仍然存活的对象所处区域,池对象(如线程池)就活跃在这个区域中。
二、java gc机制
由于垃圾收集算法在各个虚拟机以及不同的平台上会有不同的实现,所以这里只大概记录一下几个基本的算法。
1.引用计数:
为每一个对象添加一个计数器,计数器记录了对该对象的活跃引用的数量。如果计数器为0,则说明这个对象没有被任何变量所引用,即应该进行垃圾收集。
收