JVM垃圾收集器基本思想
要做JVM内存垃圾回收首先要明确两个问题:
- 哪些内存需要回收
- 怎么回收
- 什么时候回收
1.哪些内存需要回收
jvm内存可以分为两类:
- 线程独占内存区域(程序计数器、虚拟机栈、本地方法栈)
- 线程共享区域(堆、方法区)
对于线程独占内存区域来说,他们的回收时机是非常确定的,在方法结束或线程结束的时候回收即可。
对于线程共享区域里的堆和方法区两个区域,都可以进行垃圾收集,但是方法区的收集效率远低于堆,因此java虚拟机规范中不要求虚拟机必须实现方法区的垃圾收集。我们下文中所指的垃圾收集如无特殊说明,都是针对线程共享区域里的堆进行垃圾收集。
既然垃圾收集主要是针对堆进行的,而堆的作用就是存储对象。我们知道,虽然对象存储在堆里,但是如果要真正的使用对象,要通过对象的引用,因此,当一个对象没有引用指向它的时候,我们就可以回收它了。
1.1引用计数算法
给对象添加一个引用计数器,每次被引用就+1,每次有引用失效时,就-1。当对象的引用数量为0时代表对象不可再被使用。
问题:当有对象互相引用的时候,如果这两个互相引用的对象本身都已经不可能再被访问了,但是因为相互引用的关系,他们的引用计数都不是0,也无法被回收。
public class Ref {
public Object instance;
public static void main(String[] args) {
Ref a = new Ref();
Ref b = new Ref();
a.instance = b;
b.instance = a;
a = null;
b = null;
System.gc();// 此时垃圾回收无法回收a、b
}
}
1.2可达性分析算法
目前的主流实现。
基本思想是通过一系列称为"GC Roots"的对象作为起始点向下搜索,搜索走过的路径称为引用链,没有引用链到达的对象视为不可再被使用。
可视为“GC Roots”的对象包括:
- 虚拟机栈中的引用对象
- 本地方法栈中的引用对象
- 方法区中静态属性引用对象、常量引用对象
2.如何回收
垃圾收集算法有以下这些:
标记-清除算法
算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收。因为被“清除”的对象的内存空间是不连续的,因此清除后会产生大量不连续的内存碎片,内存碎片过多会导致需要分配大对象时找不到连续内存从而触发另一次垃圾回收。
复制算法
将内存划分为容量相等的两块,每次只使用一块,当进行垃圾回收的时候,只将存活的对象复制到另一块内存上,然后将之前的一块内存直接清除。缺点是浪费内存。
现代的商业虚拟机都是使用复制算法来回收新生代的,因为新生代中的对象98%都是朝生夕死,因此不需要按照1:1来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还活着的对象一次性复制到另一块Survivor上,最后清理掉Eden和刚才用过的Survivor空间。
标记-整理算法
和标记-清除算法类似,标记阶段是一样的,只是后续不直接清除可回收对象,而是让所有存活的对象向一端移动,然后清除掉端边界以外的内存。
分代收集算法
这个算法并没有什么新的思想,只是根据对象存活周期将内存划分为几块,每块根据存活周期选择最合适的算法。一般是分为新生代和老年代。新生代每次垃圾收集都只有少量对象存活,可以选择复制算法;老年代因为对象存活率高,没有额外空间对它进行分配担保,因此可以选择“标记-清理”或“标记-整理”算法。
3.什么时候回收
GC有三种:
- Minor GC:对年轻代(包括Eden和Survivor区域)回收内存叫做Minor GC。
- Major GC:对老年代回收内存称为Major GC。Major GC速度一般比Minor GC慢10倍以上。
- Full GC:对整个堆进行内存回收,在最近几个版本的JDK里默认包括了对永久代即方法区的回收(JDK8中无永久代了)。
Minor GC触发时机:
当Eden区满时,触发Minor GC。
Full GC触发时机:
- 调用System.gc()时,系统建议执行Full GC,但是不必然执行。
- 老年代空间不足
- 永久代(方法区)空间不足
- 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
- 当Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
JVM垃圾收集器基本思想的更多相关文章
- JVM调优:HotSpot JVM垃圾收集器
HotSpot JVM垃圾收集器 - Snooper - 博客园https://www.cnblogs.com/snooper/p/8718478.html
- JVM垃圾收集器-Parallel Scavenge收集器
今天我给大家讲讲JVM垃圾收集器-Parallel Scavenge收集器 Parallel Scavenge收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的 ...
- 7种JVM垃圾收集器特点,优劣势、及使用场景
今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 一.常见的垃圾收集器有3类 1.新生代的收集器包括 Serial PraNew Pa ...
- 【006】【JVM——垃圾收集器总结】
Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...
- 第五章 JVM垃圾收集器(1)
说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...
- 第六章 JVM垃圾收集器(2)
上一章记录了几种常见的垃圾收集器,见<第五章 JVM垃圾收集器(1)> 1.G1 说明: 从上图来看,G1与CMS相比,仅在最后的"筛选回收"部分不同(CMS是并发清除 ...
- JVM垃圾收集器(1)
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...
- 5种JVM垃圾收集器特点和8种JVM内存溢出原因
先来看看5种JVM垃圾收集器特点 一.常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial O ...
- 7种 JVM 垃圾收集器特点、优劣势及使用场景(多图)
7种 JVM 垃圾收集器特点.优劣势及使用场景(多图) mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达! 一.常见垃 ...
随机推荐
- 统计在从1到n的正整数中1出现的次数
问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数. 例如:N= 2,写下1,2.这样只出现了1个“1”. N= 12,我们会写下1, 2, 3, 4, ...
- 在virtualbox(win7)下使用USB摄像头
解决方法: 去https://www.virtualbox.org/wiki/Downloads下载VirtualBox 4.3.8 Oracle VM VirtualBox Extension Pa ...
- LoadRunner测试结果分析03 转载至zhangzhe的新浪博客
LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...
- django--app(六)
1.应用加载 服务启动后,再新添加应用,是不会自动加载的,需要重启服务.
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...
- CSS 宝典
input点击时候,有个灰块 outline:medium; -webkit-tap-highlight-color:rgba(0,0,0,0); -webkit-user-modify:read-w ...
- Div添加阴影效果
-moz-box-shadow: 2px 2px 10px #909090;/*firefox*/ -webkit-box-shadow: 2px 2px 10px #909090;/*safari或 ...
- vs2013密钥
Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...
- java 平台 权限管理
最近在做公司内部的物流业务平台的权限管理,感触颇多.记录一下 权限管理分两部分:数据权限和操作权限. 数据权限: 这个是和用户相关的. 因为平台是多机构的,所以再考虑数据权限的时候,是按照机构来管理的 ...
- Caffe应用篇----文件格式转换
网友文章: 我们手中有的一般都是图片数据,jpg.bmp格式等,但caffe常使用的数据是db格式(leveldb/lmdb),因此首先我们要将自己数据转换成caffe可运行的格式文件.别捉鸡,caf ...