【JVM】垃圾收集器
程序计数器、Java虚拟机栈、本地方法栈分配的内存是确定的,生命周期与线程同样。所以不须要过多考虑回收问题。
而Java堆和方法区仅仅有运行时才知道有哪些对象被创建,须要多少内存,这部分的内存分配和回收是动态的。
1. 检測垃圾内存的方法
1) 引用计数器
给对象加入引用计数器,有地方引用时+1,引用失效时-1。不论什么时刻计数器为0的对象就是不可能在被使用的。可是!
不能解决对象间互相引用的问题,所以主流虚拟机不用这种方法。
2) 可达性分析算法
通过一系列称为“GCRoots”的对象作为起始点,開始向下搜索,走过的路径称为引用链,当一个对象到GCRoots没有不论什么引用链相连时,则该对象不可用。
可作为GCRoots的对象包含:
- 虚拟机栈中引用的对象
- 方法区中类静态属性应用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI引用的对象
2. 对象死亡过程
至少要经历两次标记过程:
- 可达性分析后不可达的对象被第一次标记而且进行一次筛选,筛选条件是对象是否有必要运行finalize()方法。当对象没有覆盖finalize()方法或者已经调用过,则没有必要运行。对象会被放进“即将回收”集合;有必要运行的对象会被放在一个叫F-Queue的队列中,会由自己主动建立的低优先级的Finalizer线程去触发,但不保证能运行结束。
- 在finalize()方法中对象将自己与引用链上的不论什么一个对象关联起来,则GC在F-Queue中进行第二次小规模标记时,这些对象会被移出回收集合。所以运行finalize()的对象不一定会被回收。
不论什么对象的finalize()方法仅仅能被调用一次,所以第一次逃脱后第二次将无法逃脱。
3. 回收方法区
主要回收废弃常量和没用的类。
- 废弃常量:没有其它地方被引用到的常量。
- 没用的类:满足3个条件即能够回收而并不一定:
- 该类的全部实例都被回收
- 载入该类的ClassLoader已经被回收
- 该类相应的Class对象没有在不论什么地方被引用
4. 垃圾收集算法
1) “标记-清除”算法:
不足:
- 效率问题。标记和清除过程的效率都不高。
- 空间问题。产生大量不连续的碎片,导致载入较大对象时要提前出发下一次垃圾收集过程。
2) 复制算法
将内存分为相等大小的两块。每次仅仅使用当中一块。当一块用完时将活着的对象拷贝到还有一块上面。然后一次清除使用过的那块内存。
长处:仅仅要移动堆顶指针。按顺序分配内存就可以。实现简单。运行高效。
缺点:内存缩小为原来的一半。在对象存活率高的时候不适用,适合新生代。
IBM策略:採用一个较大的Eden空间(80%)和两个较小的Survivor空间(10%),每次使用Eden和一个Survivor。
3) “标记-整理”算法:
适用于老年代,标记后让全部存活的对象都向一端移动。然后直接清理掉端边界以外的内存。
4) 分代收集算法:
将Java堆分为新生代和老年代。依据各个年代的特点採用最适合的收集算法。
5. 内存分配与回收策略
- 对象优先在新生代的Eden分配
- 大对象直接进入老年代(非常长的字符串、数组….)
- 长期存活的对象进入老年代。每一个对象都有一个年龄计数器。在Eden中出生并经历第一次GC,存活后能被Survivor容纳,则年龄置为1,每在Survivor中熬过一次GC,年龄+1。年龄增大到一定程度(默认15)则会被晋升到老年代。
【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牧场",选择"设为星标"技术干货每日送达! 一.常见垃 ...
- JVM垃圾收集器
JVM中垃圾的回收由垃圾收集器进行,随着JDK的不断升级,垃圾收集器也开发出了各种版本,垃圾收集器不断优化的动力,就是为了实现更短的停顿. 下面是7种不同的分代收集器,如果两个收集器之间有连线,则表示 ...
随机推荐
- python--装饰器2--理解
一.装饰无参函数①.原函数target为无参函数②.装饰函数的内置函数也必须要是无参函数③.运行原理相当于:target()=decorator(target)()---->最后的()相当于执行 ...
- MySQL查询本周、上周、本月、上个月份数据的sql脚本
2018-11-13 查询今天的数据 select * from 表名 where to_days(时间字段名) = to_days(now()); 查询昨天的数据 SELECT * FROM 表名 ...
- Flume的四个使用案例
一.Flume监听端口 1,在linux机器上下载telnet工具 yum search telnet yumm install telnet.x86_64 2.编写flume的配置文件,并将文件复制 ...
- python爬取今日头条关键字图集
1.访问搜索图集结果,获得json如下(右图为data的一条的详细内容).页面以Ajax呈现,每次请求20个图集,其中 title --- 图集名字 artical_url --- 图集的地址 cou ...
- 数据库相关--mysql8.0设置root登录密码
系统:win7 64位 MySQL 8.0 .11 1.启动服务: $ net start mysql 进入MySQL(mysql -hlocalhost -uroot): 2.选择mysql ...
- linux 学习笔记 管道 pipe ls cp mv
如ls |less -MN 含义把ls结果输出到less [ls] ==管道== [more] ls命令 ls -a 展示隐藏的文件 <隐藏文件一般以. 开始> ls -t 以时间戳排 ...
- Alpha(5/10)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- 在Xamarin.iOS项目中使用预设数据库
在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...
- Django路由详解
一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...
- AE模板
== 蓝色浩瀚星辰中一道光速展示企业LOGO AE模板 科技公司品牌开场动画. == 线条科技感图片商品介绍 Tech Grid Show免费下载 科技科幻风格. 产品介绍不错. == 炫光三维金属质 ...