空间管理 - 碎片化问题及解决思路
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
文章目录
相关:
- 数据库表空间释放(Mysql、SQLite、PosgreSQL、Oracle)
- 操作系统空间回收(Windows、Linux)
- C++指针空间回收
- Java等垃圾回收机制
- 硬盘空间、内存空间
1.什么是空间碎片化?
空间碎片化:空间(硬盘物理空间、内存等)在长时间使用后,造成空间块不连续的现象,叫做空间碎片化。空间使用的时间越长,碎片化就越严重。
2.为什么会产生碎片?
2.1 空间使用的过程
A.空间从来未被使用的阶段
这个阶段,未使用的空间是连续的。这时,系统是没有碎片的。
B.空间开始被使用
这个阶段,由于空间很充足,所以空间分配也不是问题
C.空间被删除
由于空间的删除基本不可能使剩余的空间连续,所以这个阶段是产生碎片的阶段
D.空间再次被使用
请求新的空间使用时,系统会根据剩余的空间情况,分配合适的空间给新的请求。但是,由于总有空间不能满足新的请求,所以这个阶段总会加剧碎片化问题
E.重复空间使用和删除的过程
2.2 碎片化原因
经过上述过程的描述,我们可以知道碎片化问题正是由于空间不断被使用和释放导致的。因此,我们得到一个很无奈的结论:
只要空间一直在使用,空间的碎片化问题就不可避免。
3.如何做碎片优化?
碎片优化就是将无序的空间整理成有序的空间,尽可能的保持空间从未被使用过的状态。
3.1 手动优化
3.1.1 设置合理的空间管理机制
设置合理的空间管理机制,如操作系统的分页机制
3.1.2 尽可能使用连续空间
使用的时候进行合理的空间请求,如字节对齐引起的变量的声明顺序不同导致占用的总内存不同问题
3.1.3 手动整理空间法
将占用的空间整理成连续
3.1.4 暴力重置法
将需要整理的空间进行备份,清空整个空间,将备份还原,删除备份
3.2 自动优化
3.2.1 定时优化
在合适的时间对空间进行整理
3.2.2 合理化重复使用
当有新的空间请求时,合理的重复使用空间
4.应用
4.1 数据库
数据删除后,空间依旧被占用问题
4.1.1 手动整理空间法
MySQL:OPTIMIZE TABLE
PosgreSQL:vacuum
SQLite:vacuum
Oracle:Shrink Table
4.1.2 暴力重置法
数据备份,清空数据库,备份还原,清空备份
4.2 操作系统
苹果操作系统从文件系统底层和操作系统调度上就将文件碎片化的问题给屏蔽掉
4.3 指针问题
指针被释放后,表示这块内存可以被操作系统重新分配,但是指针还是指向这块儿内存的。虽然指针还是指向原来的位置,但是那一块内存随时都可能会被回收。
4.4 Java等的内存回收机制
相对于指针的释放问题,Java的做法与苹果操作系统类似,采用有系统处理
5.为什么不实时整理碎片呢?
如果实时整理碎片,就会导致读写效率更低。因此,一般来说,进行删除操作后,对空间进行标记,表明该空间可以再次被使用(空间的释放也不是实时处理
),在必要或者周期内进行整理。
6.处理碎片化的意义
提高空间的读写效率
Reference:
NULL
觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
License