| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 垃圾回收机制 -> 正文阅读 |
|
[Java知识库]垃圾回收机制 |
什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 为什么需要GC?内存迟早都会被消耗完 JVM将整理出的内存分配给新的对象 没有GC就不能保证应用程序的正常进行 优点:自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险,可以更专心地专注于业务开发 ????????没有垃圾回收器,java也会和cpp一样,各种悬垂指针,野指针,泄露问题让你头疼不已。 缺点:弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力 GC主要关注于 方法区 和堆中的垃圾收集 频繁收集Young区 较少收集Old区 基本不收集Perm区(元空间) 垃圾回收相关算法标记阶段1. 引用计数算法 引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性。对象被引用,引用计数器+1,相反-1,当值为0时,对象可被回收 优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。 缺点:
当p的指针断开的时候,内部的引用形成一个循环,这就是循环引用 Java并没有选择引用计数,是因为其存在一个基本的难题,也就是很难处理循环引用关系。 Python如何解决循环引用?
2. 可达性分析算法(根搜索算法、追踪性垃圾收集) 搜索被根对象集合所连接的目标是否可达,不可达,则为垃圾对象 GC Roots包括以下几类元素:
清除阶段:JVM中比较常见的三种垃圾收集算法1. 标记一清除算法(Mark-Sweep) 标记:从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。清除没有标记的对象。 缺点
何为清除? 这里所谓的清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里。下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放覆盖原有的地址。 2. 复制(Copying)算法 将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,清除那些未存活的对象。 优点
缺点
3. 标记-压缩(Mark-Compact)算法 老年代 标记一清除算法的确可以应用在老年代中,但是该算法执行效率低下,执行GC后还会产生内存碎片,所以JVM的设计者需要在此基础之上进行改进。标记-压缩(Mark-Compact)算法由此诞生。 执行过程
标记-压缩算法的最终效果等同于标记-清除算法执行完成后,再进行一次内存碎片整理。二者的本质差异在于标记-清除算法是一种非移动式的回收算法,标记-压缩是移动式的。是否移动回收后的存活对象是一项优缺点并存的风险决策。可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。
优点
缺点
分代收集算法前面所有这些算法中,并没有一种算法可以完全替代其他算法,它们都具有自己独特的优势和特点。分代收集算法应运而生。不同生命周期的对象可以采取不同的收集方式 目前几乎所有的GC都采用分代手机算法执行垃圾回收的 年轻代(Young Gen) 复制算法 年轻代特点:区域相对老年代较小,对象生命周期短、存活率低,回收频繁。 老年代(Tenured Gen) 由标记-清除或者是标记-清除与标记-整理的混合实现。 老年代特点:区域较大,对象生命周期长、存活率高,回收不及年轻代频繁。 分代的思想被现有的虚拟机广泛使用。几乎所有的垃圾回收器都区分新生代和老年代 增量收集算法让垃圾收集线程和应用程序线程交替执行,解决了一次性将所有垃圾进行处理而造成系统长时间停顿的问题 缺点:线程切换和上下文转换是的垃圾回收成本上升,系统吞吐量下降 分区算法将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:02:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |