Tomcat应用中Java的垃圾回收机制GC

来源:互联网 发布:怎么识别淘宝店的真假 编辑:程序博客网 时间:2024/04/27 16:03

某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用。

一:什么是垃圾回收器;

Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(MemoryAllocation)、自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存快)。

垃圾回收操作不是实时发生的,他需要消耗CPU、线程、时间等资源,一般对象死亡了会马上自动释放,但当内存消耗完或者达到某一个指标时,就触发垃圾回收操作;

二:Java内存分代管理;

目的:是为不同代的内存块运用不同的管理策略(算法),从而最大化性能。相对于年老代,通常年轻代要小很多,回收的频率高,速度快。年老代则回收频率低,耗时长。内存在年轻代里面分配,年轻代里面的对象经过多个回收周期依然存活的会自动晋升到年老代。(如下图所示) 


具体分为三代:年轻代(Young Generation)、年老代(OldGeneration)、永久代(Permanent Generation) ;

1、永久代:存储类、方法以及它们的描述信息。可以通过-XX:PermSize=64m和-XX:MaxPermSize=128m两个可选项指定初始大小和最大值。通常我们不需要调节该参数,默认的永久代大小足够了,不过如果加载的类非常多,不够用了,调节最大值即可。

2、年老代:主要存储年轻代中经过多个回收周期仍然存活从而升级的对象,当然对于一些大的内存分配,可能也直接分配到永久代(一个极端的例子是年轻代根本就存不下)。

3、年轻代:绝大多数的内存分配回收动作都发生在年轻代。如下图所示, 年轻代被划分为三个区域,原始区(Eden)和两个小的存活区(Survivor),两个存活区按功能分为From和To。绝大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的对象放到存活区。

三:Java虚拟机垃圾回收机制;

1、Minor GC:从年轻代回收内存(包括Eden和Survivor);当JVM无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了。所以分配率越高,越频繁执行 Minor GC;所有的 Minor GC 都会触发“全世界的暂停(stop-the-world)”即停止应用程序的线程。

2、Major GCvs Full GC:指发生在老年代的 GC,出现了 MajorGC,经常会伴随至少一次的 Minor GC 。Major GC 的速度一般会比 Minor GC 慢10倍以上。

当发生Full GC时,也会触发“全世界的暂停(stop-the-world)”即停止应用程序的线程。并且持续时间长


:存放运行时创建(new)的对象,存取速度慢,运行时可动态的分配内存,不需要提前确定生存期;

栈:存放基本数据类型的变量、对象引用的变量,存取速度快,必须确定大小和生存期,所以缺乏灵活性