private static class CustObj
{
public void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj is very good!");
}
}
}
private static class CustObj2 extends CustObj
{
public final void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj2 is very good!");
}
}
}
我们定义了两个类,CustObj是父类CustObj2是子类。然后我们通一个方法来调用他们:
public static void doWithVMethod(CustObj obj)
{
obj.methodCall();
}
public class TestVirtualCall {
public static void main(String[] args) throws InterruptedException {
CustObj obj = new CustObj();
for (int i = 0; i < 10000; i++)
{
doWithVMethod(obj);
}
Thread.sleep(1000);
}
public static void doWithVMethod(CustObj obj)
{
obj.methodCall();
}
private static class CustObj
{
public void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj is very good!");
}
}
}
}
public class TestVirtualCall2 {
public static void main(String[] args) throws InterruptedException {
CustObj obj = new CustObj();
CustObj2 obj2 = new CustObj2();
for (int i = 0; i < 10000; i++)
{
doWithVMethod(obj);
doWithVMethod(obj2);
}
Thread.sleep(1000);
}
public static void doWithVMethod(CustObj obj)
{
obj.methodCall();
}
private static class CustObj
{
public void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj is very good!");
}
}
}
private static class CustObj2 extends CustObj
{
public final void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj2 is very good!");
}
}
}
}
上面的例子中我们定义了两个类CustObj和CustObj2。
再次运行看下结果,同样的,我们还是禁用inline。
大家可以看到结果中,首先对两个对象做了cmp,然后出现了两个优化过的virtual call。
这里比较的作用就是找到两个实例对象中的方法地址,从而进行优化。
那么问题来了,两个对象可以优化,三个对象,四个对象呢?
我们选择三个对象来进行分析:
public class TestVirtualCall4 {
public static void main(String[] args) throws InterruptedException {
CustObj obj = new CustObj();
CustObj2 obj2 = new CustObj2();
CustObj3 obj3 = new CustObj3();
for (int i = 0; i < 10000; i++)
{
doWithVMethod(obj);
doWithVMethod(obj2);
doWithVMethod(obj3);
}
Thread.sleep(1000);
}
public static void doWithVMethod(CustObj obj)
{
obj.methodCall();
}
private static class CustObj
{
public void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj is very good!");
}
}
}
private static class CustObj2 extends CustObj
{
public final void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj2 is very good!");
}
}
}
private static class CustObj3 extends CustObj
{
public final void methodCall()
{
if(System.currentTimeMillis()== 0){
System.out.println("CustObj3 is very good!");
}
}
}
}