2015-09-03 8 views
2

Быстрый ответ будет «без крика», конечно :).Как происходит процесс Java?

У меня действительно странная проблема с моим Java-приложением (J2SE 1.7) в системе Win7 32bits. Я столкнулся все случаи:

  • Иногда он выходит из памяти Java кучи (и таким образом я могу зарегистрировать ее и восстановить из этого)
  • Иногда аварии на родном и у меня есть файл hs_err_pidxxxx.log и я может проанализировать, что происходит.
  • Иногда это сбой в native, и у меня нет файла hs_err, но у меня есть функция popup java stop, и я вижу исключение в журнале событий Windows и даже отлаживаю с визуальной частью процесса.
  • Иногда это сбой, и у меня ничего нет (нет hs_err, нет всплывающих окон, ничего ...). Он просто заканчивается, как если бы был System.exit() или родной звонок exit().

Так что мой вопрос:

  • как я могу быть уверен, что это родной выход вызов, как я не весь код нативных библиотек я использую?
  • Возможно ли, чтобы это странное поведение произвело другое среднее?
  • Наконец, как отлаживать и отслеживать, какая из них может быть основной причиной?
+0

Является ли эта ошибка воспроизводимой? То есть, есть ли набор условий, которые, когда они присутствуют, всегда проявляют это поведение? –

+0

Не 100% воспроизводимый, но определенный путь в приложении приводит к такому «краху». Конечно, этот путь связан с родными библиотеками. Это не случайная ошибка, которая может произойти в любое время, но в конкретном пути она может «сбой» или нет. – TrapII

ответ

1

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

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

Возможно ли, чтобы это странное поведение было произведено другими средствами ?

Да, есть бесконечное количество странных других средств. Использование памяти или другого ресурса может быть одним из объяснений.

Наконец, как отлаживать и отслеживать, какая из них может быть основной причиной?

Регистрация, описанная выше, также должна найти это, если сообщения специфичны для какой библиотеки вызывается. Вы можете контролировать приложение в jconsole, чтобы узнать, использует ли он тонны памяти или потоков. Отключите все, что можно отключить, чтобы вы могли устранить его как часть проблемы. Если проблема исчезнет, ​​включите вещи в atime, пока проблема не вернется.

+0

Типичные ошибки на C/native могут иметь поздний эффект на несколько звонков позже и т. Д. Но согласитесь, лучше знать подозрительный вызов, который не знать. –

+0

Спасибо, очевидный и простой способ отладки. Я думаю, что я не думал об этом сам, потому что есть много естественных вызовов для обертывания, и я думал, что для этого существует «общий метод». – TrapII

1

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

Отладить его.

Возможно ли, что это странное поведение вызвано другим средним значением?

Трудно сказать ... Может быть, нарезание резьбы, может быть утечка памяти, ...

Наконец, как отлаживать и отслеживать, какие Lib может быть основной причиной?

Run Java с

-XX:+CreateMinidumpOnCrash 

и вы получите аварийного дампа, который можно анализировать. Или используйте

-XX:+UseOSErrorReporting 

, чтобы справиться с Windows, сбой (который будет показывать, например, сообщение прикрепить отладчик, в зависимости от того, что вы установили. Это, возможно, также показать «Отправить Microsoft» сообщения об ошибке.).

+0

Спасибо за параметры командной строки Java, о которых я не знал. – TrapII