在java程序中,没有了像其他类型编程语言那样的由程序创建者所自行管理内存的方法。转而把内存管理交给了jvm自动进行管理,包含了创建到销毁的全过程。其中销毁的过程由一个垃圾收集器的进行管理。
往往在我们考虑内存问题的时候,我们可能会有以下问题:
垃圾怎么回收
垃圾什么时候回收
什么样的内存需要被回收
在jvm的数据区域中,我们知道程序计数器和本地方法栈、虚拟机栈都是随着线程的创建而产生的,是为每一个线程所私有的。在每一个栈的栈帧随着方法的进入和结束进行的进栈和出栈的操作,内存也随着类信息的确定而被确定下来,在这一部分随着线程和方法的结束而结束。GC就管理我们的方法区和堆的内存。这一部分动态创建和回收。是我们所关注的内容。
垃圾回收的重要一环就是判断这个对象是不是还“存活”?我们可以有以下的方式可以判断
一、引数计数法
基本思路是:给每一个对象分配一个计数器,每次对象被引用时,计数器都加一,引用生效时,计数器减一,当计数器为零的时候,认定当前对象已经“死亡”。
二、可达性分析法
创建一个GC Roots 指针,每次对象被引用时这个根指针就可以指向这个对象,最终以树的形式进行排列,在这个指针下的对象可以通过根指针到达该对象,有一些是不可达的,如object 5、object 6、object 7,虽然它们相互之间有所联系,但是已经不可用了。可以判定该部分的对象已经“死亡”。