Поля экземпляра (включая поля поддержки свойств) получают N-копии для N-объектов.
Статические поля получают одну копию для каждого класса.
Методы - это блоки байт-кода (или после JIT, блоки нативных инструкций), которые являются частью «образа» программы или сегмента исполняемого кода. Методы уже являются частью образа программы, поскольку она находится на диске. Как только изображение загружено ОС (или CLR), существует одна общая копия кода метода.
Они не являются частью "кучи" или выделения времени выполнения в целом, за исключением случаев, когда вы можете использовать размещаемый компилятор для компиляции новых методов на лету. Методы не «распределяются» как объекты и не «распределяются» относительно создания объекта. Они просто существуют как часть программы, прежде чем когда-либо будет создан единственный объект. Даже лямбды / делегаты не распределяются на лету. Компилятор создает классы по требованию для реализации этих других, казалось бы, динамических объектов кода, и они также существуют как часть образа байт-кода на диске.
ОБНОВЛЕНИЯ за комментарии:
Стандарт JVM имеет следующее:
2.5.4. Область метода
Виртуальная машина Java имеет область методов, которая является общей для всех потоков виртуальной машины Java. Область метода аналогична области хранения скомпилированного кода на традиционном языке или аналогична «текстовому» сегменту в процессе операционной системы. Он хранит структуры для каждого класса, такие как пул констант времени выполнения, данные полей и методов, а также код для методов и конструкторов, включая специальные методы (§2.9), используемые при инициализации классов и экземпляров и инициализации интерфейса.
Область метода создается при запуске виртуальной машины. Хотя область метода является логически частью кучи, простые реализации могут не собирать и не собирать мусор. Эта версия спецификации виртуальной машины Java не требует расположения области метода или политик, используемых для управления скомпилированным кодом. Область метода может иметь фиксированный размер или может быть расширена в соответствии с требованиями вычислений и может быть сокращена, если большая область метода становится ненужной. Память для области метода не должна быть смежной.
Таким образом, ясно, что (1) да, спецификация не диктует, как это делается, но (2) она аналогична области хранения для скомпилированного кода обычного языка, т.е. текстовый сегмент. Это точка, которую я делаю.