A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 影凡 中级黑马   /  2014-2-21 00:51  /  1257 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于JVM,启动时,只好有两个线程:jvm的主线程。jvm的垃圾回收线程。求解详细的垃圾回收线程机制?最好能附上代码说明,谢谢~

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

2 个回复

正序浏览
我对楼上的进行一点补充:除了不被引用以外,“离开作用域”,JAVA程序中的对象也会被当作垃圾来进行回收。

JAVA垃圾回收机制另一个特点是,进行垃圾回收的线程是一种低优先级的线程,在一个Java程序的生命周期中,它只有在内存空闲的时候才有机会运行。垃圾回收不仅可以提高系统的可靠性、使内存管理与类接口设计分离,还可以使开发者减少了跟踪内存管理错误的时间,从而把程序员从手工回收内存空间的繁重工作中解脱出来。

以下内容为转:
几种垃圾回收机制
  1.标记-清除收集器
  这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。
  2.标记-压缩收集器
  有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。
  3.复制收集器
  这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,jvm生成的新对象则放在另一半空间中。gc运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。
  4.增量收集器
  增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。
  5.分代收集器
  这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。
  6.并发收集器
  并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。
  7.并行收集器
  并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
  1. 举个例子
  2. Test t = new Test();
  3. t = null;
  4. 现在没有地址指向了,这块空间是无用的,垃圾回收器是立即执行吗?
  5. 我遇到一个问题
  6. for(i=0;i<5;i++)
  7. {
  8.      List list = 查数据();
  9.     //写数据
  10. }

  11. 循环在进来,就堆溢出,按道理来讲,list出了作用域,内存空间就没了,每次查的数据都是一样的,怎么还会溢出呢?
  12. 我猜测List出了作用域 没有被回收,导致空间还是被占用,所以在查数据的时候,上次没释放,这次又新增,内存才会溢出
  13. 所以垃圾回收机制,不是立刻执行的
复制代码

其实在老毕的视频里就讲到了,垃圾回收机制其实就是将堆内存中不被引用的数据通过系统不定时的自动清理,以前是我们程序员做的事情,发展到现在更方便由计算机自行去做,免得我们人会忘记

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马