[讨论] 谁来说说java继承层次太多对于虚拟机性能有什么影响?

all_wmh 2011-04-10
在做银行的XXX保理系统,看到WEB层的继承结构达到了8层,ACTION的生命周期是request级别,每次请求都会new xxxAction(),其中的doInit()方法每个层次都有。是不是new一个action的实例出来都会产生8个xxxAction的实例。还有各位能否提供下一些信息用来说明多层次的继承的弊利。
IcyFenix 2011-04-10
all_wmh 写道
在做银行的XXX保理系统,看到WEB层的继承结构达到了8层,ACTION的生命周期是request级别,每次请求都会new xxxAction(),其中的doInit()方法每个层次都有。是不是new一个action的实例出来都会产生8个xxxAction的实例。还有各位能否提供下一些信息用来说明多层次的继承的弊利。


无需担心,继承关系有8层甚至有80层,在方法调用的角度上讲没有什么不同,最多在一些优化措施上会比较累。我个人观点是继承多少层不应该考虑虚拟机执行这方面的因素,你业务逻辑的表达需要怎样的继承关系那就怎样写。

如果LZ就是想知道执行方面的信息,那就你那个action的例子来讲,首先肯定是不会产生8个action的实例的= =#;在方法执行的内容上,如果doInit()方法的代码中没有明确的写super.doInit(),那方法执行和父类的代码就没有关系,不会自动调用父类的代码去执行;在方法调用过程上,如果doInit()内联了那没啥好说的,如果没有内联,也不需要从继承关系中搜索doInit(),查虚方法表就可以直接定位到你action实际类型的那个doInit()版本。所以LZ不需要担心啦……PS其实8层也不算太多
all_wmh 2011-04-10
恩,看来是我没深入理解JVM的机制。多谢ICY的回答。
RednaxelaFX 2011-04-10
对一些JVM来说继承深度非常大(例如>=8)的时候主要受影响的是快速子类型检查的效率。也就是instanceof、强制类型转换和数组元素写入这几种情况最受影响。
虚方法调用之类的在现在的高性能JVM里不会受继承深度影响的。
mathgl 2011-04-11
超过8层? 我现在大多数用到三层就不错了...
mercyblitz 2011-04-11
对JVM影响不大,不过对人的影响很大!
william_ai 2011-04-11
JVM规范里4.1里,对ClassFile的介绍。
引用
4.1 The ClassFile Structure
A class file consists of a single ClassFile structure
ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;//这里
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
    }
......
super_class
For a class, the value of the super_class item either must be zero or must be a valid index into the constant_pool table. If the value of the super_class item is nonzero, the constant_pool entry at that index must be a CONSTANT_Class_info (§4.4.1) structure representing the direct superclass of the class defined by this class file. Neither the direct superclass nor any of its superclasses may be a final class.
If the value of the super_class item is zero, then this class file must represent the class Object, the only class or interface without a direct superclass.

For an interface, the value of the super_class item must always be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Class_info structure representing the class Object.
mercyblitz 2011-04-11
william_ai 写道
JVM规范里4.1里,对ClassFile的介绍。
引用
4.1 The ClassFile Structure
A class file consists of a single ClassFile structure
ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;//这里
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
    }
......
super_class
For a class, the value of the super_class item either must be zero or must be a valid index into the constant_pool table. If the value of the super_class item is nonzero, the constant_pool entry at that index must be a CONSTANT_Class_info (§4.4.1) structure representing the direct superclass of the class defined by this class file. Neither the direct superclass nor any of its superclasses may be a final class.
If the value of the super_class item is zero, then this class file must represent the class Object, the only class or interface without a direct superclass.

For an interface, the value of the super_class item must always be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Class_info structure representing the class Object.



super_class相当于链表结构,10000次递归还是很快的!
qianhd 2011-04-12
需要加载更加多的类
有可能造成Perm区溢出
mercyblitz 2011-04-12
qianhd 写道
需要加载更加多的类
有可能造成Perm区溢出


这不是问题的关键~
Global site tag (gtag.js) - Google Analytics