posts - 5,  comments - 2,  trackbacks - 0
内容稍微变化了一点,主要讲解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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜