这篇文章将为大家详细讲解有关java中堆和垃圾回收机制的介绍,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
堆通常是一个可以被看做一棵树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆是非线性数据结构,相当于一维数组,有两个直接后继。
堆又叫做 “GC堆,"由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,比例是1:2;再细致一点新生代内部又划分为Eden区、Survivor区,比例为8:1。
下图显示了堆的结构:
对象在堆中内存的分配是有严格规定的,策略为:
对象优先在新生代Eden区分配内存;
大对象直接进老年代,主要是长字符串和数组这些需要大量连续内存空间的对象;
长期存活的对象进入老年代。Eden区内存不够时,JVM发起一次MinorGC,对象的年龄加一,默认对象年龄到15时进入老年代;
动态年龄判定。相同年龄所有对象大小的总和大于 Survivor 空间的一半,大于等于该年龄的对象进入老年代
新生代 GC指Minor GC,在新生代的进行垃圾回收,频繁且快。 老年代 GC(Major GC/Full GC)在老年代进行垃圾回收,通常伴随着至少一次的minor gc。速度慢。Full GC在如下几种情况下都会被触发:
老年代空间不足;
方法区空间不足;
调用System.gc(),建议JVM进行full gc;
长期存活的对象转入老年代,空间不足;
没有足够的连续空间分配给大对象;
新生代垃圾回收存活的对象太多,S1放不下,老年代担保空间不足,担保空间指的是老年代最大可用的连续空间是否大于新生代所有对象总空间。
堆里面几乎放了所有的对象,那我们怎么知道这些对象是否还有用呢?JVM提供了两种方法来判定:
强引用,new出来的对象,垃圾回收器绝不会回收它;
软引用,在系统将要发生OMM前会回收这些对象的内存;
弱引用,垃圾收集器工作时只要发现,马上回收;
虚引用,形同虚设,任何时候都可能被回收。
我们已经知道对象什么时候被回收了,那如何回收呢?介绍四种最常用的垃圾回收算法:
垃圾收集算法是一种内存回收的思想,具体的实现是垃圾收集器。简要介绍下常用的垃圾收集器:
serial串行收集器。单线程,垃圾回收的时候,必须暂停其他工作。新生复制,老年标记整理。简单高效;
ParNew 收集器。serial的多线程版本;
Parallel Scavenge 收集器,复制算法的多线程收集器。注重吞吐量,cpu运行代码时间/cpu耗时总时间。新生复制,老年标记整理;
Serial Old 收集器,老年代版本;
Parallel Old 收集器,Parallel Scavenge老年代版本;
CMS 收集器,注重最短时间停顿。并发收集器,垃圾收集线程与用户线程(基本上)同时工作。 标记清除算法
关于java中堆和垃圾回收机制的介绍就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。