2011-03-17 4 views
1

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

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

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

E.g.

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

в противоположность:

метод ("ABC");

ответ

1

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

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

«Этот» указатель всегда занимает первую позицию в области хранения опорных объектов, и все эти понятия концептуальны. Фактическая реализация должна соответствовать только операционному стандарту, она не должна соответствовать определенной макете памяти.

0

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

0

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

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

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