2016-03-07 15 views
2

Вот какой-то вопрос о область кэша в JVM: (для точки доступа Java8)JVM - О код города кэш

  • ли все машинный код, который Jvm может запустить храниться в этой области, или здесь хранится только один горячий код?
  • Из какой-то книги он говорит, что клиентский компилятор (C1) с большей вероятностью исчерпает память в области кеша, а серверный компилятор (C2) этого не делает. Я немного смущен этим. Это потому, что компилятор сервера только компилирует горячую часть и прерывает другую часть? В таком случае, должен ли компилятор сервера быть медленным?
  • Сколько раз код запускается до C1 & C2 будет компилировать & кэшировать их соответственно?
+1

Кстати, если вы заинтересованы в производительности, [эта книга] (http://shop.oreilly.com/product/0636920028499.do) дает хороший обзор многих аспектов этого. – biziclop

+0

@biziclop Хорошее предложение, спасибо. –

ответ

2

Обратите внимание, что ответ на этот вопрос может варьироваться в зависимости от реализации:

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

кэш коды почти всегда будет использоваться для кэширования горячих метод (или методы, которые были когда-то считались горячая С1 + С2 (многоуровневого сборником)

Из какой книги это говорит, что клиентский компилятор (C1) с большей вероятностью исчерпает памяти в области кеша, тогда как серверный компилятор (C2) этого не делает. Я - , немного запутавшийся в этом. Это потому, что только компилятор сервера компилирует горячую часть , а также прервать другую часть? В этом случае не должен быть медленным компилятором сервера?

C1 компилятор компилирует все. C2 ждет, пока не найдет некоторые оптимизации, которые могут быть применены, а затем применяет эти оптимизации и компилирует методы (не всегда верно, но в основном).

Обратите внимание, что C1 может скомпилировать один и тот же метод несколько раз.

Сколько раз код выполняется до C1 & C2 будет компилировать их соответственно?

Метод может быть скомпилирован, даже если он вызывается только один раз, если C1/C2 обнаруживают, что требуется много времени для запуска.

Вы можете использовать JITWatch для просмотра C1 и C2 в действии.

+0

Thx, но ответ на первый вопрос немного размыт для меня, я в основном фокусируюсь на hotspot java8, могу ли я сделать его более понятной базой. –

+2

'Метод может быть скомпилирован, даже если он вызывается только один раз, если C1/C2 узнают, что требуется много времени для запуска.'Не напрямую, но для каждого цикла есть счетчик ветвления, который сообщает Hotspot, сколько итераций цикл сделал. Если этот счетчик достигает порога, сам цикл компилируется, даже если сам метод все еще запущен. – biziclop

+0

@biziclop О первом вопросе, при использовании c1, если метод работает только один раз, и это очень быстро для jvm, метод все равно будет скомпилирован, правильно? И будет ли он кэшироваться в области кеша кода? –