Исключение Java против исключений C ++ - PullRequest
9 голосов
/ 08 мая 2009

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

Ответы [ 6 ]

7 голосов
/ 08 мая 2009

Я бы предположил, что память для исключений выделяется так же, как и для всех других объектов (в куче).

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

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

Не может быть двух исключений, генерируемых одновременно (в одном потоке). Они могут быть вложенными, но тогда у вас есть только одно «активное» исключение со ссылкой на вложенное исключение.

Когда все ссылки на исключение исчезают (например, после завершения обработчика исключения), исключение собирается как мусор, как и все остальное.

4 голосов
/ 08 мая 2009

Для C ++ не определено, где хранить исключения, но большинство компиляторов используют специальный стек. Для Java, как кто-то писал ранее, они хранятся в куче.

Поскольку исключения являются объектами в C ++, а также в Java, они выделяются и освобождаются как объекты на определенном языке.

Всегда существует только одно активное исключение для потока на обоих языках.

2 голосов
/ 08 мая 2009

Для получения наиболее полной информации об исключениях мы можем обратиться непосредственно к источнику: Глава 11: Исключения из Спецификация языка Java, второе издание .

Исключения действительно являются объектами. Это подкласс Throwable:

Каждое исключение представлено экземпляр класса Throwable или один его подклассов; такой объект может использоваться для передачи информации от точка, в которой происходит исключение обработчик, который его ловит.

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

С точки зрения наличия нескольких Exception объектов, это, вероятно, не имело бы место, поскольку после возникновения исключения виртуальная машина Java начнет находить обработчик исключения.

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

Для получения дополнительной информации о том, как обрабатывать исключения во время выполнения, Раздел 11.3 Обработка исключения содержит подробности.

1 голос
/ 08 мая 2009

В Java Exception расширяет Throwable, который расширяет Object. то есть с точки зрения памяти это объект, как и любой другой.

В Java 7 было предложено размещать локальные переменные в стеке с помощью escape-анализа для поиска кандидатов на переменные стека. Однако исключения обычно вызываются из метода к вызывающей стороне (или к вызывающей стороне и т. Д.), Поэтому было бы не очень полезно помещать исключительную ситуацию в стек.

1 голос
/ 08 мая 2009

Где хранятся исключения? Стек, Heap. Как распределяется память и освобождены для исключений?

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

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

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

1 голос
/ 08 мая 2009

Исключениями в Java являются объекты, и поэтому они хранятся в куче.

Когда выдается исключение, JVM ищет в коде соответствующий обработчик исключения. Это применимо, даже если есть несколько исключений, которые может что-то выдать.

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