Los campos de instancia (incluidos los campos de respaldo de propiedad) obtienen N-copias para N-objetos.
Los campos estáticos obtienen una sola copia por clase.
Los métodos son bloques de bytecode (o después de JIT, bloques de instrucciones nativas) que forman parte del programa "imagen" o segmento de código ejecutable. Los métodos ya son parte de la imagen del programa, ya que se encuentra en el disco. Una vez que el sistema operativo (o CLR) carga la imagen, hay una única copia compartida del código del método.
No son parte de la asignación de "montón" o tiempo de ejecución en general, excepto en los casos en que puede utilizar el compilador hospedable para compilar nuevos métodos sobre la marcha. Los métodos no se "asignan" como objetos y no se "asignan" en relación con la creación del objeto. Simplemente existen como parte del programa antes de que un solo objeto sea instanciado. Incluso las lambdas / delegados no se asignan sobre la marcha. El compilador crea clases a pedido para implementar estos otros objetos de código aparentemente dinámicos, y también existen como parte de la imagen de código de bytes en el disco.
ACTUALIZACIONES por comentarios:
El estándar JVM tiene esto que decir:
2.5.4. Área de método
Java Virtual Machine tiene un área de método que se comparte entre todos los subprocesos de Java Virtual Machine. El área del método es análoga al área de almacenamiento para el código compilado de un lenguaje convencional o análogo al segmento de "texto" en un proceso del sistema operativo. Almacena estructuras por clase, como el grupo constante de tiempo de ejecución, los datos de campo y método, y el código para métodos y constructores, incluidos los métodos especiales (§2.9) utilizados en la inicialización de clase e instancia y la inicialización de interfaz.
El área de método se crea al iniciar la máquina virtual. Aunque el área del método es lógicamente parte del montón, las implementaciones simples pueden elegir no recolectar basura ni compactarla. Esta versión de la especificación de Java Virtual Machine no exige la ubicación del área de método o las políticas utilizadas para administrar el código compilado. El área del método puede ser de un tamaño fijo o puede expandirse según lo requiera el cálculo y puede contraerse si un área del método más grande se vuelve innecesaria. La memoria para el área de método no necesita ser contigua.
Por lo tanto, está claro que (1) sí, la especificación no dicta cómo se hace, pero (2) es análoga al área de almacenamiento para el código compilado de un lenguaje convencional, es decir. El segmento de texto. Este es el punto que estoy haciendo.