[讨论] 谁来说说java继承层次太多对于虚拟机性能有什么影响?
mathgl
2011-04-12
mercyblitz 写道 qianhd 写道 需要加载更加多的类
有可能造成Perm区溢出 这不是问题的关键~ 再大型的系统 相信也甚少有80层的 继承,如果有 我觉得首先要反思的是设计。 毕竟代码是给人看的。 |
|
Anddy
2011-04-13
RednaxelaFX 写道 对一些JVM来说继承深度非常大(例如>=8)的时候主要受影响的是快速子类型检查的效率。也就是instanceof、强制类型转换和数组元素写入这几种情况最受影响。
虚方法调用之类的在现在的高性能JVM里不会受继承深度影响的。 有这方面的资料 提供么? 為什麼要子类型检查 !! |
|
liuxuejin
2011-04-13
如果对象的继承层次太多,那么对象的生成就会比较慢!测试:
如果 Extclass-D-C-B-A Test 没有继承。 生成对象的时间 ExtClaas 为 153651 3073(nanotime) 当JVM创建一个类对象时,首先在堆中分配一个内存空间用来存放对象所属类和超类的实例变量(类中非常 量非静态变量),然后对这些变量赋默认值(与类静态变量类似),最后初始化我们需要的值。 上面对象的生成不是第一次生成的,都是第二次生成的,如果第一次生成,这个时间的差距更大 |
|
RednaxelaFX
2011-04-14
liuxuejin 写道 如果对象的继承层次太多,那么对象的生成就会比较慢!测试:
如果 Extclass-D-C-B-A Test 没有继承。 生成对象的时间 ExtClaas 为 153651 3073(nanotime) 当JVM创建一个类对象时,首先在堆中分配一个内存空间用来存放对象所属类和超类的实例变量(类中非常 量非静态变量),然后对这些变量赋默认值(与类静态变量类似),最后初始化我们需要的值。 上面对象的生成不是第一次生成的,都是第二次生成的,如果第一次生成,这个时间的差距更大 能把测试代码和测试环境发一下么? |
|
RednaxelaFX
2011-04-14
Anddy 写道 RednaxelaFX 写道 对一些JVM来说继承深度非常大(例如>=8)的时候主要受影响的是快速子类型检查的效率。也就是instanceof、强制类型转换和数组元素写入这几种情况最受影响。
虚方法调用之类的在现在的高性能JVM里不会受继承深度影响的。 有这方面的资料 提供么? 為什麼要子类型检查 !! 嗯,请参考这篇论文:Fast Subtype Checking in the HotSpot JVM,解释得很清楚。 |
|
liuxuejin
2011-04-14
可以啊!:我的测试机器:
AMD TK-57 内存是2G, 测试代码就不用贴出了,纯粹的继承!类中没有任何的东西,只有一个构造方法: 方法里面就是打印类名! |
|
RednaxelaFX
2011-04-14
liuxuejin 写道 可以啊!:我没有测试机器:
AMD TK-57 内存是2G, 测试代码就不用贴出了,纯粹的继承!类中没有任何的东西出了一个构造方法: 方法里面就是打印类名! 要的要的,请贴出测试代码。方便让大家测试、分析和理解你得出的结论实际上意味着什么。 |
|
qiang106
2011-04-14
影响肯定是有的,最简单明显的道,继承那么也就是你要求计算机帮你做了事,要不然怎么继承下来啊。不过这一块的影响几乎可以忽略,要说你业务中有几层继承相对JavaAPI或者你用的一些框架,那层数又是少得很了。
|
|
liuxuejin
2011-04-14
很模糊啊!楼上的
|
|
Anddy
2011-04-15
RednaxelaFX 写道 Anddy 写道 RednaxelaFX 写道 对一些JVM来说继承深度非常大(例如>=8)的时候主要受影响的是快速子类型检查的效率。也就是instanceof、强制类型转换和数组元素写入这几种情况最受影响。
虚方法调用之类的在现在的高性能JVM里不会受继承深度影响的。 有这方面的资料 提供么? 為什麼要子类型检查 !! 嗯,请参考这篇论文:Fast Subtype Checking in the HotSpot JVM,解释得很清楚。 这个 贵, 15$ !!! |