内容稍微变化了一点,主要讲解JVM中GC相关的部分
PPT:JVM_GC.pdf
示例源码:src_jvm_gc.rar
讲稿:
==========
GC
1.什么是GC:
1)释放不再使用的内存对象以回收内存空间
2)压缩内存碎片
2.为什么要让JVM做GC,而不是程序员来做?
1)把开发人员从管理内存中解放出来,提高生产率
2)安全角度考虑,不会由于失误/故意错误释放内存带来潜在的安全问题
3)弊端:额外地占用CPU,且对于程序员来说”难于”控制
引用计数收集器:
start:当创建对象,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被置为1
其他变量被赋值为对这个对象引用时,i++
一个对象引用超过生存期或者被设置成一个新值时,i–
计数为0的对象就可以被收集
当收集的时候,该对象所引用的对象计数i–
优点:速度快,交织在程序运行之中
缺点:无法检测出循环引用
跟踪收集器:
从根结点开始跟踪,对所有跟踪到的对象以某种方式(和实现有关)打上标记,跟踪结束时,就可以对没打上标记的对象实现收集
优点:可以回收循环引用
缺点:回收的时候长时间独占CPU
问题:什么是根结点
根结点:
和实现有关:总的来说有以下几个方面:
1.局部变量,操作数栈(参数)
2.常量池中对象:字符串,类名,接口名…
3.JNI调用,没有被释放的
压缩收集器:
把标记为活动的对象从原来的区域越过空闲区移动到堆的另一端
问题:更新移动的对象要更新所有的指针(以用于清理)
解决:有些JVM实现做了一层 间接对象引用层 (不完美,每次取对象都要多一个步骤)
拷贝收集器:
有两个内存区域
把标记为活动的对象从原来的区域拷贝到另一个区域
同一时间只有一个区域在使用
优点:在使用的时候才更新指针
缺点:内存使用率降低
finalize
时机:对象被回收时
流程:收集器第一遍扫描出不再被引用的对象
调用他们的finalize方法,此时程序员可以实现finalize方法做清理工作,可以复活这个对象
收集器第二遍扫描,只扫描不再被引用的对象,对没复活的对象做清理
jdk1.2以前:可触及,可复活,不可触及
可触及:从根结点开始跟踪可以触及到
可复活:从根结点跟踪不可触及,但在自己或者别人的finalize方法里重新使该对象可触及
不可触及:finalize方法后也不可触及
jdk1.2以后:软引用,弱引用,影子引用
软引用:做cache
弱引用,做映射:初始化实例时默认配置,配置修改时可以通知,如果实例已经不再使用,就不通知
影子引用:处理收集时的后续操作,类比finalize,初始化时要增加一个ReferenceQueue队列参数
==========
文章来源:
http://lookis.me/?p=32
posted on 2010-03-24 10:18
Lookis 阅读(189)
评论(0) 编辑 收藏