JVM--Garbage Collection

2018-11-15  本文已影响0人  DiDu小梁

垃圾回收(GC)一直是java语言的重中之重。

1 对象状态鉴别

1.1 标记对象是否可回收一般有两种算法:

1.2 引用

在JDK1.2以前,java中应用的定义很狭义:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用;在JDK1.2之后,java对引用的概念进行了扩充分为如下四类:

1.3 两次确认(不推荐使用finalize()方法)

在可达性分析中不可达的对象也不是一定被回收,一个对象被宣判死刑,至少要经历两次标记过程:如果对象在进行可达性分析时发现没有与GC Roots相连,它将会被将第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者finalize()方法已经被虚拟机调用过,将视为“没必要执行”,立即回收。

当这个对象被判定有必要执行finalize()方法时,这个对象将会放置在F-Queue队列中,并在稍后由一个由虚拟机自动建立的、低优先级的Finalizer线程触发对象的finalize()方法,但不承诺保证方法运行结束。finalize()方法是对象逃脱死亡的最后一次机会,稍后GC将对F-Queuezhongde对象进行第二次小规模标记,只要重新与GC Roots引用链上的任何一个对象建立关联即可完成救赎,否则将被回收。

值得注意的是,任何一个对象的finalize()方法只会被系统自动调用一次,此外finalize()方法并不推荐使用,而是应该更多的使用try-finally等其他方式。

1.4 方法区回收

大多数人可能认为方法区(HotSpot虚拟机中的永久代)是没有垃圾收集的,其不然。永久代的垃圾回收只要收集“废弃常量”和“无用的类”两部分。

2 垃圾收集算法

image

3 内存分配与回收策略

java技术体系中所提倡的自动内存管理最终可归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配往大方向讲就是在堆上分配,主要是在新生代的Eden区,如果启动了本地线程分配缓冲,将按线程优先在TLBA上分配。内存分配具有几条普遍的分配规则:

Minor GC 和 Full GC 区别

4 HotSpot的GC算法实现

5 收集器简介

image
上一篇 下一篇

猜你喜欢

热点阅读