详细介绍Java垃圾回收机制
垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。
本文出处:http://www.cnblogs.com/laoyangHJ/articles/java_gc.html
引用计数收集器
引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。
优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。
缺点: 无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0.
跟踪收集器
早期的JVM使用引用计数,现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
下一步,GC要删除不可到达的对象。删除时,有些GC只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多GC可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。
为此,GC需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有GC运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的 GC不断增加或同时运行以减少或者清除应用程序的中断。有的GC使用单线程完成这项工作,有的则采用多线程以增加效率。
一些常用的垃圾收集器
(1)标记-清除收集器
这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。
(2)标记-压缩收集器
有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。
(3)复制收集器
这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。
(4) 增量收集器
增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾,也可理解为把堆栈分成一小块一小块,每次仅对某一个块进行垃圾收集。这会造成较小的应用程序中断时间,使得用户一般不能觉察到垃圾收集器正在工作。
(5)分代收集器
复制收集器的缺点是:每次收集时,所有的标记对象都要被拷贝,从而导致一些生命周期很长的对象被来回拷贝多次,消耗大量的时间。而分代收集器则可解决这个问题,分代收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。JVM生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象(非短命对象)将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。
并行收集器
并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多CPU机器上使用多线程技术可以显著的提高java应用程序的可扩展性。
最后,贴出一个非常简单的跟踪收集器的例图,以便大家加深对收集器的理解:
跟踪收集器图例
使用垃圾收集器要注意的地方
下面将提出一些有关垃圾收集器要注意的地方,垃圾收集器知识很多,下面只列出一部分必要的知识:
(1)每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
(2)垃圾收集器跟踪每一个对象,收集那些不可触及的对象(即该对象不再被程序引用 了),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用该对象的finalize( )方法(如果有)。如果在finalize()方法中,又使得该对象被程序引用(俗称复活了),则该对象就变成了可触及的对象,暂时不会被垃圾收集了。但是由于每个对象只能调用一次finalize( )方法,所以每个对象也只可能 "复活 "一次。
(3)Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。
(4)垃圾收集器不可以被强制执行,但程序员可以通过调研System.gc方法来建议执行垃圾收集。记住,只是建议。一般不建议自己写System.gc,因为会加大垃圾收集工作量。
详解Java GC的工作原理
概要: JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制。
1. 首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。
1)堆
所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示:
新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象
2)栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果
3)本地方法栈
用于支持native方法的执行,存储了每个native方法调用的状态
4)方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(PermanetGeneration)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。介绍完了JVM内存组成结构,下面我们再来看一下JVM垃圾回收机制。
2. JVM垃圾回收机制
JVM分别对新生代和旧生代采用不同的垃圾回收机制
新生代的GC:
新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代,
用javavisualVM来查看,能明显观察到新生代满了后,会把对象转移到旧生代,然后清空继续装载,当旧生代也满了后,就会报outofmemory的异常,如下图所示:
在执行机制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew)
1)串行GC
在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定
2)并行回收GC
在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数
3)并行GC
与旧生代的并发GC配合使用
旧生代的GC:
旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。在执行机制上JVM提供了串行GC(SerialMSC)、并行GC(parallelMSC)和并发GC(CMS),具体算法细节还有待进一步深入研究。
以上各种GC机制是需要组合使用的,指定方式由下表所示:
转载于:https://blog.51cto.com/acevi/1974416
相关文章:

美国卡尔顿学院计算机专业怎么样,美国卡尔顿学院排名
在学术上,卡尔顿学院在美国处于领先地位。被美国新闻与世界报道评为全美前10位的文理学院卡尔顿学院排名卡尔顿学院是明尼苏达州菲尔德市一所历史悠久的文科私立院校,一直奉行无宗教派别男女合校制度。卡尔顿学院始建于1866年,经过一百多年的…
比特大陆发力边缘计算,详解终端AI芯片BM1880
作者 | 中国科学院微电子研究所 剑白 前不久比特大陆推出其云端人工智能芯片--SOPHON(算丰)BM1682芯片,BM1682是比特大陆设计,并对图像、视频等处理给予额外辅助支持的人工智能硬件加速芯片,其峰值运算速度为3TFLOPs,可提供给用户…

职称计算机 菏泽,山东菏泽2016年职称计算机首批考试时间
一、考试范围及科目(模块)1、参加2016年全国专业技术人员计算机应用能力考试的人员,须按照《2014版全国专业技术人员计算机应用能力考试科目(模块)代码表》(以下简称《2014版考试科目》)(见附件1)所列科目(模块)要求进行报名考试。2、评聘中级专业技术职务者&#x…

GitHub 挂了
参加 2018 AI开发者大会,请点击 ↑↑↑今天早上,全球最大的同性交友网站 GitHub 出现大规模宕机,你中招了没有?▌GitHub“挂了”“见鬼???”,一位 Twitter 用户评论道,“…

在ARC环境中autoreleasepool(runloop)的研究
引言 最近有个大佬考察了我关于autoreleasepool的了解, 之前一直认为自己了解, 但是稍微一问深, 自己却哑口无言. 仔细思考了下, 决定要将这个问题结合之前的知识从新梳理一下, 当然, 实践是必不可少的. main函数中的autoreleasepool的作用?系统的autoreleasepool我们自己创建…

QoS实验配置详解
QoS---CQ(定制队列)学习CQ(定制队列)的配置;本实验首先用ACL定义一些流量。然后再将这些流量进行先后排队,最后将排好队的流量策略应用到接口上 1 过滤流量R2(config)#access-list 101 permit ospf any any…

朴素贝叶斯分类器详解及中文文本舆情分析(附代码实践)
参加 2018 AI开发者大会,请点击 ↑↑↑作者 | 杨秀璋(笔名:Eastmount),贵州财经大学信息学院老师,硕士毕业于北京理工大学,主要研究方向是Web数据挖掘、知识图谱、Python数据分析、图像识别等。…

计算机应用基础试题及答案试卷号7074,阅读文章,完成试题。后来才知道,在这千钧一发的时刻,是郝副营长划着了火柴,点燃了那本书,举得高高的, - 学进去中小学试卷试题库...
阅读《苏州园林》(节选),回答问题。苏州园林(节选)叶圣陶①苏州园林据说有一百多处,我到过的不过十多处。其他地方的园林我也到过一些。倘若要我说说总的印象,我觉得苏州园林是我国各地园林的标本。②设计者和匠师们因地制宜,自出…

解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”...
[VS2005]解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题” 今天在准备发布用VS2005写的那个程序时,拷贝到我同事机器上,双击突然出现了“由于应用程序的配置不正确,应用程序未能…

PHP实时生成并下载超大数据量的EXCEL文件
最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况。而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成超大数据量的excel文件时这显然是会造成内…

小学三年级上册计算机计划书,小学三年级班主任工作计划书
教学计划是教师个人制定的工作计划,通常为一个学期,内容主要包括制定教学计划的指导思想、教学内容以及教学目标,最重要的是每个教师要针对自己所带的学生特点来制定计划,因材施教才是对我们学生最好的教育.一、指导思想端正学习态…

10行代码爬取全国所有A股/港股/新三板上市公司信息
参加 2018 AI开发者大会,请点击 ↑↑↑作者 | 高级农民工本文已获原作者授权,如需转载,请联系原作者。摘要: 我们平常在浏览网页中会遇到一些表格型的数据信息,除了表格本身体现的内容以外,可能还想透过表格…

阿里云前端周刊 - 第 29 期
推荐 1. RESTful API 设计最佳实践 https://blog.philipphauer.de/... 项目资源的URL应该如何设计?用名词复数还是用名词单数?一个资源需要多少个URL?用哪种HTTP方法来创建一个新的资源?可选参数应该放在哪里?那些不涉…

Flash传值给asp页面
1.LoadVars的load方法-----在flash中写一个拉出两个动态文件框,变量名为myName与myPsd,拉出一组件button,名为:submit_button,用于提交,再拉出一T…

《深度学习500问》,川大优秀毕业生的诚意之作
前端工程师掌握这18招,就能在浏览器里玩转深度学习基于知识图谱的人机对话系统 | 公开课笔记来呀!AI喊你斗地主美团大脑:知识图谱的建模方法及其应用 | 公开课笔记60天,4位诺奖得主,他们将这样改造区块链程序员的江湖,务必掌握这些…

UC阿里鱼卡全网免流活动正在进行
UC&阿里鱼卡全网免流活动正在进行 优酷、虾米、高德、书旗应用专属流量免费 赠送100分钟国内通话、1G全国流量 扫码立即免费申请

普渡大学计算机硕士申请条件,普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单...
2020年普渡大学计算机与信息技术理学硕士申请要求及普渡大学计算机与信息技术理学硕士申请材料要求清单是学生很感兴趣的问题,下面指南者留学整理2020年普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单供大家参考。其中包括2020年普渡大学计算机…

object.ReferenceEquals(a,b)
code1 Assert.IsFalse(object.ReferenceEquals(10, 10));//比较时,要把比较的东西Box成Object,二个Ojbec地址是不一样的。 2 3 int value 10; 4 object one value; 5 object two value; 6 As…

深度文本匹配在智能客服中的应用
参加2018 AI开发者大会,请点击↑↑↑作者 | 云知声目录一. 深度文本匹配的简介1. 文本匹配的价值2. 深度文本匹配的优势3. 深度文本匹配的发展路线二. 智能客服的简介1. 智能客服的应用背景2. 智能客服的核心模块FAQ 库的构建语义召回相似度模型模型更新三. 深度文本…

计算机辅助焊接过程控制,重型车辆计算机辅助焊接工艺自动设计系统.pdf
金属学与金属工艺维普资讯第26卷 第10期 焊 接 学 报 v。1.26 N。.102005年 10月 TRANSACTIONSOFTHECHINAWELDINGINSTITUTION October 2005重型车辆计算机辅助焊接工艺 自动设计系统王克鸿, 韩 杰, 李 帅 王佳军(南京理工大学 材料…

Linux--文件管理以及权限的修改
一、文件属性查看ls -l filename 目录属性的大小(文件名的字符总和)-|rw-r--r--.|1| root| root| 46 |Oct 1 05:03 |filename— ————————— — ———— ———— —— ———————————— ———————— 1 …

Linux 之父归来!
参加2018 AI开发者大会,请点击↑↑↑作者 | 屠敏来源 | CSDN去修身养性的 Linux 之父 Linus Torvalds 在时隔一个余月后笑着归来,从曾临时接手 Linux 4.19 开发的稳定版维护者 Greg Kroah-Hartman 手中再次接过 Linux 内核开发的交接棒。这位向来天不怕地…

vscode断开调试服务器文件,vscode显示等待调试器断开连接
我正在尝试在vscode上调试量角器脚本。我编辑了launch.json文件,但是调试控制台抛出了下面的错误。vscode调试控制台输出:C:\Program Files\nodejs\node.exe --inspect-brk45448 conf.js C:\Users\abc\AppData\Roaming\npm\node_modules\protractor\example/conf.jsDebugger li…

深入理解Spring系列之六:bean初始化
《深入理解Spring系列之四:BeanDefinition装载前奏曲》中提到,对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFactory)中完成。进入这个方法,代码如下。protected void finishBeanFactoryInitialization(ConfigurableLis…

webkit内核 css,纯CSS改变webkit内核浏览器的滚动条样式
基于webkit的浏览器现在可以自定义其滚动条的样式了,实现代码如下:复制代码代码如下:::-webkit-scrollbar/*整体部分*/{width: 10px;height:10px;}::-webkit-scrollbar-track/*滑动轨道*/{-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);border-rad…

数据依赖症:当今AI领域的核心风险
在最近结束的2017年度AI星际争霸竞赛上,Facebook做出了一款人工智能“CherryPi”,参与到这项旨在让各路AI技术在星际争霸游戏中同场竞技的赛事之中。 但很遗憾的是,Facebook仅仅获得了赛事的第六名,最直接的原因,在于F…
1024程序员节,你是我们要找的那条锦鲤吗?
参加2018 AI开发者大会,请扫描海报二维码 叮咚,您有一封 #1024吐槽狂欢派对# 邀请函请查收。 ▌什么是程序员? 全员格子、黑框眼镜,还是等于创造力忍耐力? 刻板标签、思维定式,还是高阶自黑玩梗幽默&#…

虚拟机管理你的服务器,全面解析VMware的虚拟机管理解决方案
本教程将为你讲述VMware的虚拟机管理解决方案,说起虚拟机,VMware绝对可以算的上是个中翘楚了,并且VMware的虚拟桌面结构解决方案可以起到增强管理效率,降低成本等等效用,话不多说,这就为大家介绍。Vmware的…

针对抓win2003系统密码的诡计
命令行下卸载win2003 sp1/sp2 %systemroot%\$NtServicePackUninstall$\spuninst\spuninst /U 按无人参与模式删除 service pack。如果使用此选项,那么在卸载 SP1 的过程中,只有出现致命错误才会显示提示。 /Q 按安静模式删除 SP1,此模式与无人…

那个曾经为美国NASA开发火星大脑的AI公司,现在和华为合作了
2010 年,美国航天航空局 NASA 敲响了一家创业公司的大门,希望他们参与火星探测器“大脑”的研发项目。这家公司就是 Neurala,一家专注于深度学习技术的波士顿初创公司。 NASA 的要求是一个艰难的挑战,因为火星探测器自身计算能力…