java垃圾回收算法和垃圾收集器
垃圾收集算法、垃圾回收算法、java垃圾收集器
目录
1. 垃圾收集算法
1)引用计数法
2)根搜索法
2. 垃圾回收算法
1)复制算法
2)标记-清除算法
3)标记-整理算法
4)分代收集算法
3. java垃圾收集器
新生代GC器:
1)Serial垃圾收集器
2)ParNew垃圾收集器
3)Parallel Scavenge垃圾收集器
老年代GC器
1)Serial和Parallel Scavenge都有对应的老年代版本
2)CMS垃圾收集器
G1回收器
4.java对象的内存分配位置
5.java TLAB
6.java 何时触发GC
1) new gen对象什么时候会晋升到old gen中?
2) 什么时候会出现old gen空间不足(old gen空间不足时,会触发full gc)?
1. 垃圾收集算法
1)引用计数法
给对象添加引用计数器,当引用对象时计数器+1,引用失效时,计数器-1,当计数器等于0时,对象失效,内存可以被回收。
优点:实现简单高效。
缺点:对象之间的互相循环引用问题不好解决。
2)根搜索法
通过GC roots可达的对象路径称为引用链(reference chain),当一个对象没有引用链时(即从GC roots不可达)则视为不可用对象,内存可以被回收。java使用该算法进行垃圾收集。
哪些对象可以视为GC roots ?
a. 虚拟机栈中(即栈帧中的本地变量)的引用对象;
b. 本地方法栈中的引用对象;
c. 方法区(永久代)中的静态变量引用的对象和常量池中引用的对象
2. 垃圾回收算法
1)复制算法
将内存分为(大小相等)两部分,每次只使用其中一块进行内存分配,当内存使用完后,就出发GC,将存活的对象直接复制到另一块空闲的内存中,然后对当前使用的内存块一次性清除所有,然后转到另一块内存进行使用。
优点:简单,高效。
缺点:浪费内存,因为每次都有另一块内存空闲着。
2)标记-清除算法
分两步进行,第一步标记出可以回收的对象,第二步统一清理可以回收的对象内存。
缺点:首先标记和清除步骤效率都不高,其次会产生内存碎片。
3)标记-整理算法
类似于标记-清除算法,但是第二步进行内存回收时,将存活的对象向内存一端移动,达到消除内存碎片问题。
4)分代收集算法
java sun hotspot虚拟机将内存分为新生代(堆)、老年代(堆)、永久代(方法区、常量池、即时编译代码)几个区域,新生代主要使用基于复制算法的垃圾回收,老年代和永久代主要使用标记-整理算法进行垃圾回收。具体每个区域使用哪种垃圾回收算法还要视收集器的实现制约。


3. java垃圾收集器
新生代GC器:
1)Serial垃圾收集器:
单线程串行垃圾收集器,使用复制算法进行垃圾回收,GC时需要暂停所有用户线程,直到GC完成。
注:此处的串行垃圾收集器中的串行意义是指GC过程和用户线程执行过程是串行的,即GC过程中用户线程暂停,用户线程执行是,GC是不执行的。
2)ParNew垃圾收集器:
多线程串行垃圾收集器,Serial的多线程版本,其它特性同Serial。
3)Parallel Scavenge垃圾收集器:
类似于ParNew,但是该收集器关注的是cpu的吞吐量(throughput=user-cpu-time/total-cpu),通过参数-XX:GCTimeRation和-XX:MaxGCPauseMillis来控制吞吐量,是吞吐量优先的收集器,同样使用复制算法进行垃圾回收,GC过程需要暂停所有用户线程。
老年代GC器:
1)Serial和Parallel Scavenge都有对应的老年代版本:
Serial Old和Parallel Old垃圾收集器,它们与新生代的区别在于老年代区域的版本,采用标记-整理算法进行垃圾回收。
2)CMS垃圾收集器:
Concurrent Mark Sweep收集器,是真正意义上的多线程并行垃圾收集器,CMS在GC过程中的某些阶段用户线程是可以运行的,因此说它是真正意义上的并行垃圾收集器,前面介绍的垃圾收集器在GC过程中都要暂停用户线程,因此,视它们为与用户线程串行执行的垃圾收集器。CMS GC过程分四步完成:
a.初始标记:只是标记一下GC Roots能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。
b.并发标记:进行GC Roots跟踪的过程,和用户线程一起工作,不需要暂停工作线程。
c.重新标记:为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。
d.并发清除:清除GC Roots不可达对象,和用户线程一起工作,不需要暂停工作线程。
**G1回收器:
参考:http://www.importnew.com/15311.html
4. java对象的内存分配位置
1) 编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配。如果是在堆上分配,则进入选项2.
2) 如果tlab_top + size <= tlab_end,则在在TLAB上直接分配对象并增加tlab_top 的值,如果现有的TLAB不足以存放当前对象则3.
3) 重新申请一个TLAB,并再次尝试存放当前对象。如果放不下,则4.
4) 在Eden区加锁(这个区是多线程共享的),如果eden_top + size <= eden_end则将对象存放在Eden区,增加eden_top 的值,如果Eden区不足以存放,则5.
执行一次Young GC(minor collection)。
5) 经过Young GC之后,如果Eden区任然不足以存放当前对象,则直接分配到老年代。
5. java TLAB
JVM在内存新生代Eden Space中开辟了一小块线程私有的区域,称作TLAB(Thread-local allocation buffer)。默认设定为占用Eden Space的1%。在Java程序中很多对象都是小对象且用过即丢,它们不存在线程共享也适合被快速GC,所以对于小对象通常JVM会优先分配在TLAB上,并且TLAB上的分配由于是线程私有所以没有锁开销。因此在实践中分配多个小对象的效率通常比分配一个大对象的效率要高。
也就是说,Java中每个线程都会有自己的缓冲区称作TLAB(Thread-local allocation buffer),每个TLAB都只有一个线程可以操作,TLAB结合bump-the-pointer技术可以实现快速的对象分配,而不需要任何的锁进行同步,也就是说,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。
关于对象分配的JDK源码可以参见JVM 之 Java对象创建[初始化]中对OpenJDK源码的分析。
6. java 何时触发GC
eden或old gen空间不足时会发出minor gc或full gc。
1) new gen对象什么时候会晋升到old gen中?
1. 多次minor gc后依然存活的对象,在存活年龄超过MaxTenuringThreshold阈值时会晋升到old gen中。
2. 在创建大对象/数组时,如果设置了PretenureSizeThreshold,超过大小的对象会直接在old gen中分配内存。
2) 什么时候会出现old gen空间不足(old gen空间不足时,会触发full gc)?
1. 创建大对象,大数组时,如果设置了PretenureSizeThreshold,超过阈值会直接在old gen中分配内存,此时可能会出现old gen内存不足。
2. minor gc完成后,可能会有对象满足了MaxTenuringThreshold设置的晋升年龄,需要晋升到old gen,此时可能会出现old gen内存不足。
3. 如果设置了新生代收集担保机制即HandlePromotionFailure关闭,则会在old gen中预留edu+survivor大小的空间作为担保,如果minor gc时,
old gen无法提供足够内存进行担保,会出现old gen内存不足。
4. 调用System.gc()时,会建议jvm进行full gc,但是并不保证一定会进行,大多数情况会执行full gc。因此,要慎用System.gc(),因为full gc
比较耗时,增加full gc次数会严重影响程序执行效率。-XX:+DisableExplicitGC可以关闭System.gc()调用。
5. perm gen内存不足时,也会出发full gc。
参考:
垃圾收集算法和垃圾回收算法:
http://www.2cto.com/kf/201401/272681.html
java垃圾收集器:
http://blog.csdn.net/chjttony/article/details/7883748 (推荐)
http://www.cnblogs.com/wrencai/articles/4232264.html
内存模型:
http://www.cnblogs.com/wrencai/articles/4232264.html
java对象都是分配在堆上吗:
http://blog.hesey.net/2011/07/object-allocation-on-non-heap.html
java逃逸分析和对象内存分配,TLAB:
http://blog.csdn.net/yangzl2008/article/details/43202969
java虚拟机参数:
http://java.9sssd.com/jvm/art/432
http://www.tuicool.com/articles/RNjUfa
java垃圾回收算法和垃圾收集器的更多相关文章
- 3-JVM垃圾回收算法和垃圾收集器
垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就- ...
- Java虚拟机四:垃圾回收算法与垃圾收集器
在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内 ...
- JVM垃圾回收算法 及 垃圾收集器
摘自<深入理解Java虚拟机> 一.什么是: GC算法是 方法论,那么垃圾收集器就是具体的 实现. 二.四种 垃圾回收算法 1.标记-清除算法:最基础的收集算法:不足有两点:1标记和清除两 ...
- 6.GC垃圾回收算法和垃圾收集器的关系
JAVAGC垃圾回收机制和常见垃圾回收算法 推荐博客:JVM垃圾回收机制和常见垃圾回收算法 JVM的内存结构.垃圾回收算法
- 《深入理解java虚拟机》笔记(5)垃圾回收算法及垃圾收集器
一.标记-清除算法 算法:分为标记和清除两个阶段,首先标记出所有需要回收的对象,再对标记对象进行回收. 不足之处:效率不高,会产生大量不连续内存碎片,导致下次分配较大内存时,若内存不足不得不触发垃圾回 ...
- Java垃圾回收之新生代垃圾收集器
问题:什么是Stop-the-World? 1.JVM由于要执行GC而停止了应用程序的执行 2.任何一种GC算法中都会发生 3.多数GC优化通过减少Stop-the-world发生的时间来提高程序的性 ...
- JVM(十),垃圾回收之新生代垃圾收集器
十.垃圾回收之新生代垃圾收集器 1.JVM的运行模式 2.Serial收集器(复制算法-单线程-Client模式) 2.ParNew收集器(复制算法-多线程-Client模式) 3.Parallel ...
- jvm(5)---垃圾回收(回收算法和垃圾收集器)
1.垃圾回收算法 1.1 标记-清除算法 算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.它是最基础的收集算法,效率也很高,但是会带来两个明显的问题 ...
- Java垃圾回收算法和垃圾回收器
基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记- ...
随机推荐
- [置顶] 原创鼠标拖动实现DIV排序
先上效果图: 对比传统的排序,这是一个很不错的尝试,希望对大家有启发. 大家可以参考我的上一篇博文:http://blog.csdn.net/littlebo01/article/details/12 ...
- OpenCV中的矩阵和图像类型
任务刚刚做完,就迫不及待的来写写在OpenCV中常见的几类数据类型: 在使用OpenCV时我们时常会碰到IplImage这个数据类型,IplImage就是我们通常说的“图像”进行编码的基本结构,这些图 ...
- 如何为iTunes Connect准备应用
原地址:http://blog.sina.com.cn/s/blog_947c4a9f0101dded.html 如果你已经成功注册了iOS开发者,那么现在就可以登陆iTunes Connect来管理 ...
- error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037
问题原因:端口5037被占用 解决方案: 方式一:可以用cmd命令 C:\Users\Administrator>netstat -ano | findstr "5037" ...
- 【java设计模式】之 单例(Singleton)模式
1. 单例模式的定义 单例模式(Singleton Pattern)是一个比較简单的模式.其原始定义例如以下:Ensure a class has only one instance, and pro ...
- 参数数组(params)的用法
使用参数数组的注意事项: 1. 只能在一维数组上使用params关键字. 2. 不能重载一个只基于params关键字的方法.params关键字不构成方法的签名的一部分. 如: //编译时错误:重复访问 ...
- Sublime Text快捷键去除空白行 - 转载请保留原文链接:https://www.noniu.com/qianduan/sublime-text-kongbaihang.html
如果使用notepad++或者Dreamweaver的朋友,应该知道有个快捷键或者功能按钮,可以实现删除文档空白行的功能.虽然空白行不会影响程序运行,但是会占一定的空间,对于有处女座特质的程序员来说, ...
- 转:SNMP 原理及配置简述
SNMP 原理及配置简述 转载 2016年01月13日 16:18:51 随着机器数量的增长,管理员不能像过去那样,一台台机器进行监控.解决问题,而需要借助各方工具进行统一监控和管理.利用SNMP,一 ...
- 发现一个nginx LUA开发Web App的框架
nginx是个好东西, nginx的openrtsy发行版本更是个好东西. 今天又发现个好东西 :Moochine MOOCHINE - 一个简单的轻量级的web framework, 基于ngx_O ...
- nyoj 742 子串和再续 类似 HDU 1024
子串和再续 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个序列 S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000 ...