转:http://blog.csdn.net/yakihappy/article/details/3979944

垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。

引用计数 每个对象都含有一个引用计数器,当有引用连接至对象时引用计数加一,当引用离开作用域或被置为null时引用计数器减一,虽然管理引用计数的开销不大,但是在整个生命期都会发生。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0,就释放占用空间。存在一个缺陷,在出现循环引用的情况下,会出现对象应该被回收,但引用计数却不为0的情况。

对象引用遍历 从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。 下一步,gc要删除不可到达的对象。删除时,有些gc只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多gc可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。 为此,gc需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有gc运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的gc不断增加或同时运行以减少或者清除应用程序的中断。有的gc使用单线程完成这项工作,有的则采用多线程以增加效率。

几种垃圾回收机制

2.1标记-清除收集器 这种收集器从堆栈和静态存储区出发,首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。

2.2.标记-压缩收集器 有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。

2.3.复制收集器 这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。gc运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。

2.4.增量收集器 增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。

2.5.分代收集器 这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。JVM生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。

2.6.并发收集器 并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。

2.7.并行收集器 并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显著的提高Java应用程序的可扩展性。

java 手动垃圾回收_java如何进行垃圾回收的相关推荐

  1. java String如何回收_java中的垃圾回收

    原文-http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确 ...

  2. java 全局变量 内存不回收_Java的内存 - 内存回收

    这篇承接上一篇 <Java的内存 - 内存模型>,分析内存回收相关的知识点. 垃圾回收包含两个步骤,①标记哪些内存是垃圾 ②回收内存.下面分别说这两个步骤有哪些算法: 1. 垃圾标记 1. ...

  3. java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园

    我们知道JVM中一个对象实例超出作用域或无引用的时候会被垃圾回收,那么他被垃圾回收后,依赖其成员变量的其他实例是否还能正常使用呢?经过测试后发现即使一个实例被垃圾回收,如果他内部的数据被其他对象使用, ...

  4. java 局部变量垃圾回收_java局部变量对垃圾回收的影响

    结论 局部变量表中的变量是很重要的垃圾回收根节点,被局部变量表中变量直接或者间接引用的对象都不会被回收. 实验 看如下代码,使用JVM的-XX:+PrintGC参数运行下面代码(在main函数中分别执 ...

  5. java 手动抛异常_Java 异常处理 之 手动抛出异常

    一.手动抛出异常 throw 在编写程序时,我们必须要考虑程序出现问题的情况.比如,在定义方法时,方法需要接受参数.那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法 ...

  6. java 手动抛异常_Java如何在没有throws签名的函数中手动抛出异常

    如果想在方法中抛出异常,像下面这样直接throw是不行的.public void test() { throw new Exception(); } 这时编译器会给我们一个错误: Error:(101 ...

  7. java 线程池 资源回收_JAVA线程池资源回收的问题

    最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存 ...

  8. java 线程回收_JAVA线程池资源回收的问题

    最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存 ...

  9. java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用

    创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...

最新文章

  1. This Gradle plugin requires Studio 3.0 minimum
  2. 记录一次CPLD资源过少、时序伪例的解决办法
  3. 技改之路:从单块应用到微服务,我的血泪总结--转
  4. 《Python编程快速上手——让繁琐工作自动化》——第一部分 Python编程基础 第1章 Python基础 1.1 在交互式环境中输入表达式...
  5. 使用HOG+LBP实现动物分类:matlab版本
  6. java打印6个偶数_Java编写一个应用程序,打印所有偶数从2到100
  7. centos7.4进入单用户模式
  8. java学习(104):字符串equals,charAt,endwith,startwith方法
  9. 关于CaciiEZ端口流量阀值报警的设置
  10. OpenCV辅助对象(help objects)(1)_TermCriteria
  11. Redmi K40系列要做旗舰“焊门员”:生死看淡 不服就焊
  12. 带透明png转换成c数组
  13. 实用~AVAide MP4 Converter for mac - MP4转换器
  14. 如何计算CRC循环校验码示例
  15. 【小技巧】2345——劫持IE浏览器主页
  16. linux skype 4.3,在Arch Linux上安装Skype 4.3(最新版本)
  17. 深入理解Arduino下的ESP8266_Non-OS_SDK API① Non-OS SDK
  18. VMware和mobaXterm连接总结
  19. python制作英语字典_Python爬虫之自制英汉字典
  20. JavaBean 与 POJO

热门文章

  1. 井柏然自己的字体,手写语录合集
  2. 八马茶业IPO被终止:王文彬家族与安踏七匹狼等泉州富豪圈联姻
  3. 王文彬:谈PaaS对互联网产业的影响 PaaS vs IaaS 你需要知道的!
  4. 科技对我们生活有哪些影响?未来科技的发展趋势是什么?
  5. 李政道和杨振宁合作历程
  6. 电子邮件SMTP协议原始命令码和工作原理
  7. 动态生成 3D 可打印的收款码
  8. SQL Server 2016详细安装步骤,后附链接
  9. [CF765F]Souvenirs
  10. vue-devtools\shells\chrome 错误 无法为内容脚本加载 JavaScript“build/hook.js”。 无法加载清单。