質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

5111閲覧

Promiseのメモリーリークについて

退会済みユーザー

退会済みユーザー

総合スコア0

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/07/06 23:03

こちらより

Node.js における Promise の位置付けという説明で

現在の仕様で Promies を使ったとして、例外をキャッチしなかった際に容易にメモリリークやファイルディスクリプタのリークが起きることは想像しやすく、やはりNodeコアの中でも簡単にリークが作り込めてしまうような状況にするべきではない、リークが気づきにくくなる位なら異常終了した方がマシ

このような記載があります。

例外をキャッチしなかった際にメモリーリークが発生するパターンは例えばどのようなものがあるのでしょうか?

ファイルディスクリプタのリークは、file.closeし忘れだと思いますが
メモリーリークするパターンが想像できません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md

をみると後続then/catchチェーンが処理されるまではPromiseの状態はpendingとあり、例えば途中で例外が発生したとすると、catchされる以前にはcatchへ引き渡すためのエラー情報を保持しているはずです。またthenチェーンではopen状態のリソース(例えばDBへのコネクションやI/O中のファイルディスクリプターなど)を継続して参照するということをよく行うでしょうから、そのようなリソースの後始末はthen or catchがチェーンされるまでは「だれもやってくれる人がいない」はずです。

catchを呼び忘れてしまったという状況を考えると、使用中のリソースは多分クローズされないままになっているはずですし、Promiseの内部にエラー情報が保持されたままになるでしょう。pending状態のPromiseがPromiseのランタイム機構の中で参照が保持されていないと仮定すると、ユーザープログラムの中でどこからも参照されていなければいずれはGCで回収されると思います。しかし、その場合でも開放できるのはPromise内部に保持されていたエラー情報だけのはずであり、リソースのクローズはいつまでたっても行う機会がないはずです。

・・・といったようなことを言っているのではないかと思いました。

投稿2017/07/06 23:53

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/07 11:31

ご回答ありがとうございます。 おかげさまで理解できました。 ありがとうございます。
guest

0

ベストアンサー

この話を知るためには過去のNode.jsがハンドリングされない例外をどう扱ってきたかという話を知っておく必要があります。
uncaughtException で検索すると幾つか記事が出てくるかと思います。手前味噌ですが、自分のブログにも言及があります。

http://yosuke-furukawa.hatenablog.com/entry/2016/07/12/103734

この記事は長いのでまとめると、

『結局今までのNode.jsでは意図しない例外が出た時にプロセスが落ちていたが、Promiseでは落ちなくなった』

というのが前提になっています。

このため、今までは意図しない例外が発生したらプロセスが落ちてリークが起きてなかった(隠れてた)のに、 Promise化する事によってその問題が顕在化される恐れがある、というのが僕が書いた「リーク」の意図です。

もちろんちゃんと書けばリークの影響も少なくできるとは思います。

投稿2017/07/07 06:21

yosuke_furukawa

総合スコア390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/07 11:31

ご回答ありがとうございます。 そういう経緯があってのお話だったのですね。 おかげさまで理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問