JVM垃圾回收机制(GC)

目录

1.什么是垃圾回收

2.GC对于虚拟机各块的影响

3.垃圾回收具体是怎么展开的

3.1引入计数

3.2可达性分析(JVM使用的就是这种方法)

3.2.1.标记清除

3.2.2.复制算法

3.3.3标记整理

3.3分代回收


1.什么是垃圾回收

       在C语言等编程语言中,采用的是动态内存管理,我们使用malloc申请内存,free释放内存,在malloc这种方式申请到的内存是伴随整个进程的生命周期的,这一点对于服务器非常不友好,因为服务器每个请求都去malloc一块内存,如果不去free释放,在内存越来越多的时候,后续内存可能就申请不到了,因为被申请完了. 这就是著名的内存泄漏问题,实际开发中,经常在使用maclloc申请内存后,忘记使用free释放内存了,或者因为某些情况没有执行到free函数.这其实对于开发工作来说很不友好,Java 为了解决这种问题,引入了垃圾回收机制,引入这种机制以后,就不需要手动去释放内存了,程序会自动判定,某个内存是否会继续使用,如果后续不用了,就会被自动释放掉,在Java中释放的就是对象.

2.GC对于虚拟机各块的影响

  JVM中有好几块内存,那么GC这种机制对于各个部分有什么影响呢?

1.程序计数器(不需要GC)

2.栈(也不需要GC) 局部变量在代码块执行结束以后自动销毁了 栈自己的特点就是这样,所以不需要GC

3.元数据区(方法区)一般都是涉及到类加载,很少涉及到类卸载

4.堆是GC的主要战场(对象的释放)

3.垃圾回收具体是怎么展开的

1.识别出垃圾,判断这个对象后续是否还要继续使用,在Java中使用对象,一定需要通过引用的方式来使用(除了匿名对象)

如果一个对象没有任何引用指向它,就视为是无法被代码使用,就可以视为垃圾了

如: 

void func(){
    Test() = new Test();
    t.start();
}

此时通过new Test就是是堆上创建了对象,当代码执行到 } 的时候,此后的局部变量就直接被释放掉了,此时如果更进一步的去想,上述 new Test()对象,也就是没有引用指向它了,  此时这个对象没有被这些代码访问到,这个对象就是垃圾了. 如果代码更加复杂一些,这个判断就会更复杂了.

你可能感兴趣的:(jvm)