Apache Tomcat
所谓的GC回收就是回收一些不用的内存,因为程序在运行过程中,这些对象运行结束后都得释放出来,这些对象释放后,就必须对这些内在进行回收。如果不能有效的加收这些内存就可以导致内存溢出的问题。
JAVA中GC回收机制有两种:Scavenge GC和Full GC。
Scavenge GC回收机制主要是对年轻代进行回收,或者说年轻代主要使用Scavenge GC来回收内存。年轻代分为一个edan区和两个Survivo区,Scavenge GC首先是对edan区的对象进行回收,如果回收结束后还是存活对象,
我们会将它放到Survivo区,由于 edan区的对象变化的很频繁,所以在年轻代中经常会使用Scavenge GC机制来进行回收。
Full GC是指对整个堆内存中的对象进行加收,对年轻代、年老代和持久代都会进行回收,但是对于java 8的版本已经没有持久代,被metaspace所代替,所以对于java 8的版本或之后的版本full gc只对年轻代和年老代进行回收。
由于Full GC回收的内容比较多,所以一般不可能频繁的触发Full GC回收。
一般有以下条件触发时才会触发Full GC回收机制:
1.年老代被写满。
2.持久代被写满。
3.system.gc()被调用。
4.上一次GC后,heap分配的策略发生改变。
上面介绍的是GC加收的机制,但是不管使用哪种回收机制,可选择的回收算法是一致。通常GC回收的算法有
三种:串行收集器、并行收集器和并发收集器。
1.串行收集器
用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。可以使用-XX:+UseSerialGC打开。
2.并行收集器
对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理器机器上使用。使用-XX:+UseParallelGC.打开。在JavaSE6.0中进行了增强–可以对年老代进行并行收集。如果年老代不使用并发收集的话,默认是使用单线程进行垃圾回收,因此会制约扩展能力。使用-XX:+UseParallelOldGC打开。使用-XX😛arallelGCThreads=设置并行垃圾回收的线程数。此值可以设置与机器处理器数量相等。对于并行收集器,还可能设置并行收集器的暂停时间-XX:MaxGCPauseMillis=N表示时间,单位为毫秒并行收集器吞吐量设置-XX:GCTimeRatio=例如:-XX:GCTimeRatio=19,表示回收垃圾的时间占总时间的5%,计算公式1/(1 + N)。
3.并发收集器
并发收集器相对于并行收集器,主要解决的问题是年老代收集垃圾的方式,并行收集器中年老代是串行的收集,现在并发收集器是为减少这种年老代收集垃圾时的暂停时间,即可以设置在年老代有多少线程可以同时收集垃圾。
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!