网站首页 > java教程 正文
Java中一个显著的特点就是引入了垃圾回收机制,使使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。
内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
垃圾回收算法
标记清除算法
标记-清除算法分为标记和清除两个阶段。该算法首先从根集合进行扫描,对存活的对象对象标记,标记完毕后,再扫描整个空间中未被标记的对象并进行回收。但是该算法存在以下两个缺点:
复制算法
复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这种算法适用于对象存活率低的场景。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可。
虚拟机采用复制算法来回收新生代。新生代中的对象每次回收都基本上只有10%左右的对象存活,所以需要复制的对象很少。jvm将新生代内存分为一块较大的Eden空间和两块较小的Survivor空间 ,每次使用Eden和其中一块Survivor(from survivor)。当回收时,将Eden和Survivor中还存活着的对象一次地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的from survivor空间。虚拟机默认Eden和Survivor的大小比例是 8:1。浪费的内存只占堆内存的百分之十。
标记整理算法
标记整理算法的标记过程类似标记清除算法,但不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,类似于磁盘整理的过程,适用于对象存活率高的场景。
标记整理算法会将所有的存活对象移动到一端,并对不存活对象进行处理,因此其不会产生内存碎片。
分代收集算法
不同的对象的生命周期是不一样的,而不同生命周期的对象位于堆中不同的区域,因此对堆内存不同区域采用不同的策略进行回收可以提高 JVM 的执行效率。当代商用虚拟机使用的都是分代收集算法:新生代对象存活率低,就采用复制算法;老年代存活率高,就用标记清除算法或者标记整理算法。
猜你喜欢
- 2024-10-22 降低Java垃圾回收开销的5条建议(java具有自动垃圾回收机制吗)
- 2024-10-22 垃圾回收算法(垃圾回收算法手册 pdf)
- 2024-10-22 成为JavaGC专家(2)—如何监控Java垃圾回收机制
- 2024-10-22 Java中的垃圾回收算法与垃圾回收器
- 2024-10-22 一文理解Java垃圾回收机制(java垃圾回收机制优缺点)
- 2024-10-22 Java垃圾回收机制详解(java垃圾回收机制详解怎么写)
- 2024-10-22 java虚拟机——垃圾收集器与回收策略
- 2024-10-22 Java 常见的垃圾回收算法以及它们的优缺点(总结版)
- 2024-10-22 用最直接的大白话聊一聊Java对象的GC垃圾回收及在内存中的那些事
- 2024-10-22 从引用聊一聊 Java 垃圾回收(java中垃圾回收有什么目的)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)