论坛首页 Java企业应用论坛

作为java玩家应该了解的东西(Java内存管理——垃圾收集概念及特点)

浏览 12940 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2012-02-06  
程序猿 是亮点!
0 请登录后投票
   发表时间:2012-02-06   最后修改:2012-02-06

楼主说道:
承担次任务的是Java中的垃圾收集器,它能解决悬摆指针,内存泄露问题。
对象的引用关系会被垃圾收集器检索到,
当某个对象不再被任何对象引用的时候,垃圾收集器会自动回收。

---------------------------------------我是分割线-----------------------------------------------------------
感谢楼主的无私分享,我读完后有两个问题向您请教:
1.Java中是不会出现“悬摆指针”的问题吧?
2.当某个对象不再被任何对象引用的时候,但这个对象(比如是根对象)保存着指向其他对象的引用,那么它满足被回收的条件吗?

 

0 请登录后投票
   发表时间:2012-02-06  
ol_beta 写道
freish 写道
介绍点垃圾回收算法增加含金量撒

这里有些以前总结的算法
http://softbeta.iteye.com/blog/1185576


学习了楼主的GC算法,有一点疑问向您请教:

感觉垃圾回收算法都是先标记再清理作为基础,然后再按照各自不同的方式或直接清除或清除后移动,那么如果刚刚被标记过的对象,在清理之前又被引用了,这种情况会出现漏洞吗(被引用的对象被回收了)?GC本身有没有解决这一问题的方法呢?
0 请登录后投票
   发表时间:2012-02-06  
sei_ljf 写道

楼主说道:
承担次任务的是Java中的垃圾收集器,它能解决悬摆指针,内存泄露问题。
对象的引用关系会被垃圾收集器检索到,
当某个对象不再被任何对象引用的时候,垃圾收集器会自动回收。

---------------------------------------我是分割线-----------------------------------------------------------
感谢楼主的无私分享,我读完后有两个问题向您请教:
1.Java中是不会出现“悬摆指针”的问题吧?
2.当某个对象不再被任何对象引用的时候,但这个对象(比如是根对象)保存着指向其他对象的引用,那么它满足被回收的条件吗?

 

1.之所以不会出现悬摆指针问题是因为有垃圾收集器,如果让程序猿自己控制指针,那就是有问题了。

2.上面对象不包括跟对象,垃圾收集器扫描的对象是从GCRoot开始的,不包括GCRoot。

0 请登录后投票
   发表时间:2012-02-06  
sei_ljf 写道
ol_beta 写道
freish 写道
介绍点垃圾回收算法增加含金量撒

这里有些以前总结的算法
http://softbeta.iteye.com/blog/1185576


学习了楼主的GC算法,有一点疑问向您请教:

感觉垃圾回收算法都是先标记再清理作为基础,然后再按照各自不同的方式或直接清除或清除后移动,那么如果刚刚被标记过的对象,在清理之前又被引用了,这种情况会出现漏洞吗(被引用的对象被回收了)?GC本身有没有解决这一问题的方法呢?

1.标记阶段是STW(Stop the Word),也就是应中断正在运行的程序,所以不会出现再次引用问题。
2.对于CMS收集器,可能会出现你说的问题,但是CMS有STW的remark阶段,不会出现泄漏的。
0 请登录后投票
   发表时间:2012-02-06  
程序猿啊程序猿~~
0 请登录后投票
   发表时间:2012-02-06  
谢谢您的耐心解答~~~
0 请登录后投票
   发表时间:2012-02-07  
freish 写道
介绍点垃圾回收算法增加含金量撒


java程序员考虑垃圾回收算法还用java干吗,用c++得了
0 请登录后投票
   发表时间:2012-02-07  
qq4628241 写道
"程序猿"是有意这么写的吗?

程序猿 是指 男性 程序员 !!!
程序媛 是指 女性 程序员 !!!
       
0 请登录后投票
   发表时间:2012-02-08  
ol_beta 写道

碎碎念,介绍Java内存管理基础知识

1.自动内存管理

    内存管理就是查找出不再使用的对象,释放这些对象占用的内存空间,为其他对象的分配提供足够的内存空间。在一些编程语言(C,C++)中,内存管理是程序员的职责。内存管理使开发变得复杂,而且会造成许多潜在的bug和不可知的崩溃。导致程序猿花费大量时间debug来修复这些很隐蔽的问题。

    在精确的内存管理中经常发生一个问题是悬摆指针 (dangling references )。程序猿可能释放一个对象占用的内存空间,即使这个对象还在被其他对象引用。如果一个对象引用另一个被不小心 释放的对象,这个释放对象的内存空间可能被重新分配新的对象,这个时候,不可预期的结果就可能发生了,而且很可能是致命的。

    另一个在精确内存管理中经常发生的问题是内存泄露 (menory leaks )。泄露经常是对象占用的内存空间不再被任何其他对象引用,但是这个对象没有被回收。例如,如果你打算回收一个列表的空间,但是不小心只释放了列表的第一个元素,这个列表的其他元素将一直持有内存空间,因为这个列表引用已经不存在了,其他元素占用的空间得不到释放,造成了泄露。久而久之,类似的泄露累计,将会填满内存空间,导致没有足够的内存分配给其他的新对象。

    鉴于上面的原因,Java做出一个明智但艰难的抉择,自动内存管 理。程序猿不再管理负责的内存分配和回收,把更多的精力放在业务开发上。承担次任务的是Java中的垃圾收集器,它能解决悬摆指针,内存泄露问题。对象的引用关系会被垃圾收集器检索到,当某个对象不再被任何对象引用的时候,垃圾收集器会自动回收。

2.垃圾收的集概念

一个垃圾回收器的职责:

  • 分配内存
  • 确保被引用的对象留在内存中
  • 释放那些不再被任何其他对象引用的对象占用的内存空间

    如果一个对象在以根对象 (root objects )为首的引用链中可达 ,那么这个对象是存活 的;否则,这个对象已经死亡 (将要被回收)。查找并释放不可达对象占用内存空间的过程,成为垃圾回收。

    垃圾回收能解决大部分问题,但不是所有问题。你可以不断创建新的对象,并保持这写对象的引用,直到没有足够的内存位置(操作系统可能会用到交换空间,虚拟内存等保证系统正常运行,但是效率会下降)。

    对于垃圾收集器分配和回收内存的算法,对程序员来说是透明的,通常对象内存空间是从 (heap )中分配的。

    垃圾收集器控制着垃圾回收的时间。通常,垃圾回收发生在整个堆或者堆一部分已经被填满或者堆的使用情况达到某个阈值 。对象内存分配需要垃圾收集器在堆中找到特定大小的连续 空间 ,而垃圾回收又会产生碎片 ,导致内存空间不连续。所以为了避免碎片,垃圾回收过程会有一些动作保证内存连续。

3.垃圾回收器特点

    垃圾收集器应该是安全并且全面的。存活对象不能被错误的回收,并且在一次垃圾回收周期中,垃圾对象应该被全部清除,不能有残留。

    垃圾回收器还应该是高效的,不能给正在运行的程序造成太大的停顿(STW ——stop the word )。在一个计算密集的系统中,在耗时,空间,频率 通常会有一个权衡。如果堆的空间很小,垃圾收集很快就会完成,但是堆很快就会被填满,这时候垃圾收集器活动就会更频繁。相反,对于一个较大的堆,填满这个堆需要相对较长时间,但是收集器执行一次垃圾回收耗时也相对较长。

    垃圾收集器的另一个特点是减少碎片空间。当回收对象占用的内存空间的时候,内存随便会遍布整个堆,新的对象分配没有足够大的连续空间导致分配失败。为了解决这个问题,在回收对象时,会对内存进行整理压缩

    可扩展对垃圾收集器也很重要。垃圾收收集器不应该在单线程和多线程执行效率是一样的,也就是说,多cpu不应该成为垃圾收集器的瓶颈。

 

垃圾收集算法:http://softbeta.iteye.com/blog/1185576

 

 

 

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics