jvm-GC 垃圾收集

     JAVA垃圾回收机制,简单来说GC(Garbage Collection)要完成的只有三件事1.内存中那些内存需要回收2.什么时候回收3.如何回收

1.那些对象需要回收

       java是面向对象的语言,如果对象已经死了,那么这些对象是要被回收的,学过操作系统的都知道,操作系统的文件管理中,在删除文件时候,要先判定文件是否有进程在使用,里面用到了一个叫做引用用计数法,只要有进程使用了该文件。引用数加1。如果经常使用完改文件,这个数目就会减1。可能面试的时候我们就会认为java也是使用了这种方式。实际上并非如此。原因可以从以下程序中看出:

public class Test {
    public Object instance = null;
    public  static void  main(){
         Test obj1 = new Test();
         Test obj2 = new Test();
         obj1.instance = obj2;
         obj2.instance=obj1;
         System.gc();
    }

}

 对象也会被回收,所以java使用的不是引用计数法

而java使用的是根搜索法,这里有一个名词叫做 ‘GC Roots’,来判定对象是否存活,如果一个对象到一个GC roots没用任何引用链存在,那么说明此对象是不可的,因为GC Roots对象都是方法执行时所使用的、如果没有引用说明这个对象是没有用。

GC Roots对象包括:

1.虚拟机栈

2.方法区中类静态属性引用的对象

3.方法区中的常量引用的对象

4.本地方法栈(navtive 方法)

垃圾回收的集中算法:

1标记清除算法:首先要标记所有需要回收的对象,在标记完成后统一回收掉所有标记的对象

2.复制算法:把存活的对象复制到另一块内存上面,叫做survivor区,然后把已经使用的内存全部清除掉

3.标记整理算法:把所有存活的对象都往内存的一端移动,然后再删除它占用的内存块。

基于这些方式,JDK提供了,很多种垃圾收集器

Serial收集器:是最基本,历史最悠久的收集器,但是它有一个致命的弱点就是在GC时,必须停止所有的工作线程。工作:分为新生代采用复制算法,而老生代采用标记整体法。单线程执行。

ParNew收集器:其实他是Serial收集器的多线程版本,其他所有的控制参数都和Serial一样。

Parallel Scavenge收集器:它是一种新生代收集器,也是使用复制算法的收集器,但是它是并行执行的,也就是说,他进行GC时。用户进程并不会停止。

Serial Old收集器:它是老年代版本,也同样是单线程收集器,使用标记整体算法,主要有两大用途:一个是在JDK1.5的版本中与Parallel Scavenge收集器搭配使用,另一个就是作为CMS收集器的后备。关于CMS马上会介绍。

Parallel Old:他是Parallel Old的老年代版本,使用多线程和标记整理算法,since 1.6 ,

CMS收集器:他是一种以获取最短停顿时间为目标的德收集器,一些互联网java应用都是用这种收集器,互联网应用很重视响应速度,他是基于标记-清除算法,它提供了一个参数用来标记触发临界点。-XX:CMSInitiatingOccupancyFraction的值,它指示在老年代被使用比值,开始GC。

jvm堆分为新生代和老生代。而新生代分为Eden,survival区

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值