1 / 10
文档名称:

java 垃圾回收总结.doc

格式:doc   大小:394KB   页数:10页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

java 垃圾回收总结.doc

上传人:allap 2016/10/9 文件大小:394 KB

下载得到文件列表

java 垃圾回收总结.doc

相关文档

文档介绍

文档介绍:.java垃圾回收总结以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆。java与C,c++有很大的不同就是java语言开发者不需要关注内存信息,不会显式的直接操作内存,而是通过jvm虚拟机来实现。java虚拟机运行的时候内存分配图如下图:jvm虚拟机栈:一个是线程独有的,每次启动一个线程,就创建一个jvm虚拟机栈,线程退出的时候就销毁。这里面主要保存线程本地变量名和局部变量值。本地方法栈:调用本地jni方法的时候而创建的。这里分配的jvm之外的内存空间。方法调用结束之后销毁。pc寄存器:这个保存线程当前执行的字节码指令堆:主要保存创建的对象。方法区:保存class相关的信息。主要是class的一个内存结构信息常量池:方法区的一部分,主要保存class内存结构中常量值例如String值,publicstaticfinal类型的值我们这里说的垃圾回收,主要是java虚拟机对堆内存区域的回收。.1首先的问题是:jvm如何知道那些对象需要回收?目前有两种算法?引用计数法每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收这个可以用数据算法中的图形表示,对象A-对象B-对象C都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收。但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。例如下图:对象A,对象B循环引用,没有其他的对象引用A和B,则A和B都不会被回收。?root搜索算法这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。如下图:对象D访问不到根对象,:?被启动类(bootstrap加载器)加载的类和创建的对象?jvm运行时方法区类静态变量(static)引用的对象?jvm运行时方法去常量池引用的对象?jvm当前运行线程中的虚拟机栈变量表引用的对象?本地方法栈中(jni)引用的对象由于这种算法即使存在互相引用的对象,但如果这两个对象无法访问到根对象,还是会被回收。如下图:对象C和对象D互相引用,但是由于无法访问根,所以会被回收。jvm在确定是否回收的对象的时候采用的是root搜索算法来实现。在root搜索算法的里面,我们说的引用这里都指定的是强引用关系。所谓强引用关系,就是通过用new方式创建的对象,并且显示关联的对象?1Objectobj=newObject();以上就是代表的是强引用关系,变量obj强引用了Object的一个对象。java里面有四种应用关系,从强到弱分别为:StrongReference(强引用)–>WeakReference(弱引用)->SoftReference(软引用)–>PhantomReference(引用).StrongReference:只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收WeakReference:即使在