¿Puede el compilador de Java hacer temprano vinculante para los métodos no estáticos?

Martin JH:

Vamos a decir que tengo la siguiente clase:

public class MyClass {
    public void doSomething() {
        System.out.println("doing something.");
    }
}

Vamos a suponer, además, que toda mi proyecto hace es llamar a ese .something()método. Sin eludir o cualquier otro divertido-negocio pasando.

MyClass myObj = new MyClass();
myObj.doSomething();

¿El javacaviso del compilador que esta llamada al método no está siendo anulado, y optimizar la unión a "principios de la unión"? Estoy pidiendo por curiosidad; en cualquier aplicación en el mundo real que lo haría de espolvorear por supuesto final, staticy privatetodo mi código.

Stephen C:

Un compilador de código de bytes (como javac) por lo general no hace enlace anticipado para las llamadas de métodos de instancias:

  1. El modelo de Java de compilación separada de los medios clases que este tipo de optimización sólo puede aplicarse cuando una clase está llamando a uno de sus métodos. (Si javachipotéticamente hizo a principios de unión entre las clases, cambiar y volver a compilar una clase podría conducir a la unión de ser incorrectos.)

  2. No hay una gran cantidad de valor, ya que el compilador JIT (o generador compilador AOT) es donde se realiza la mayor optimización.

El compilador JIT en una JVM moderna tiene una amplia optimización basada en el conjunto completo de clases que se han cargado (hasta ahora). Esto incluye la optimización de distancia método de despacho y inlining métodos llamadas. Por otra parte, el compilador JIT es lo suficientemente inteligente como para mantener un registro de optimizaciones clave, y volver a compilar cuando algo como la carga dinámica de una nueva clase invalida las optimizaciones anteriores.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=227120&siteId=1
Recomendado
Clasificación