[发明专利]一种即时编译器辅助的垃圾收集中显式释放对象的插桩方法无效
申请号: | 200910077251.9 | 申请日: | 2009-01-20 |
公开(公告)号: | CN101493767A | 公开(公告)日: | 2009-07-29 |
发明(设计)人: | 张昱;袁丽娜 | 申请(专利权)人: | 中国科学技术大学 |
主分类号: | G06F9/44 | 分类号: | G06F9/44;G06F12/02 |
代理公司: | 北京凯特来知识产权代理有限公司 | 代理人: | 郑立明 |
地址: | 230026*** | 国省代码: | 安徽;34 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 即时 编译器 辅助 垃圾 收集 中显式 释放 对象 方法 | ||
技术领域
本发明涉及即时编译器辅助的垃圾收集技术领域,具体涉及一种即时编译器辅助的垃圾收集中显式释放对象的插桩方法。
背景技术
Java语言采用GC(Garbage Collector,垃圾收集器)这种自动的内存管理技术在堆上管理对象的分配与回收。当堆空间不足时,GC就会自动启动垃圾收集来识别并回收死亡对象所占用的内存空间,即由GC隐式地回收死亡对象。这种内存管理方式减轻了程序员的编程负担,降低了程序中与内存相关错误的发生几率,然而它也为整个系统运行带来了额外的时空开销,是影响Java虚拟机性能的重要因素之一。
C与C++这类语言采用显式的内存管理技术,由程序员在编程时插入显式的释放内存的指令来回收内存空间。这种显式的内存管理可以在很小的代价下快速回收内存空间;但却给程序员带来很大的编程负担从而影响编程效率,并且容易引起与内存相关的错误,如内存泄漏、悬空引用等。
GC在进行对象回收时,有大量的时空开销消耗在识别堆中哪些对象是死亡的。为了提高GC管理内存的性能,目前一种新的解决方式是JIT(Just-in-time Complier,即时编译器)辅助的垃圾收集(JIT-assisted-GC,Just-in-time compiler assisted garbage collection)技术。JIT-assisted-GC结合了显式和自动(又称隐式)内存管理的优点,是在编译阶段由JIT分析应用程序以识别确定其中的死亡对象及位置,并根据死亡对象的位置信息在相应的位 置上安插显式释放内存的指令来主动通知GC回收内存,GC接到显式内存释放请求后,不仅可以立即回收内存空间还可以采取某些策略对这些空间进行有效重用,从而减轻了GC自动回收内存的负担。
现有的JIT-assisted-GC中的显式释放对象的插桩方法主要有两种。一是通过过程内的别名分析和全局约束系统,分析出程序中具有唯一引用(变量或对象的域)的对象的生命期,在这些具有唯一引用的对象的死亡位置安插显式内存释放指令;二是利用流不敏感的指针分析和流敏感的活跃变量分析,能够分析出程序中的短生命期对象,并在短生命期对象的死亡位置安插显式内存回收指令,这种方法无法识别被对象的域所引用的对象的生命期。
在实施本发明的过程中,发明人发现现有技术至少存在以下问题:
1)现有技术识别出死亡对象时,直接在死亡对象的死亡位置上安插显式释放内存的指令来主动通知GC回收内存,但对于在分支中创建的对象若其生命期在分支外结束,此时直接在死亡位置安插显式内存释放指令会导致:当程序运行经过其他未创建该对象的分支后,执行所安插的显式内存释放指令时,将导致释放了一个不存在的死亡对象(即悬空引用);例如:假设程序执行的控制流中的某个位置存在分支A和分支B,这两条分支随后又聚合为一条分支C,对象a在分支A内创建,但是对象生命期分析识别出对象a在分支C的某个位置死亡,如果将显式内存释放指令安插在分支C处,就会导致当程序执行实际走的是分支B时,就会在执行到分支C时释放了一个不存在的死亡对象,因为对象a并没有在分支B中创建;
2)当死亡对象在Java程序的方法(也称函数)中存在多个引用时,现有技术不能提供一个很好的选择策略来释放死亡对象所占用的内存空间;
3)当死亡对象在Java程序的方法(也称函数)中没有显式的出现引用时,现有技术无法释放其内存空间。
发明内容
鉴于上述现有技术所存在的问题,本发明的目的是提供一种即时编译器辅助的垃圾收集中显式释放对象的插桩方法,不仅能够准确有效的将显式释放内存指令插入合理的位置而不导致编译的错误,并且可以将死亡对象空间更多的被释放。
本发明的目的是通过以下技术方案实现的:
本发明提供了一种即时编译器辅助的垃圾收集中显式释放对象的插桩方法,包括:
将经过对象生命期分析后获得的死亡对象信息中满足插桩类型条件的信息,记录到插桩信息中;所述插桩信息包含为死亡对象选择的引用及确定的插桩位置;
根据所述插桩信息,创建对应的显式内存释放指令,将所述显式内存释放指令安插到对应的位置上,以对所述死亡对象的内存空间进行释放;
所述死亡对象包括:直接死亡对象和与所述直接死亡对象有域引用关系的间接死亡对象;所述死亡对象信息包括:直接死亡对象及对应的死亡位置和所述直接死亡对象的域信息,以及与所述直接死亡对象有域引用关系的间接死亡对象及对应的死亡位置;
将所述显式内存释放指令安插到对应的位置上的具体过程包括:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国科学技术大学,未经中国科学技术大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200910077251.9/2.html,转载请声明来源钻瓜专利网。
- 上一篇:光学膜及该光学膜的制造方法
- 下一篇:一种西洋参山核桃的加工方法