С Java VM, как обрабатываются ссылки на объекты - PullRequest
1 голос
/ 17 марта 2011

Во время выполнения приложения Java используются ли ссылки на объекты во время выполнения или они удаляются во время компиляции?

Полагаю, я могу декомпилировать файлы классов и посмотреть, как они используются в качестве локальных переменных и переменных-членов.

Является ли расточительным создание ссылки на объект, когда вам это не нужно, или компилятор удалит ненужные ссылки?

1007 * Е.Г. *

final String abc = "abc"; метод (ABC);

вместо:

метод ( "ABC");

Ответы [ 3 ]

1 голос
/ 17 марта 2011

Методы хранятся в области данных объекта (как указано в определении класса), но локальные ссылки на блоки хранятся в специальной области фрейма стека JVM. Когда кадр выскакивает из стека кадров исполняющего потока, все локальные ссылки блока теряются, поскольку они фактически не сохраняются в структурах данных объекта.

Обратите внимание, что если вы не знакомы с фреймами стека JVM, новый фрейм стека получается для входа в каждый метод и извлекается из стека потока при возврате из метода. Кадры стека содержат ряд элементов, включая указатель на текущую инструкцию (которая находится на страницах инструкций класса), указатель на объект «this» и небольшой стек для хранения промежуточных элементов в текущем вычислении метода. Иногда ссылка на переменную не требует никакой памяти, и многие оптимизирующие компиляторы скомпилируют код для использования локального стека вместо «хранилища ссылок на объект», что означает, что обращение кода приведет к тому, что человек не обнаружит вообще использовал переменную.

Указатель "this" всегда занимает первую запись в области хранения ссылок на объекты, и все эти концепции являются концептуальными. Реальная реализация должна соответствовать только операционному стандарту, не должна соответствовать определенной схеме памяти.

0 голосов
/ 17 марта 2011

В конкретном случае, который вы упоминаете, тот факт, что вы называете локальную переменную и называете ее «abc», по сути, удобен для вас как для программиста.Независимо от того, делаете ли вы это или просто оставляете его в качестве неназванного параметра, байт-код, по сути, в конечном итоге останется прежним.

В общем, вам не нужно беспокоиться об этом уровне детализации.Вы можете доверять компилятору байт-кода и JIT-компилятору, чтобы делать разумные вещи.Если бы вам пришлось переживать до такого уровня детализации, было бы практически невозможно написать какое-либо приложение средней сложности ...

[PS Если у вас есть время и интерес, я бы также порекомендовал вам сделатьдекомпилировать соответствующие классы так же, как учебное упражнение.Но то, что вы найдете, должно быть довольно обнадеживающим: компилятор делает вообще разумные вещи, и нет нужды быть параноиком.]

0 голосов
/ 17 марта 2011

На уровне байт-кода такие «ненужные» ссылки не будут удалены; Вы могли видеть вышеупомянутое назначение в байт-коде. Но JIT (то есть HotSpot), как правило, намного умнее, и поэтому влияние времени выполнения практически равно нулю.

...