2009-11-05 4 views
0

Если поток устанавливает выключения крючка с помощьюджна вызова kernel32.CreateToolhelp32Snapshot в крюке отключения аварий ВМ

Runtime.getRuntime().addShutdownHook(); 

вызовов через ЮНУ метода:

kernel32.CreateToolhelp32Snapshot (0x00000002, 0) 

он выходит из строя ВМ. Если я называю тот же метод в

WindowListener.windowClosing() 

крючок, вызов не падает ВМ.

Любая идея, почему?

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

редактировать: см VM crash report on pastebin

ответ

0

Публикация отчета аварии VM должно помочь.

0

Почтовая часть отчета о сбое на пастебине или тому подобное, может быть, некоторые могут получить информацию об этом.

Ну, я не знаю точно, но если вы читали Java документ для addShutdownHook()

Shutdown крючков работают в сложное время в жизненном цикле виртуальной машины и поэтому должны быть закодированы оборонительно. Они должны быть указаны в , и должны быть написаны как потокобезопасными и избегать взаимоблокировок насколько это возможно. Они также должны не полагаться слепо на услуги, что , возможно, зарегистрировали свое собственное выключение крючки и, следовательно, могут сами в процесс выключения. .... Завершающие крюки также должны заканчивать их работы быстро. ...

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