引用计数算法:
判定一个对象是否还存活,一个比较简单的算法就是引用计数算法。比较著名案例就是微软的COM技术、使用ActionScript 3的FlashPlayer、Python语言以及游戏脚本中的Squirrel都利用这个算法进行内存管理。但是Java中并没有使用这项技术,主要原因是循环引用问题。
根搜索算法:
在主流的商用程序语言中,包括Java、C#、Lisp等都使用的是根搜索算法 GC Root Tracing判定对象是否存活。任何对象到GC Roots的路径不可达的时候就认定需要回收了,而不管它们之间的循环引用。
在Java中,可作为GC Roots的对象包括下面几种:
* 虚拟机栈(栈帧中的本地变量表)中的引用的对象
* 方法区中的static属性引用的对象
* 方法区中final引用的对象
本地方法栈中JNI的引用的对象
Java的引用分为四种,从强到弱依次为:
* 强引用 Strong Reference:
强引用是程序代码中普遍存在的,类似 Object ojb = new Object()的引用,只要强引用存在,垃圾收集器永远都不会回收掉被引用的对象。
* 软引用 Soft Reference:
软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收,如果这次回收还是没有足够的内存,才会抛出内存溢出异常。提供了SoftReference类来实现软引用。
* 弱引用 Weak Reference:
弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。提供了WeakReference类来实现弱引用。
* 虚引用 Phantom Reference
虚引用也称为幽灵引用或者幻引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是希望这个对象被GC回收时收到一个系统通知。提供PhantomReference类实现虚引用。
对象有一个finalize()方法,是对象逃脱死亡命运的最后一次机会,如果对象在finalize将自己赋给任何一个引用链里面的对象相关联,那么又活了。哈哈。 但是所有对象的这个方法只能被系统调用一次,也就是只有一次机会去拯救自己。这个方法最好别用,谢谢。
内存回收算法:
1,标记-清除 算法 Mark-Sweep
最基本的算法,效率很低
2,复制算法
将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。回收时,将Eden和Survivor中还存活的对象一次性copy到另一个Survivor空间,然后清理掉Eden和刚用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor比例是8:1. 不够的时候会有分配担保来保证。
3,标记-整理 算法:
跟标记-清除算法类似,只是标记后先让所有存活对象前面移动,然后一次性清理最后的区域。
4,分代收集算法
当代商业虚拟机的垃圾收集都采用分代收集 Generational Collection算法。
新生代中采用复制算法,因为这里面对象更新换代很快。
老年代采用标记-整理 算法。
新生代的Minor GC示例:
/** * VM参数: -verbose:gc -Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8 -XX:+PrintGCDetails * @author Administrator * */ public class MinorGC { private static final int _1MB = 1024 * 1024; public static void main(String[] args) { byte[] a1, a2, a3, a4; a1 = new byte[2 * _1MB]; a2 = new byte[2 * _1MB]; a3 = new byte[2 * _1MB]; a4 = new byte[4 * _1MB]; // 出现一次Minor GC } }
本人博客已搬家,新地址为:http://www.pycoding.com/
相关推荐
JVM垃圾回收器和内存分配策略
深入理解JVM垃圾收集算法与垃圾收集器
JVM垃圾回收器和内存分配策略
JVM初探- 内存分配、GC原理与垃圾收集器,从从提上讲解了jvm中GC的原理、基本的算法和针对不同内存区使用的算法,同时,详细的讲解了当前主要使用的垃圾收集器
第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...
主要是JVM内存分配及简单的JVM性能调优
JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old...
内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、...
个人整理 jvm相关知识 包括内存分配机制 垃圾回收机制 垃圾收集器相关 及 垃圾收集算法
本文介绍了分代垃圾收集是结合了JVM 1.2及以后版本使用技术的长处,使结果对象分配开销非常小。并简单概述了老对象和年轻对象、分代收集、小的收集、代间引用、跟踪代间引用、卡片标记、JDK 1.4.1 默认收集器、并行...
JVM初探内存分配GC原理与垃圾收集器共16页.pdf.zip
JVM内存模型以及垃圾收集策略解析 可以深入了解java虚拟机的原理
1. JVM调优 1.1 JVM调优总结(一)-一些概念 1.2 JVM调优总结(二)-一些概念 1.3 JVM调优总结(三)-基本垃圾回收算法 1.4 JVM调优总结(四)-垃圾...4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM
一.java内存结构 2 二 垃圾收集算法: 3 三 JVM参数 4 四 JVM的垃圾回收集器 7 五 常用参数设置 7
包含7种JVM垃圾收集器 详细对比7种垃圾收集器优缺点 全面讲解JVM垃圾收集器
直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景。
包含了jvm的视频,jvm的笔记
对jvm内存模型&垃圾收集算法&类加载机制进行了整理,读者可以作为参考进行学习和探讨,,
JVM历史发展和内存回收笔记
JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...