博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
垃圾收集器与内存分配策略(一)
阅读量:6615 次
发布时间:2019-06-24

本文共 877 字,大约阅读时间需要 2 分钟。

1.判断对象是否存活

    a.计数器算法

 算法描述:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1;任何时刻计数器为0的对象就是不可能再被使用的。

该算法实现简单,效率也很高,但是Java虚拟机中没有使用计数器算法来管理内存,主要原因就是它很难解决对象之间相互循环引用的问题。

   b.可达性分析算法

算法描述:通过一系列的称为"GC Roots"的对象作为起点,从这些节点开始向下进行搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,换句话说,从GC Roots到该对象不可达时,则说明该对象是不可用的。

Java语言中可以选做GC Roots的对象:虚拟机栈中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中JNI(即一般说的Native方法)引用的对象。

2. 再谈引用

JDK1.2之后,Java将引用分为强引用、软引用、弱引用和虚引用四种。

强引用:只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象;

软引用:描述了还有用但是非必需的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收;

弱引用:描述了非必需对象,被弱引用关联的对象只能生存到下一次垃圾回收之前;

虚引用:为对象设置该引用的唯一目的就是能在这个对象被垃圾收集器回收时收到一个系统通知。

3.回收方法区

方法区垃圾收集主要回收两部分内容:废弃常量和无用的类。

回收废弃常量与回收Java堆中的对象非常类似,当该常量没有任何引用时就是废弃常量。

无用的类需要满足以下三个条件:

该类所有实例均被回收,即Java堆上不存在该类的任何实例;

加载该类的ClassLoader已经被回收;

该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

无用的类仅仅是可以被回收,并不一定必然被回收。

转载于:https://www.cnblogs.com/bywallance/p/5898253.html

你可能感兴趣的文章
深度学习笔记之CNN(卷积神经网络)基础
查看>>
Hadoop 添加删除数据节点(datanode)
查看>>
ext的window如何隐藏水平滚动条
查看>>
71.8. Run level shell script to start Oracle 10g services on RedHat Enterprise Linux (RHAS 4)
查看>>
SAP QM Transfer of Inspection Stock
查看>>
ORACLE expdp备份与ORA-31693、ORA-02354、ORA-02149
查看>>
嵌入式 详解udev
查看>>
云安全:这也是需要花大钱去建设的部分
查看>>
5G网络不止能1秒下一部电影,它还能够…
查看>>
中国电信集采终端6700万部 金额达1070亿元
查看>>
2016年的十个数据中心故事
查看>>
《Java并发编程的艺术》一一3.3 顺序一致性
查看>>
《设计之外——比修图更重要的111件事》—第1部分3 虚心学习
查看>>
EVCache —— Netflix 的分布式内存数据存储
查看>>
《用友ERP-U8(8.72版)标准财务模拟实训》——1.4 系统管理注册和导入演示账套...
查看>>
springboot docker笔记
查看>>
Modbus RTU 通信工具设计
查看>>
服务化改造实践 | 如何在 Dubbo 中支持 REST
查看>>
【第8章】JVM内存管理
查看>>
ovirt官方安装文档 附录G
查看>>