golangでwasmを作って使うとOut of memoryが起きました(発端、考察)。
OOM issueとして議論されていましたが、公式版では解決しなかったのでフォークされたものを利用して解決しました。
今回はその利用方法メモです。
環境はWindows10ですがGit for windowsを入れているのでlinuxコマンドも使います。
まずは利用させていただくフォークはこちらです。
これはGo1.11でOOM解決したフォークのGo1.12版という認識です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//作業用ディレクトリを作る mkdir wasm-go cd wasm-go //対応ブランチをもってくる git clone https://github.com/olso/go cd go git fetch --all git checkout small //ビルド cd src make.bat |
過去にビルドしたことがなかったら大体エラーになると思います。
ERROR: Cannot find ホームパス\Go1.4\bin\go.exe
Set GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
GO1.4が必要になるのでダウンロードページの下部 Archived versions から1.4.3をダウンロードして中身をホーム直下にGo1.4として置きます。
その後もう一度make.batを起動します。
1 2 3 4 5 6 7 8 9 10 |
>make.bat Building Go cmd/dist using ホームパス\Go1.4 Building Go toolchain1 using ホームパス\Go1.4. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. Building Go toolchain3 using go_bootstrap and Go toolchain2. Building packages and commands for windows/amd64. --- Installed Go for windows/amd64 in ホームパス\wasm-go\go Installed commands in ホームパス\wasm-go\go |
途中でウイルスバスターが邪魔してきたので状況に応じて適宜対処する。
これで準備ができたのでwasmビルドに入ります。
1 2 3 4 5 6 7 |
env ^ GOOS=js ^ GOARCH=wasm ^ GODEBUG=gcstoptheworld=1 ^ GOGC=20 ^ GOROOT=%HOMEPATH%\wasm-go\go\ ^ %HOMEPATH%\wasm-go\go\bin\go build -o test.wasm test.go |
^
はエスケープ文字で改行を無視しています。Linuxでの\
ですね。
前回導入したwamsでメモリサイズを見てみます。
1 2 3 4 |
>wams test.wasm memory section (offset 0x8d2, 4 bytes) maxPages set to unlimited memPages 1024 (offset 0x8d4, 2 bytes) |
ええと、64MBかな。
PCブラウザとAndroid2種で動作確認しましたがどれも無事動きました。
ようやく解決したけどできれば公式で対応してほしいところです。