タグ付けされた質問 「stackoverflow」

2
JavaでStackOverflowErrorをキャッチしても大丈夫ですか?
以前はそうではないと思っていましたが、昨日はそうしなければなりませんでした。Akka(JVMのアクターシステム実装)を使用して非同期ジョブを処理するアプリケーションです。アクターの1人がPDF操作を実行しますが、ライブラリーにはバグがあるため、たまに死にStackOverflowErrorます。 2番目の側面は、JVMの致命的なエラー(StackOverflowErrorなど)がキャッチされた場合、Akkaがアクターシステム全体をシャットダウンするように構成されていることです。 3番目の側面は、このアクターシステムがWebアプリ内に埋め込まれている(WTFのような、レガシー、理由のため)ため、アクターシステムがシャットダウンされても、Webアプリはそうではありません。最終的な効果はStackOverflowError、ジョブ処理アプリケーションで空のWebアプリになることです。 迅速な修正として、StackOverflowErrorアクターシステムのスレッドプールが破棄されないように、スローされているものをキャッチする必要がありました。これは、特にこのようなコンテキストでそのようなエラーをキャッチしてもいいかもしれないと思うようになりましたか?任意のタスクを処理するスレッドプールがある場合 とは異なり、アプリケーションが一貫性のない状態のままOutOfMemoryErrorになることを想像することはできませんStackOverflowError。スタックはこのようなエラーの後にクリアされるため、計算は正常に続行できます。しかし、おそらく重要なものが欠けています。 また、最初にエラーを修正するのはすべてです(実際、数日前にこのアプリでSOEを修正済みです)ある種の状況が発生する可能性があります。 をキャッチするのStackOverflowErrorではなく、JVMプロセスを再起動して、そのジョブを失敗としてマークし、ビジネスを続行する方がよいのはなぜですか? 国営企業を捕まえない理由はありますか?「ベストプラクティス」を除きます。これは、何も言えないあいまいな用語です。

1
Haskell製品コードでseqはどのくらいの頻度で使用されますか?
Haskellで小さなツールを作成した経験があり、特にinteract標準入力を処理して標準出力にパイプするフィルター(を使用)を作成するために、非常に直感的に使用できます。 最近、通常の約10倍のサイズのファイルでこのようなフィルターを使用しようとしましたが、Stack space overflowエラーが発生しました。 いくつか読んだ後(こことここなど)、スタックスペースを節約するための2つのガイドラインを特定しました(経験のあるHaskellers、正しくないものを書いたら修正してください): 末尾再帰ではない再帰関数呼び出しは避けてください(これは末尾呼び出しの最適化をサポートするすべての関数型言語で有効です)。 seq式が縮小される前に大きくなりすぎないように、部分式の早期評価を強制的に導入します(これはHaskell、または少なくとも遅延評価を使用する言語に固有です)。 seqコードに5回または6回の呼び出しを導入した後、ツールは再びスムーズに実行されます(より大きなデータでも)。ただし、元のコードはもう少し読みやすいと思います。 私は経験豊富なHaskellプログラマーではないのでseq、この方法で紹介するのが一般的なプラクティスであるかどうか、またseqHaskellの製品コードで通常どのくらいの頻度で表示されるかを尋ねたいと思いました。または、seqあまり頻繁に使用することを避けながら、スタック領域をほとんど使用しないテクニックはありますか?

4
スタックの使用量は多すぎますか?
最近、CやC ++を書いているときに、Javaの場合とは異なり、それがオプションであるという理由だけで、すべての変数をスタック上で宣言します。 しかし、スタック上で大きなものを宣言するのは悪い考えだと聞いたことがあります。 なぜこれが当てはまるのですか?スタックオーバーフローが関係していると思いますが、なぜ発生するのかはあまりわかりません。 スタック上のものはどれくらい多すぎますか? スタックに100MBのファイルを配置しようとはしていません。文字列バッファーなどとして使用するために、数十キロバイトの配列を配置しようとしています。これはスタックの使用量が多すぎませんか? (重複する場合は申し訳ありませんが、スタックの検索はスタックオーバーフローへの参照を提供し続けます。呼び出しスタックタグさえありません。抽象タグを使用しました。)

3
ネストされた関数呼び出しが多すぎますか?
StackOverflowExceptionについてMSDNから引用: ネストされたメソッド呼び出しが多すぎるために実行スタックがオーバーフローしたときにスローされる例外。 Too manyここはかなりあいまいです。多すぎると本当に多すぎることをどのようにして知ることができますか?何千もの関数呼び出し?何百万人?私はそれが何らかの形でコンピュータのメモリの量に関係しているに違いないと思いますが、大体正確な大きさのオーダーを考え出すことは可能ですか? 再帰構造と再帰関数呼び出しを多用するプロジェクトを開発しているので、これが心配です。ほんの小さなテスト以上に使用し始めたときに、アプリケーションが失敗するのは望ましくありません。

4
TCOがない場合、スタックを爆破することを心配する場合
JVMを対象とする新しいプログラミング言語についての議論があるたびに、必然的に次のようなことを言っている人々がいます。 「JVMはテールコールの最適化をサポートしていないため、大量のスタックの爆発を予測しています」 そのテーマには何千ものバリエーションがあります。 今では、Clojureなどの一部の言語には、使用できる特別な再帰構造があります。 私が理解していないのは、テールコール最適化の欠如がどれほど深刻なのかということです。いつ心配する必要がありますか? 私の混乱の主な原因は、おそらくJavaがこれまでで最も成功した言語の1つであり、JVM言語のかなりの数がかなりうまくいっているように思われるという事実からでしょう。TCOの欠如が本当にあるならばどのようにそれが可能である任意の懸念?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.