Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go言語はstack overflowの夢を見るか?
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takuto Nagami
October 14, 2025
Programming
870
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go言語はstack overflowの夢を見るか?
2025/10/14 Go Night Talks – After Conferenceにて登壇した際の資料です。
Takuto Nagami
October 14, 2025
More Decks by Takuto Nagami
See All by Takuto Nagami
Do Gophers Dream of Stack Overflow?
logica0419
0
42
今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話
logica0419
9
1.2k
キャリア科目では教えてくれない、就活を生き抜く法則
logica0419
2
290
歴史から学ぶ、Goのメモリ管理基礎
logica0419
17
4k
【2025改訂版】ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
2
210
Fundamentals of Memory Management in Go: Learning Through the History
logica0419
1
160
GopherCon Tourのつくりかた
logica0419
2
150
あなたの言葉に力を与える、演繹的なアプローチ
logica0419
1
300
GC25 Recap+: Advancing Go Garbage Collection with Green Tea
logica0419
3
1.1k
Other Decks in Programming
See All in Programming
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.5k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
15
7.3k
The NotImplementedError Problem in Ruby
koic
1
960
さぁV100、メモリをお食べ・・・
nilpe
0
160
スマートグラスで並列バイブコーディング
hyshu
0
260
Agentic UI
manfredsteyer
PRO
0
200
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
130
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
220
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
410
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
560
AIで効率化できた業務・日常
ochtum
0
150
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
Leo the Paperboy
mayatellez
7
1.9k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
580
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
740
Why Our Code Smells
bkeepers
PRO
340
58k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
370
Transcript
Takuto Nagami @logica0419 Go言語は stack overflowの 夢を見るか?
自己紹介 • Takuto Nagami • 千葉工業大学 情報科学部 情報ネットワーク学科 4年 •
Gophers EXの発起人/代表 • 最近Goでやった/やること ◦ Go Conference パネラー登壇 ◦ Go 1.25 リリパ 登壇 (Green Tea) ◦ GopherCon Tour 報告会 (予定、後で宣伝) ◦ Go West Conference 英語登壇 (予定)
BIG NEWS!!!!! (先週) • Go 1.26でのGreen Tea GCデフォルト化がほぼ確定🎊
BIG NEWS!!!!! (先週) • Go 1.26でのGreen Tea GCデフォルト化がほぼ確定🎊
Stack overflow、ご存知ですか?
Stack overflow、ご存知ですか? 今回はこれではないです
スタック(とヒープ)
アプリケーションから見たメモリ . . . • Key-value storeの形で表される ◦ Key: Memory
address ◦ Value: 各アドレス1バイト • ほとんどの高級言語は、変数を メモリに格納する時、スタック とヒープの2つの領域を(言語側 で作って)使い分ける 0x0000 0x0001 0x0002 0x0003
. . . スタック
. . . main() stack frame スタック
. . . main() stack frame 5 スタック {v addr}
. . . main() stack frame 5 a() stack frame
スタック {v addr}
. . . main() stack frame 5 a() stack frame
5 スタック {arg addr} {v addr}
. . . main() stack frame 5 a() stack frame
5 7 スタック {arg addr} {a addr} {v addr}
. . スタック main() stack frame 5 a() stack frame
{arg addr} {a addr} {v addr} 5 7 b() stack frame
. . スタック main() stack frame 5 a() stack frame
{arg addr} {arg addr} {a addr} {v addr} 5 7 b() stack frame 7
. . スタック main() stack frame 5 a() stack frame
{arg addr} {b addr} {arg addr} {a addr} {v addr} 5 7 b() stack frame 7 1
. . . スタック main() stack frame 5 a() stack
frame {arg addr} {a addr} {v addr} 5 7
. . . スタック main() stack frame 5 {v addr}
. . . スタック プログラム終了
スタックが苦手なデータ • コンパイル時にサイズが決まらないデータ ◦ slice・mapなど ◦ スタックはコンパイル時に全て定義される ▪ 動的にサイズを変えるのは効率が悪い •
複数の関数でまたがって使うデータ ◦ グローバル変数など こういうのがヒープに入ります (詳細は割愛)
Stack overflow (原義)
スタックには上限がある(こともある) • 歴史的経緯で、C言語などではスタックに上限がある ◦ Linuxのデフォルトだと8MB
スタックの上限を突破すると… • 関数のネストし過ぎなどで上限を突破する
スタックの上限を突破すると… • 関数のネストし過ぎなどで上限を突破する → Stack overflow!!
【Go特有】 可変サイズのスタック
Go言語のスタックは伸び縮みする • Go言語のスタックはgoroutineごとに作られる ◦ goroutineが特殊と言われる理由の一つ • それぞれのスタックに大きな容量を確保できないので それぞれが伸び縮みする ◦ 4kBで作られ、関数が多くネストされたら勝手に
大きくなる ◦ Stack Copyingという手法、詳細は割愛
イメージ main goroutine main() stack frame a() stack frame a2()
stack frame a3() stack frame a4() stack frame m2() stack frame b() stack frame a goroutine b goroutine
【本題】 Goでstack overflow って起こるの?
スタックが伸び縮みする → stack overflowが 起こらないのでは? 皆さんもそう思いましたよね?
結論 起こります
理由: goroutineごとにスタックの 最大サイズがあるから runtimeパッケージで定義されています
goroutineごとのスタック最大サイズ • プログラム起動時は一旦1MiBで仮置きされる ◦ runtime/stack.go ◦ main goroutineが起動するまでこれが使われる
goroutineごとのスタック最大サイズ • main goroutine起動時に32bit/64bitで場合分け ◦ runtime/proc.go ◦ 32bitなら250MB、64bitなら1GB
実際に起こしてみよう! • fatal error: stack overflow が実際に起きた ◦ ネストされた関数は 670万超
スタック最大量の変更 • runtime/debug.SetMaxStack() で変更可能!
スタック最大量の変更 • 8MBに設定して同じことをやってみる ◦ ネスト数は 670万超 → 5万2千程度に
まとめ Goもstack overflowします
ありがとうございました & 宣伝 GopherCon Tour報告会、来てくださいね!!!