2016-02-08 2 views
0
  1. Есть ли способ, чтобы получить уведомление о всех вызовах в конструктор класса String (либо непосредственно, либо с помощью отражения) без переплетения или инструментирование rt.jar?Уведомление любого струнного строительства объекта в Java 8 HotSpot VM

  2. Кроме того, возможно ли отфильтровать эти уведомления только для вызовов внутри определенного пакета?

  3. Далее возможно сделать эти уведомления асинхр (например, события), так что фактическая JVM вызовы не замедлили

Мой вариант использования для перехвата всех строк создается, сватать шаблон на контент и повышать изменения, основанные на некоторых правилах (все в backend) как часть некоторого компонента платформы.

Поскольку я не хочу использовать инструмент rt.jar, AspectJ, кажется, не может быть и речи (поскольку LTW не может быть выполнено в базовых классах Java). Потенциальный инструмент кажется JVM TI, но я не совсем уверен, как его достичь.

Спасибо, Хариш

+0

Почему нет приборов? Он предназначен именно для таких вещей, как вы хотите. API-интерфейс RetransformClasses' может сделать трюк перехвата. И да, это работает и для основных классов. – apangin

+0

Я знаю, что вы этого не хотите, но инструмент _rt.jar_ через двоичное плетение AspectJ - это не ракетостроение.Я сделал это однажды, просто для удовольствия. – kriegaex

+0

@apangin попробует RetransformClasses. Подумал, существует ли асинхронный способ получения событий, чтобы выполнение основного кода не выполнялось во время выделения объекта. – Harish

ответ

1

Есть ли способ, чтобы получить уведомление о всех вызовах в конструктор класса String (либо непосредственно, либо с помощью отражения) без ткачества или инструментирование rt.jar во время компиляции?

Вы не компилируете класс String, поэтому вы можете выполнять только переплетение во время выполнения. И да, это единственный способ без создания настраиваемой JVM.

Кроме того, возможно ли отфильтровать эти уведомления только для вызовов внутри определенного пакета?

можно проверить абонента с Reflection.getCallerClass (п)

Далее возможно сделать эти уведомления асинхр (например, события), так что фактические JVM вызовы не замедлили

Все это очень дорого, так как передается работа в другую нить.

сватают узор на содержание

соответствие шаблону является очень дорогим по сравнению с созданием String. Если вы не будете осторожны, вы замедлите свое приложение на порядок или два. Я предлагаю вам пересмотреть свои настоящие требования и посмотреть, есть ли другой способ сделать то, что вы пытаетесь сделать.

Вы действительно не хотите использовать профилировщик для этого. Примечание: даже профилирующие устройства обычно только подвыборки, например. каждые 10-е распределение. Существует множество бесплатных, на самом деле два идут с JVM. Я предлагаю использовать Flight Recorder для отслеживания распределения, поскольку у этого есть очень низкие накладные расходы.

+0

Как насчет использования таких инструментов, как jvmti? Также можно усовершенствовать вопрос о том, как реализовать № 1 вопрос – Harish

+0

@Harish Я не использую jvmti, но я не считаю, что вы можете использовать это для отслеживания размещения объектов без ввода кода. –