网站首页 > java教程 正文
在Java中对象都是都JVM帮助管理的,那什么时候对象才会被回收,答案就是对象成为了垃圾对象,就是没有被引用的对象。怎么确定是否被引用呢?有两种方式:
计数法
给每个对象中添加一个引用计数器,每当有地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;计数器为0的对象就是可以回收的对象。
这个方法的优点就是速度很快,效率高,但是这个方法有个循环引用的问题。循环依赖的对象计数没有其他对象引用了,但是计数也不是零,因此不会被回收。
从根节点失去关联的A、B和C,没有被其他引用但是计数器不为零,下面是简单的代码示意。
根搜索算法
从gc root 对象开始查找引用,找到后继续查找当前引用的其他引用,如此循环就构成了一个图,没在图中的就是下次要回收的潜在对象。真正决定对象死亡需要2次标记。
GC root对象:
- 虚拟机栈(栈帧中的本地变量表)中的引用的对象
- 方法区的类静态属性引用的对象
- 方法区的常量引用的对象
- 本地方法栈中JNI的应用对象
GC 回收算法
- 标记-清除算法(Mark - Sweep):首先标记有reference的对象,没有标记的就是回收对象,需要清除。缺点:效率问题, 空间问题(产生好多不连续的碎片,使用效率低)
- 复制算法(Copying):把堆内存分成2份,每次gc, 把一块内存的存活的对象复制到另一块,然后清空这一块内存,这个可以利用的空间减少了一半。
- 标记—整理算法(Mark Compact):把标记存活的对象,放到内存开始的一端,然后清理边界外的对象。
- 分代收集(Generational gc):按对象的存活周期把内存分成几块,young generation, old generation, young generation 中把内存分成较大的Eden空间, 和2个较小的Survivor空间,新生产的对象放到Eden空间,当Eden 满了的时候,GC把存活的对象移动到第一个Survivor,并把Eden清空,第二次GC的时候把第一个Eden,Survivor空间的存活对象移动到第二个Surivivor空间, 并把其他清空,并把从第一个Survivor移动的对象的age加1, 下一次再把第二个Survivor空间的对象移动到第一个Survivor,如此循环,等age 到了一定值就会把对象移动到old generation。大对象直接在old generation中分配。
猜你喜欢
- 2024-11-08 咱们从头到尾说一次 Java 的垃圾回收
- 2024-11-08 了解Java垃圾收集(java中垃圾收集)
- 2024-11-08 Java 垃圾回收(java垃圾回收)
- 2024-11-08 Java JVM垃圾回收算法浅记(java 垃圾回收机制)
- 2024-11-08 Java 经典垃圾回收器详解(java 垃圾回收器有哪些)
- 2024-11-08 JVM系列(十):JVM 垃圾回收机制详解分析
- 2024-11-08 看连环画,Java垃圾回收机制,简单易懂
- 2024-11-08 【虚拟机】深入理解java虚拟机【垃圾回收算法】
- 2024-11-08 Java面试必背——垃圾回收机制及如何手动触发垃...
- 2024-11-08 Java垃圾回收算法(java垃圾回收算法cms执行的顺序是)
你 发表评论:
欢迎- 最近发表
-
- pyinstaller打包python程序高级技巧
- 将python打包成exe的方式(python打包成exe的方法)
- Python打包:如何将 Flask 项目打包成exe程序
- py2exe实现python文件打包为.exe可执行程序(上篇)
- 如何将 Python 项目打包成 exe,另带卸载功能!
- Python打包成 exe,太大了该怎么解决?
- 可视化 Python 打包 exe,这个神器绝了!
- 案例详解pyinstaller将python程序打包为可执行文件exe
- Cocos 3.x 菜鸟一起玩:打包window程序
- 怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!
- 标签列表
-
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)