知识卡片
动态类加载并不排斥基于假设的激进优化只要能撤销
内容
有人认为支持运行时动态加载新类的语言天生限制编译器优化空间,因为无法确定方法调用最终有没有别的实现类冒出来。实际做法是让编译器大胆假设(如对象目前只有一种具体类可跳过动态分派),并通过类加载器留一个钩子:一旦加载打破假设的新类就触发重新编译撤销旧优化。这种先乐观假设、发现不成立就撤销重来的模式,让动态扩展性和激进优化共存。
参考来源
- 位置:《架构之美》第10章《元循环虚拟机的力量:Jikes RVM》10.2.4节《动态类加载抑制了性能》及10.5.8节《类加载器和反射》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0215.xhtml, part0230.xhtml)
- 结论依据:原文明确"如果一个对象的一个方法正在调用,而且对于那个对象只有一个可能的类,避免进行动态的方法分派并直接调用这个方法会更好",并说明"重要的运行时钩子存在于类加载器中,如果先前保存的假定不再正确时它们可以触发重新编译"。
- 原始内容:如果一个对象的一个方法正在调用,而且对于那个对象只有一个可能的类,避免进行动态的方法分派并直接调用这个方法会更好……重要的运行时钩子存在于类加载器中,如果先前保存的假定不再正确时它们可以触发重新编译。