java queue 使用 【学习笔记】Java虚拟机(四)垃圾收集与算法

电脑杂谈  发布时间:2018-02-17 15:00:36  来源:网络整理

java queue 使用_java queue原理_Java的queue怎么入队

1、判断对象是否可回收

① 引用计数算法(Reference Counting):给对象添加一个引用计数器,每当有地方引用它

时,计数器加1,引用失效时减1,当计数器为0时该对象就是不可再被使用的。优点是实现简

单,判定效率高,缺点是很难解决循环引用的问题。

② 可达性分析算法(Reachability Analysis)是通过一系列称为“GC Roots”的对象作为起始

点向下搜索,搜索走过的路径称为引用链(Reference Chain),当对象到GC Roots没有任

何引用链相连时就证明对象不可用了。在Java语言中可作为GC Roots的对象包括:

● 虚拟机栈(栈帧中的本地变量表)中引用的对象

● 方法区中类静态属性引用的对象

● 方法区中常量引用的对象

● 本地方法栈中JNI(Native方法)引用的对象

2、引用

如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称为这块内存代表着一

个引用。在JDK1.2后,引用的概念扩充为4种,由强到弱分别为:

① 强引用:类似“Object obj = new Object()”这样的引用,永远不会被回收的引用。

② 软引用(SoftReference):在系统将要内存溢出之前,会讲软引用对象进行二次回收,如

果仍然没有足够的内存则抛出异常。

③ 弱引用(WeakReference):无论内存是否够用,在下一次垃圾收集时弱引用都将被回收。

④ 虚引用(PhantomReference):虚引用无法获得一个对象的实例,使用它的目的是在垃圾

回收时收到一个系统通知。

3、回收

如果对象在可达性分析中没有发现与GC Roots相连接的引用链,那么它会被第一次标记并进行一次

筛选,筛选的条件是它是否有必要执行finalize()方法:如果对象没有复写finalize()方法或者该

对象的finalize()方法已经被虚拟机执行过,则筛选失败。

如果筛选成功,那么该对象会被放置在F-Queue队列中,稍后虚拟机会自动建立一个低优先级的

Finalizer线程去触发该对象的finalize()方法,但不承诺会等待它运行结束,避免阻塞队列。然后虚

拟机会对F-Queue中的对象进行第二次标记,如果在第一次标记中finalize()方法将对象与任意一

个GC Roots连接上,那么它这次将被移除回收队列,保持存活,反之则被回收掉。

4、回收方法区

Java虚拟机规范中不强制要求虚拟机在方法区实现垃圾收集。回收主要分两部分:废弃常量和无用的

java queue 使用_java queue原理_Java的queue怎么入队

类。

① 废弃常量:当没有任何一个String叫做“abc”时,“abc”将被清理出常量池。常量池中的其

他类(接口)、方法、字段的符号引用也是同理。

② 无用的类:满足一下三点虚拟机会判定类为无用:

● 该类所有的实例都被回收。

● 加载该类的ClassLoader已经被回收。

● 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访

问该类的方法。java queue 使用

满足三点也不代表着一定会回收该类,是否进行回收HotSpot提供了-Xnoclassgc参数进行控制,还

可以使用-verbose:class以及-XX:+TraceClassLoading、-XX:+TraceClassUnLoading查看类

加载和卸载的信息。

在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGi这类频繁自定义

ClassLoader的场景中都需要虚拟机具备类卸载的功能,保证永久代不会溢出。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-82147-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...