Что такое определение во время работы виртуальной машины Java?

Из глава 6.3 JVMS:

[...] любой из VirtualMachineError подклассов, определенных ниже [InternalError, OutOfMemoryError, StackOverflowError, UnknownError], может быть вызван в любое время во время работы виртуальной машины Java

Как JVMS определяет фразу «в любое время во время работы виртуальной машины Java»?

Как современные JVM интерпретируют эту фразу?

В частности, означает ли это, что четыре ошибки, java.lang.InternalError, java.lang.OutOfMemoryError, java.lang.StackOverflowError и java.lang.UnknownError, могут быть переброшены между утверждениями? :

// ....
A(); B(); C();
try {
     // nothing
} catch (InternalError | OutOfMemoryError | StackOverflowError | UnknownError e) {
     // may occur?
}
D(); E(); F();
try {
     ; // semi-colon
} catch (InternalError | OutOfMemoryError | StackOverflowError | UnknownError e) {
     // may occur?
}
G(); H(); I();
try {
     ; ; ;;  ;;;;; ; ; ;;; ;; ;; ;; ;; ; ;; ; ;; // ... semi-colons
} catch (InternalError | OutOfMemoryError | StackOverflowError | UnknownError e) {
     // may occur?
}
J(); K(); L();
// ....

person Pacerier    schedule 28.12.2014    source источник
comment
это немного слишком много связанного, чтобы быть размещенным в те же самые 5 минут, на мой взгляд.   -  person Maarten Bodewes    schedule 28.12.2014
comment
@MaartenBodewes-owlstead, не ведитесь на длину. Это заняло несколько часов. Но я представил их вместе, потому что они ссылаются друг на друга. Я не мог ни на что ссылаться.   -  person Pacerier    schedule 28.12.2014
comment
Хорошо, это достаточно справедливо, но, возможно, в следующий раз оставьте немного места, это, вероятно, вызовет всевозможные тревоги :)   -  person Maarten Bodewes    schedule 28.12.2014
comment
Виртуальная машина Java — это сложное программное обеспечение. В сложном программном обеспечении непредвиденная ситуация может произойти в любой момент из-за ошибок в программном обеспечении (или аппаратного сбоя). Например, см. вызов ShouldNotReachHere() в исходных кодах OpenJDK (hg.openjdk.java.net). распространяться по всей виртуальной машине (менеджер памяти, интерпретатор байт-кода). Google: site:openjdk.java.net ShouldNotReachHere даст вам подсказку. В чем суть вашего вопроса? Вы хотите обвинить виртуальные машины Java в том, что они не дают волшебных гарантий, или хотите решить какую-то конкретную практическую задачу?   -  person xmojmr    schedule 28.12.2014
comment
@xmojmr, перед лицом ошибок все ставки сняты. Этот вопрос касается спецификации JVM и действительных соответствующих реакций JVM на ограничения ресурсов и тому подобное.   -  person Pacerier    schedule 28.12.2014


Ответы (1)


Виртуальная машина Java состоит из многих частей. Например, сборщик мусора работает в постоянном фоновом режиме Thread. Он может выдать один из этих Exception, и это, безусловно, может произойти в любое время (особенно если ваш собственный код остановлен из-за gc)!

Из Основы сборки мусора Java

Что такое автоматическая сборка мусора?

Автоматическая сборка мусора — это процесс просмотра памяти кучи, определения того, какие объекты используются, а какие нет, и удаления неиспользуемых объектов. Используемый объект или объект, на который ссылаются, означает, что некоторая часть вашей программы все еще поддерживает указатель на этот объект. На неиспользуемый объект или объект, на который нет ссылки, больше не ссылается ни одна часть вашей программы. Таким образом, память, используемая объектом, на который нет ссылки, может быть восстановлена.

тл;др

Да. Их можно кидать между утверждениями.

person Elliott Frisch    schedule 28.12.2014
comment
Хм, ошибки GC 43773247">не ограничивается потоками GC? - person Pacerier; 28.12.2014
comment
Может быть OutOfMemoryError, и вашей следующей инструкцией может быть выделение памяти; инструкции могут быть переупорядочены. Бум, вы получаете ошибку GC в обоих потоках. - person Elliott Frisch; 28.12.2014