Не удается включить датчики DTrace через jinfo в Mac OS X
Запуск Java 6 на Snow Leopard.
Вы должны иметь возможность включать ExtendedDTraceProbes в работающий процесс Java с помощью утилиты jinfo. Даже в моей командной строке jinfo говорит о включении общих флагов:
Usage:
jinfo [option] <pid>
(to connect to running process)
...
where <option> is one of:
-flag [+|-]<name> to enable or disable the named VM flag
И, насколько я знаю, флаги DTrace не имеют какого-либо особого значения, имеет значение только их наличие или отсутствие.
Но когда я пытаюсь сделать это, я получаю одну из двух ошибок, в зависимости от того, буду ли я предваряю это sudo или нет.
Предполагая, что:
JPS
1234 StayRunning
...
Тот же пользователь, что и процесс StayRunning:
jinfo -flag + ExtendedDTraceProbes 1234
Exception in thread "main" java.io.IOException: Command failed in target VM
at sun.tools.attach.MacosxVirtualMachine.execute(MacosxVirtualMachine.java:200)
at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:195)
at sun.tools.attach.HotSpotVirtualMachine.setFlag(HotSpotVirtualMachine.java:172)
at sun.tools.jinfo.JInfo.flag(JInfo.java:111)
at sun.tools.jinfo.JInfo.main(JInfo.java:58)
Попытка от имени root:
sudo jinfo -flag + ExtendedDTraceProbes 1234
Password: (which I enter)
1234: Unable to open socket file: target process not responding or HotSpot VM not loaded
Ошибка находится на второй строке, и, конечно, процесс все еще работает.
Как ни странно, эта страница не показывает опцию "+" для OS X, но мой собственный компьютер распечатывает сообщение об использовании.
Вот мой простой код. Это не так с Eclipse.
StayRunning.java
class StayRunning {
public static void main( String [] args ) throws Exception {
long counter = 0L;
while( true ) {
Thread.sleep( 1000 );
counter++;
System.out.println( "tick "+counter );
}
}
}
1 ответ
Вы правы в том, что этот зонд может быть либо "установлен", либо "не установлен" (т. Е. С ним не связано никакое конкретное "значение").
Это почти наверняка (давняя) ошибка в JVM Hotspot, и она не уникальна для OSX. Вот отчет от кого-то, кто не может установить флаги VM через jinfo в Windows:
http://www.herongyang.com/Java-Tools/jstack-jinfo-Change-HotSpot-VM-Option.html
Я могу лично убедиться, что не могу установить ExtendedDTraceProbes и (для науки!) Несколько других флагов динамически через jinfo в Linux. Фактически, после нескольких попыток я не смог найти флаг, который мог бы установить динамически.
Я столкнулся с соответствующей ошибкой в Sun / Oracle:
http://bugs.sun.com/view_bug.do;jsessionid=24c1d7e1b0cda2ffffffff97aef6bbd818cf2?bug_id=6445836
Что самое интересное, в разделе "Оценка": "jinfo -flag - это временное решение для динамического включения зондов DTrace. Как сказала Мэнди, это должно исчезнуть".
Основываясь на этом, а также на моем прошлом опыте документирования Hotspot, который сильно устарел и / или неточен, я подозреваю, что, несмотря на документацию / man-страницу для jinfo, а также документацию для самих зондов (http: //download.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html) указывающий в противном случае, что некоторые детали реализации в Hotspot были изменены, чтобы сделать динамическую настройку этого флага либо невозможной, либо настолько непрактичной, что был отключен. Другими словами, это ошибка, которая не будет исправлена.