浅谈Jvm GC机制

来源:互联网 发布:网络转播权 编辑:程序博客网 时间:2024/05/31 06:21

在谈GC之前不得不先来谈谈JVM对于内存的管理,因为GC的主要对象是内存中的堆区域。
内存在JVM中主要被分成了栈、堆、方法区还有程序计数器。还有更细的分发,比如又将栈分为虚拟机栈和本地方法栈等。栈中主要存储的是堆中对象的引用。它是线程私有的,堆中主要存放的是对象的实例,它是线程共享的。方法区里面主要存储的是被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
讲一个简单的例子。A a = new A();当程序读到new时首先会去方法区中查找A对象是否已经被虚拟机加载进来,如果没有加载进来的话边要加载对象A,然后内存自动管理机制会在堆中开辟出一段空间用以存放a对象。
GC说白了要主要在解决三个问题:1、回收哪些对象;2、什么时候回收;3、怎样回收。首先关于回收哪些对象问题,实现的算法主要有两种:一种是计数的方法,就是当对象被引用一次时就加1,引用失效时就减1。当计数为0时就回收。第二种是可达性算法。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下收索,收索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时则证明此对象是不可用的。
先分享到这吧。

1 0