JVM学习到这里,终于到学习最兴奋的地方了---垃圾回收,在学习它以前还得对JVM垃圾回收相关理论知识进行了解,而后再经过实践来加深对理论的理解,下面直接开始了解相关的理论:html
JVM运行时内存数据区域:java
这个在以前其实已经介绍过了,对于JVM的垃圾回收必定是回收内存里面的内容,因此若是不对内存区域的划分,区域存放的内容有所了解,那何谈垃圾回收呢?因此看一下下图对内存区域的划分描述:web
其这以上区域在上一次【http://www.javashuo.com/article/p-xzdzxdar-do.html】都已经讲过了,下面再来总体回顾一下。算法
方法区域:框架
其中它是数据是线程共享的:学习
那所谓方法区域是线程共享的是指的啥意思呢?好比说一个类的class元信息就会映射到方法区域当中,那么这个元信息会被全部的线程所访问,由于只有一份,因此该区域是线程共享的。spa
下面再来阐述一下它:线程
Java虚拟机栈(JVM Stack):3d
下面再对其进行一些阐述:代理
本地方法栈:
堆:
它里面的数据也是线程共享的:
下面再来阐述一下它:
程序计数器:
JVM运行时数据区域例子:
对于这样一个方法代码:
以上方法在执行以后在内存中发生的变化以下:
JVM垃圾回收(GC)模型:
垃圾判断算法:
JVM中存在A、B两个对象,而A、B是相互引用着的,也就是A里面持有B的引用,而B里面又持有A的引用,以下:
而开始这两对象是被其它地方所引用着的,好比方法栈中,以下:
而以后虚拟机栈的这两个引用消失了,也就是整个虚拟机中就只有这两个相互引用的对象了,而这两对象不被任何对象所引用着了:
而根据引用计数器的定义规则,A和B的引用计数器都是1,可是实际这俩都是孤立的对象,因此若是采用引用计数来进行垃圾回收,则这俩对象永远不会被回收。
方法区:
JVM常见GC算法:
具体每一个算法下次继续再来学习~~