028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

java中堆和垃圾回收机制的介绍

这篇文章将为大家详细讲解有关java中堆和垃圾回收机制的介绍,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

创新互联公司是专业的都安网站建设公司,都安接单;提供成都做网站、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行都安网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

堆通常是一个可以被看做一棵树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆是非线性数据结构,相当于一维数组,有两个直接后继。

堆又叫做 “GC堆,"由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,比例是1:2;再细致一点新生代内部又划分为Eden区、Survivor区,比例为8:1。

下图显示了堆的结构:

java中堆和垃圾回收机制的介绍

对象在堆中内存的分配是有严格规定的,策略为:

新生代 GC指Minor GC,在新生代的进行垃圾回收,频繁且快。 老年代 GC(Major GC/Full GC)在老年代进行垃圾回收,通常伴随着至少一次的minor gc。速度慢。Full GC在如下几种情况下都会被触发:

  1. 老年代空间不足;

  2. 方法区空间不足;

  3. 调用System.gc(),建议JVM进行full gc;

  4. 长期存活的对象转入老年代,空间不足;

  5. 没有足够的连续空间分配给大对象;

  6. 新生代垃圾回收存活的对象太多,S1放不下,老年代担保空间不足,担保空间指的是老年代最大可用的连续空间是否大于新生代所有对象总空间。

堆里面几乎放了所有的对象,那我们怎么知道这些对象是否还有用呢?JVM提供了两种方法来判定:

上面提到了引用,对象的存活都和引用有关,引用类型又分为强引用,软引用,弱引用,虚引用。

实际上可达性分析法判定的不可达对象不会马上回收,对象真正被回收需要经过两次标记。第一次标记就是被判定为不可达对象,然后进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。如果没有重写finalize()方法或者finalize()方法已经被虚拟机调用过,finalize()方法只会被系统调用一次。这两种情况都是”没有必要执行的“。如果有必要,这个对象会被放在F-Quene队列中,由虚拟机自动建立的低优先级的Finalizer线程去执行finalize()方法。这期间GC会对F-Quene中的对象进行第二次小规模标记,如果对象依然没有被引用,那就会被回收,没有被筛选的对象不一定被回收。

我们已经知道对象什么时候被回收了,那如何回收呢?介绍四种最常用的垃圾回收算法:

垃圾收集算法是一种内存回收的思想,具体的实现是垃圾收集器。简要介绍下常用的垃圾收集器:

关于java中堆和垃圾回收机制的介绍就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前题目:java中堆和垃圾回收机制的介绍
网址分享:http://www.tsicrk.com/article/piedsi.html

其他资讯

让你的专属顾问为你服务

2.4042s