JavaScriptでメモリの状態を取得できなかった

目次
  1. やりたかったこと
  2. 結論
  3. 断念までの道のり
  4. 手段① process.memoryUsage()
  5. 手段② performance.memory
  6. あとがき

こんばんは! 今回は、Webアプリの謎のフリーズの原因を探るべくメモリの使用状況のログを取ろうといろいろと調べていたのですがJavaScriptだとなかなか辛かったという話です。

やりたかったこと

  • SwiftでWkWebViewを生成
  • WkWebViewでレンダリングするAngularアプリ側からメモリの使用状況をconsole.log()させたい

結論

  • WkWebViewにメモリを取得する実装がないため無理でした🤣
  • Swiftからなら端末のメモリを取得することは可能

断念までの道のり

手段① process.memoryUsage()

https://nodejs.org/api/process.html#process_process_memoryusage

ヒープサイズを取得するメソッドです。 Node.jsのドキュメントからの引用ですが、下記のような値を取得できます。

console.log(process.memoryUsage());
// Prints:
// {
//  rss: 4935680,
//  heapTotal: 1826816,
//  heapUsed: 650472,
//  external: 49879,
//  arrayBuffers: 9386
// }

しかしながらAngularの場合はprocessがそもそも存在しない環境なので動きませんでした。

手段② performance.memory

https://developer.mozilla.org/en-US/docs/Web/API/Performance/memory

performance.memory.usedJSHeapSizeで使用中のヒープサイズ、 performance.memory.totalJSHeapSizeで割り当てされたトータルのヒープサイズを取得できます。

こちらはブラウザから動作しましたが、ブラウザにより実装にバラつきがあります。 ほんとWebアプリ開発ってブラウザの違いで苦しむこと多いですよね…。

MDN Web DocsによるとApple製ブラウザやFireFoxは動作しない模様。 今回の要件であるWkWebviewも実装がない為、動作しませんでした…惜しい…。

あとがき

色々な理由でSwiftにメモリ取得のコードは書きたくなかったのですが、今回は素直にSwiftでメモリ使用量を取得する方法で妥協することにしました。

SafariのUserAgentの固定化の動きもそうですが、Webブラウザはユーザーを特定するような情報は取得できないようにしようという思想が見えるように思います。端末に関わる情報を取得するのであれば、やはりネイティブ寄りの実行環境に軍配が上がるようです。