多态
2023-11-20 16:38:37 1 举报
图解多态底层实现
作者其他创作
大纲/内容
填充
大对象大于伊甸园
A
栈帧
方法区
Eden
Klass Point类型指针
S1
C类有x实例变量
实例数据+对齐填充默认父类的实例变量在前,子类的在后;8字节对齐
部分收集Partial GC
t1
A.x=10
this
instanceKlass
B.y=20
...
t()
t1()
t2()
整堆收集
A类有x实例变量
对象头
t
大对象
虚拟机栈
对象内存布局(OOP结构)
OldGC/MajorGC (CMS)
可以
B类无x实例变量但父类A中有
MarkWord
指向B类t方法
指向C类t1方法
指向A类t2方法
Teunred
YoungGC
栈顶引用
YoungGC/MinorGC
分配空间
老年代能放存放
实例变量查找规则被调用方法所在类开始找,如果当前类有该实例则访问,如果不存在则找父类中是否存在,按照继承链向上查找。实例变量无多态,从方法所在类开始找。虚方法调用规则从this对应的实际类型开始找(与强制类型转换无关),如果当前类有此方法则调用,如果不存在则按照继承链向上查找父类中是否有。方法有多态,所有虚方法都要从this对应的类开始找。确保优先使用子类重写的方法。虚方法表1.虚方法表内容按照继承链自下向上的方式查找,优先使用子类中的方法(多态)2.缓存类所有的虚方法引用,提高性能3.所有对象的实际类型为当前类的都要从虚方法表中获取方法地址this
Mixed GC (G1)
Eden太小,频繁MinorGCSurvivor太小触发分配担保提前进入老年区
FullGC
class A { public int x = 10; public void t() { System.out.println(x); } public void t1() { System.out.println(x); } public void t2() { // 4 调用A类中的t2方法 System.out.println(x); // A类中有x变量 }}class B extends A { public int y = 20; public void t() { // 2 C类无t方法,父类B中有 // 方法所在类B中无x,但B的父类A中有,方法A中的x System.out.println(x); t1(); // this为C的实例,从C类开始找t1方法 }}class C extends B { public int x = 30; public void t1() { // 3 调用C中的t1方法 System.out.println(x); // 方法所在类C中有x变量 // this为C的实例,从C开始找t2方法,但C和父类B中均无 t2(); }}在main函数中调用t方法A a = new C();a.t(); // 1 实际类型为C,但C类中无t方法,父类B中有则调用
a
C
S0
C.x=30
t2
方法区逻辑上属于堆,具体有永久代和元空间实现
伊甸园能否存下
B
堆
0 条评论
下一页