《深入理解Java虚拟机》笔记3
2024-08-27 00:52:32
垃圾收集算法
(1)标记清除
根据根搜索确定对象是否已死,已死对象标记,然后一起清除。
这个其实不算什么算法,最正常想法应该就是这样。但是,缺点
是效率不高,如果有很多不连续的小对象需要回收,会花好多时间
。另外,造成内存碎片也是问题,分配新的对象和分配大对象不好解决。
(2)标记复制
简单的做法,把内存分成两块,内存永远在其中一块上分配。
垃圾回收时,把存活的对象复制到另一块连续分配,然后把前一块
内存全清除即可。这种方法是浪费一半内存,代价有点大。
PS:以后内存大小如果不是问题,不知道会不会用这种算法?
大多数情况下,对象的存活期应该是朝生夕灭,所以,专门留出
一半的空间来准备备份是没有必要的。
hotspot虚拟机的算法是内存分为一块大的eden空间和两块较小
的survivor空间(注意:只是新生代,不是全部内存,后面会说到新生代)
其中一块survivor用作备份存活对象,eden和survivor可以用来分配内存。
这样浪费的空间就只有一个survivor。
另外一个问题随之而来,并不能保证存活下的对象全能被一个survivor容纳。
不能容纳的对象必须有别的内存来担保,这个工作是由老生代担当的。
从名字也可以看出老生代存放的是存活周期比较老的对象。
(3)标记整理算法
佩服这个算法的创造者┏ (^ω^)=☞
老生代没有额外的担保空间,但是又需要垃圾回收,聪明的人想到了办法。
每次垃圾回收时,把存活的对象向内存的另一侧移动,然后清除回收前的起点到
另一侧占用的边界之间的内存。
(4)分代收集算法
把内存分为新生代和老生代。新生代用的是复制算法,
老生代用的是标记整理算法。作者把分代算法和前面三种算法
并列,感觉不是一个层次的东西。计算机书籍,理解即可。
最新文章
- js获取IP和MAC地址
- Timeline Portfolio - 时间轴作品集效果
- [LintCode] Add Binary 二进制数相加
- HTML图像映射
- TYVJ P1090 母舰 Label:模拟,题目看清就好
- 用AngularJS开发的过程中如何查看Scope内容
- Win10正式版激活方法有哪些?如何激活Win10?
- 《Apache负载均衡》RHEL6
- Java知识点:javac命令
- RHEL 7特性说明(七):编译程序及工具
- eclipse启动不了报错java was started but returned exit code=13
- Android中程序包的相关操作
- Ajax中参数带有html格式的 传入后台保存【二】
- 将控制台信息显示在前台页面的js插件
- hadoop小知识札记
- SpringBoot+Shiro入门小栗子
- 二叉排序树类的: C++ 实现
- cookie 简单用法
- tomcat的安装及配置
- 【BZOJ】【2738】&;【Tsinsen】【A1333】矩阵乘法
热门文章
- xcode自动打ipa包脚本
- camera摄像原理之三:色温和自动白平衡【转】
- Python3安装cx_Oracle连接oracle数据库实操总结
- 【转】Spring MVC 解读——<;mvc:annotation-driven/>;
- 【 Ngnix 】配置路径转发至后端Apache多台虚拟主机
- 阿里云OSS C#回调服务实例代码
- python 如何将JSON数据原封不动的转为字符串(顺序不能变动)?
- 虚拟机vmware下安装Ghost XP——正确的解决方案
- springboot hystrix turbine 聚合监控
- js处理富文本编辑器转义、去除转义、去除HTML标签