java垃圾回收总结

java垃圾回收总结

ID:35318623

大小:399.00 KB

页数:10页

时间:2019-03-23

java垃圾回收总结_第1页
java垃圾回收总结_第2页
java垃圾回收总结_第3页
java垃圾回收总结_第4页
java垃圾回收总结_第5页
资源描述:

《java垃圾回收总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、java垃圾回收总结以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆。 java与C,c++有很大的不同就是java语言开发者不需要关注内存信息,不会显式的直接操作内存,而是通过jvm虚拟机来实现。java虚拟机运行的时候内存分配图如下图: jvm虚拟机栈:一个是线程独有的,每次启动一个线程,就创建一个jvm虚拟机栈,线程退出的时候就销毁。这里面主要保存线程本地变量名和局部变量值。本地方法栈:调用本地jni方法的时候而创建的。这里分配的jvm之外的内存空间。方法调用结

2、束之后销毁。pc寄存器:这个保存线程当前执行的字节码指令堆:主要保存创建的对象。方法区:保存class相关的信息。主要是class的一个内存结构信息常量池:方法区的一部分,主要保存class内存结构中常量值例如String值,publicstaticfinal类型的值 我们这里说的垃圾回收,主要是java虚拟机对堆内存区域的回收。 1首先的问题是:jvm如何知道那些对象需要回收?目前有两种算法·引用计数法每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对

3、象就标识可以回收这个可以用数据算法中的图形表示,对象A-对象B-对象C都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收。  但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。例如下图:对象A,对象B循环引用,没有其他的对象引用A和B,则A和B都不会被回收。 ·root搜索算法这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对

4、象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。如下图:对象D访问不到根对象,所以就会被回收以下对象会被认为是root对象:·被启动类(bootstrap加载器)加载的类和创建的对象·jvm运行时方法区类静态变量(static)引用的对象·jvm运行时方法去常量池引用的对象·jvm当前运行线程中的虚拟机栈变量表引用的对象·本地方法栈中(jni)引用的对象由于这种算法即使存在互相引用的对象,但如果这两个对象无法访问到根对象,还是会被回收。如下图:对象C和对象D互相引用,但是由于无

5、法访问根,所以会被回收。jvm在确定是否回收的对象的时候采用的是root搜索算法来实现。在root搜索算法的里面,我们说的引用这里都指定的是强引用关系。所谓强引用关系,就是通过用new方式创建的对象,并且显示关联的对象?1Objectobj=new Object();以上就是代表的是强引用关系,变量obj强引用了Object的一个对象。java里面有四种应用关系,从强到弱分别为:StrongReference(强引用)–>WeakReference(弱引用)->SoftReference(软引用)–>PhantomRefer

6、ence(引用) StrongReference:只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收WeakReference:即使在root算法中其引用的对象root可达到,但是如果jvm堆内存不够的时候,还是会被回收。SoftReference:无论其引用的对象是否root可达,在响应内存需要时,由垃圾回收判断是否需要回收。PhantomReference:在回收器确定其指示对象可另外回收之后,被加入垃圾回收队列. 下面可以看一个测试?123456789101112131415161718192

7、0212223242526272829public class ReferenceTest{     public static final Mapmap=new HashMap();     public static void main(String[]args){        for (int i=0;i<1000;i++){            map.put(i,new WeakReference(new ReferenceObject

8、(i)));        }         int i=0;        for (Referencer:map.values()){            if (r.get()==null){                i++;            }        }  

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。