应用程序的内存一般会分成堆区和栈区,程序在运行期间可以主动从堆区申请内存空间,这些内存由内存分配器分配并由垃圾收集器负责回收,我们在上两节已经详细分析了堆内存的申请和释放过程,本节会介绍 Go 语言栈内存的管理。
7.3.1 设计原理
栈区的内存一般由编译器自动分配和释放,其中存储着函数的入参以及局部变量,这些参数会随着函数的创建而创建,函数的返回而消亡,一般不会在程序中长期存在,这种线性的内存分配策略有着极高地效率,但是工程师也往往不能控制栈内存的分配,这部分工作基本都是由编译器完成的。
寄存器
寄存器1是中央处理器(CPU)中的稀缺资源,它的存储能力非常有限,但是能提供最快的读写速度,充分利用寄存器的速度可以构建高性能的应用程序。寄存器在物理机上非常有限,然而栈区的操作会使用到两个以上的寄存器,这足以说明栈内存在应用程序的重要性。
栈寄存器是 CPU 寄存器中的一种,它的主要作用是跟踪函数的调用栈2,Go 语言的汇编代码包含 BP 和 SP 两个栈寄存器,它们分别存储了栈的基址指针和栈顶的地址,栈内存与函数调用的关系非常紧密,我们在函数调用一节中曾经介绍过栈区,BP 和 SP 之间的内存就是当前函数的调用栈。
![](data:image/png;base64,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)
图 7-43 栈寄存器与内存
因为历史原因,栈区内存都是从高地址向低地址扩展的,当应用程序申请或者释放栈内存时只需要修改 SP 寄存器的值,这种线性的内存分配方式与堆内存相比更加快速,仅会带来极少的额外开销。
线程栈
如果我们在 Linux 操作系统中执行 pthread_create 系统调用,进程会启动一个新的线程,如果用户没有通过软资源限制 RLIMIT_STACK 指定线程栈的大小,那么操作系统会根据架构选择不同的默认栈大小3。
![](data:image/png;base64,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)
表 7-4 架构和线程默认栈大小
多数架构上默认栈大小都在 2 ~ 4 MB 左右,极少数架构会使用 32 MB 的栈,用户程序可以在分配的栈上存储函数参数和局部变量。然而这个固定的栈大小在某些场景下不是合适的值,如果程序需要同时运行几百个甚至上千个线程,这些线程中的大部分都只会用到很少的栈空间,当函数的调用栈非常深时,固定栈大小也无法满足用户程序的需求。
线程和进程都是代码执行的上下文4,但是如果一个应用程序包含成百上千个执行上下文并且每个上下文都是线程,会占用大量的内存空间并带来其他的额外开销,Go 语言在设计时认为执行上下文是轻量级的,所以它在用户态实现 Goroutine 作为执行上下文。
逃逸分析
在 C 语言和 C++ 这类需要手动管理内存的编程语言中,将对象或者结构体分配到栈上或者堆上是由工程师自主决定的,这也为工程师的工作带来的挑战,如果工程师能够精准地为每一个变量分配合理的空间,那么整个程序的运行效率和内存使用效率一定是最高的,但是手动分配内存会导致如下的两个问题:
不需要分配到堆上的对象分配到了堆上 — 浪费内存空间;
需要分配到堆上的对象分配到了栈上 — 悬挂指针、影响内存安全;
与悬挂指针相比,浪费内存空间反而是小问题。在 C 语言中,栈上的变量被函数作为返回值返回给调用方是一个常见的错误,在如下所示的代码中,栈上的变量 i 被错误返回:
int * dangling_pointer() {
int i = 2;
return &i;
}
当 dangling_pointer 函数返回后,它的本地变量会被编译器回收,调用方获取的是危险的悬挂指针,我们不确定当前指针指向的值是否合法时,这种问题在大型项目中是比较难以发现和定位的。
在编译器优化中,逃逸分析是用来决定指针动态作用域的方法5。Go 语言的编译器使用逃逸分析决定哪些变量应该在栈上分配,哪些变量应该在堆上分配,其中包括使用 new、make 和字面量等方法隐式分配的内存,Go 语言的逃逸分析遵循以下两个不变性:
1.指向栈对象的指针不能存在于堆中;
2.指向栈对象的指针不能在栈对象回收后存活;
![](data:image/png;base64,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175XIiIieUZBOM+5XC4CwSCVhUVMOXIad+zSVnvL1cfTE2XyqSYqikoIBAO4XC6VR4iIiKDFcnmtrzQiEAhQVlZOdSyOc7yexpIg0dIirKAfR7OH1yQjbeGKxijsDDMqHKe6spLSsjJ8Pr9KI0RERHopCOc50zTxeDwUFxfjOA4ej4eitla6608ST8Sx0mmc850RQK4qhmHgdnvw+/2UlJQwbORIhg2rpKioCI/Hc03PBrd2mfzly0VDPQy5wsorgjz3+aEehYjkAwVhwTRNfD4fZWVleL1eiouLifT0kEgkSFsKwteaTBB24/f5KSgspLCwkGAwiNfr1WywiIhIPwrCgmEYuFyuzFZqLheBQIDS0lIsy8K2bQXha0x2NxC3C4/Hi8fjydYFX8uzwSIiIpebgrAAZEOSx+PJzCb6/QAKwdeovsDbF4pFREQkl4KwDKBZQxEREckXmioSERERkbykICwiIiIieUlBWERERETykoKwiIiIiOQlBWERERERyUsKwiIiIiKSlxSERURERCQvKQiLiIiISF5SEBYRERGRvKQgLCIiIiJ5SUFYRERERPKSgrCIiIiI5CUFYRERERHJSwrCIiIiIpKXFIRFREREJC8pCIuIiIhIXlIQFhEREZG8pCAsIiIiInlJQVhERERE8pKCsIiIiIjkJQVhEREREclLCsIiIiIikpcUhEVEREQkLykIi4iIiEheUhAWERERkbykICwiIiIieUlBWERERETykoKwiIiIiOQlBWERERERyUsKwiIiIiKSlxSERURERCQvuYd6ACIiF8o0HYaV2EM9DLnCigudoR6CiOQJBWERuWZUFDv8h69GhnoYcoWFUwFqh3oQIpIXVBohIiIiInlJQVhERERE8pKCsIiIiIjkJQVhEREREclLCsIiIiIikpcUhEVEREQkLykIi4iIiEheUhAWERERkbykICwiIiIieUlBWERERETykoKwiIiIiOQlBWERkSHW1WMSTxhDPQwRkbyjICwiMoSSafgfrwT56bIAjvPJbptKZ/6JiMjFURAWERlCLhOmVFtMHZPG+ISTwq+s8vP2R74rMzARkTzgHuoBiIhci2wbuqMGxUGHSNwgHDUYVurgdQ+c1o3GDboiBgU+h+ICJxt2owmDRDLz9eO3x/H0ezd2HAhFDIJ+MA1o6zLw+xxKCzN9J1IGsYRBU4dJeZFDZzjTacAHfq9zpo8ek2gCSgsdgv4z47JsCEcNSgocHAc6wiZpC4aX2piaHhGRPKIgLCKXjeM4dHR0cGD/ETo7OrnvgbsJBPwAbN60lXB3T85tFi5cQHFpMQDbt+2ks6Mrp82MGdPwBbxXdvCfUFvI5L+8XMAdc5Ks2eXFsWFYqc3ffDZKQSATOo/UufnBHwLYDhgGPHJLgvsXZtLvOx95Wbsn85gcB2aOT/ONJ2NAJiT/15cLWDo/yfo9Xrp6DFwu+MvPxJg0Ks27m72s2u7FcaC2GXYfLwTg0cUJ7r85iePAa2v8rN3tAcA04V8/E2HCSBuAlk6T//kvQf7DCxFeXB7geL0LB/hPfxqhrMj+NJ9GEZEhpSAsIpcs1BVi9QfrOHjgMOHucPbyW265uV8Q3kZTQ3PObadOm9wvCO/i1ImanDblZaWMnTDmCo3+4qWtTKj86+eixBIGv/ijn2UbfXz27jjNHSY/e9vP4huS3HZjmtomk9+t9lNS6LBoZoq7FyS5eWYK2zZ4ZZV/0P4/2ufhuaVxfF747fs+Xnnfx7//Upo756aYMznNP//RT1W5zUO3JAAo650xfm+bl0373Xz14RhV5TYf7ffy0jtB/u8XInhcmTbJlME/vRbkhglpHlmcwLZRCBaRvKMgLCKXJBqN8qMfvEioK5R7XSw6BCP6dN02O834Kou0BeXFNk3tmdqCfafcpC14dHGSoN+hrNBm2UaHw7UuFs1MUV7sUF7sYNvg9Qy+Sm7eFIvZkzKr4SaMdHOo1k0qbVBWaFNaAB43FPgdxo0YGGAPnnIT8EFP1OB41MX/396dxcZ13Xcc/547d4azchsuIkVqpySa2ldblizLkp04zYJuSNugRQOkGxAULVqgaVGgRfvStwJ9aIE8BC2KBEjTInBdO07sOLEsybK1U6IsWbZEayUpisOdwxnOPX245FAUacmiRA1H+n0ALbz3f889MxJGfx3+7/lXxDz6hgxdPYaF1ZOlE8vrcnxt5+gcvjsiIvObEmEReSCRSIT6hXX5RDgajbKquYnq6irKysvzcVu2bKT/ttXiCWWlpfnfb9i4lkWLGqbF1NRWz8HMH66Aw5Q63/SowQ1AIOB/7Qb8mEx2dtukBYN+8npnyjxTCp3JGhwHbtwK5I89uyZLpGRq9OZV2VnNRUTkcaFEWEQeiDGGF7+wh66OLva+9DxPtawmFJpez7tj59P3HGvb9i0zHs/lcqRSqQee61y4ccthzVJIDTh09zmsG1/BXdXo1/IeO++yY02WjpRhKA2NtbmHdu9IyNLV45DL+Qm3Ha9FXrwgx7HzLrvWZ6hLelgLQ2lDPDI1Eb7fXSpERB43SoRF5IEtWFDLX/zVnxZ6GgXx7qkgB1pd+occyhMe+7b4pQYrGnLs2ZThR78I8+aREH1DhpoKj13rHs4qrDGwbvkYrx8u4TvfjVMZt6xeNMav7h7lxa0ZLlwN8E/fj1GX9MhkYEHS4w+/OvJQ7i0i8rgwqb6Bi05JHQAAERBJREFU+9zCXUQEOjo66Rnf4aG6uorq6uSc3WtiRfjW9bNsqXplzu5zP7pSDv/4HzG+9eURKhKWbA7qk96U8gPPg9SgQ2ePQ2WpR7LUm1I+MSE14GDM5PZonoWefodwyOZXcQeGDaNZQ7LUy6/kTsRd63aIhy01FR6J6PjDcGOGVL+hu98hmfAoi9v83MZy/nUViZnnU2gD2Soum29QXV1NJBIp9HRE5DE2Dz8CRaQYvP/eUd5/7wgA+156nhf2PV/gGRWG4xgW1c7c3s1xIDmeAN/Nnbs1OAaqyqYeS0QtiTsqgifi7owFCLmW2kpLbeX0c24Aaiq0Q4SIiLZOFxGZBceByoRH0NU31UREipVWhEVEZqGqzOPvvjmkB85ERIqYEmERkVlSO2IRkeKmj3EREREReSJpRVhEZqWqKsmyZUsAKL+tcYaIiEixUCIsIrPy7K6neXbXvZtkiIiIzFcqjRARERGRJ5JWhEVkVnp6ehkcHASgrKyUsrLSAs9IRETk/igRFpFZefedg2qoIQU1lh3DnY+t8Qool/Po7u4mPZImHAlTWVlBMBgEoOdWitGM3wI8EAgQi0aJxWOFnK5IwekTREREisrQ4BA/++nbNDY2sGXbxkJPZ97I5XL84D//i48vXGRsbAzXdVm4sI5v/fHv4zgO//vKa1z8uB0AYwzBoMtLL+9l2/YtBZ65SOEoERYRkXlvND3Kh2fPc+b0WS5c+IRsJsuu3TsKPa15pedWDx+dv8CLX9zLpk3r6e6+RceNTsx415dcLkcyWck3/+B3Gegb4N39B3n7rf1KhOWJpkRYRETmJc/z6E310XrqDPt/eZDh4eH8uYqKck4dbyUcCbP9mW24boBMJsN7Bz8gk8lMHcjCMzu3Ex8vAzj83hH6+vr9UxbMeNCmLRuorq4C4OSJVjpudJIPGv/lqbXNLF7cCMCHZ89z6WL7xC3y91q+Yimrm1cCcOlSO22nz41fb/NBCxvq2LTZX83uuNHJB4ePTnv9y5uW0bKm+fO/X9bieRZjDG7QZcnSxSxZunhKTCAQoLQ0QWlpguaW1ZxuPZtfPRZ5EulvvogUDTsaZOTE6kJPQ+ZYOhjl0/BlfvLqm3R23SQ9kp4Wk0r18vO33qGispwt2zaNJ8JZDh44zODA4JRYYwzrNqzJJ8Injp7kypVr08ZcsnRRPhE+23aOM61np8VUJivyiXD7pU85sP+9aTFuIJBPhDuud3LowOFpMes3rMknwqlUL4fH6+1vFwwF7ysRTiYrWbmqiZ++/haHD33Axo3r2f3CznyN8O2uXL7KL97aT7KqUkmwPNH0t19EZiWRiFNTUw1ANPpoHrix1sEbijySe0nh2JIw0coodQvrGBoanjERlulc1+X3vvnbnG07x/Fjp3h3/yHa2j7kT779LUKhEADXr9/gb7/zD5SUhKiprWHvi7sLPGuRwlIiLCKz8sK+3bywT/+IyhwwUF1TxVMtzXzlay9ztu0cb77xNj09KcbGxgCIJ+Js2LSOWDRKIBAAIBQK8syObWQy2fGB/FIE4xhisWh++M1bN7Kiabl/zkxGJpPJfMzatS3Ujv9HbyLIGFjYsDAf07RyBSXhkslJj8csWtSYj1m8uJGXvrgXDJjxGDDU1FbnY2prqnn5V16a9jY0NNZ/vvfrDi1rmmlZ08xH5y7w79/7PufPXWDtuhYA6uvr+Paf/dGsxhV5HCkRFhGRecsYQ8uaZlatbuJmVzetp87w/uGjDA4MsmHjOurrF+RjQ6EQe/Y+d88xtz1974fD1q5vAVruGrOiaRkrmpbdNaa+oZ76hrsntJVVlQ/lwb8rn17l4MH32btvN1XVSfoHBgCoqKh44LFFHldKhEVkVoaGhhkd9fckjUQiRCLhAs9IHmeu61JXv4C6+gXs3rOTE8dO0ZvqnZIIP+nS6TQ3u7r4l3/+N5yAg7WWzVs3srChrtBTE5m3TKpvwN47TERkqld+/Noja6iRy+VIpVLcvPgJLe0X5uw+Mj8MhSPc3LCV6upqIhHVhN+vbDZLV+dNFtTV5stGRGRmWhEWERF5jASDQRbeoxxDRHxKhEVE5hvXxZZXTjx/henvg/EyFBEReXiUCIuIzDM2lsA+9wKMf1vbHHoHrl0t8KxERB4/TqEnICIiU5n+XpxXfoT56WvjW3eZe14jIiL3TyvCIjIroVCIaNTfm3WmzlVPvAX1EI7ApxcnW/TW1UOwBHP5EjgOlJZBTS02UQa9PZjL7ZDN+vG5HHhjM49dVg619XDpgh8fCMDyVXClHUbG2xDH4tiGRojFobsLc/0ajH3GeCIiTyglwiIyK3v2PsfOXc8AUFISKvBs5h8bCGA3b8O5cdWv73Vd7KZtcPUy5vIlbFk5dvdeTEeHH79hC3ZZE87P3wDPu/vYySrs+o041y77ibAbxNuwCZO6hRkZhmQ13q49MDSI6e6CzU9jay9jjkxvBywi8iRTIiwisxIOlxDOd9WSO5kb17Ajw9jmNZiTxyCegHAEc/WKfz7Vg3njVX+VNhqDsQx2WZO/gjvQ/0D39lauhrExnPfehWwG23EDu/N5zJlTkyvGIiKiRFhEZs9ay+DAIP39/VNazwrgeZiPzmE3bsG0tWIXLcEMDWJu3fTPBwJ4TathxUo/GZ7o9es+hI/lRBlEwngvfmny2NgYRKNKhEVEbqNEWERmZWRkhDdef4vTrW3E4zH+/C+/jTGze6hraGgY13UfuxIL03kDaz1YUI9dvhLn/YP5c3btBqhbiPPmT2BkBFu7ALvzjqYk47XF05Jj747jd9Zop4chFMTZ/7ZfazxBSbCIyBTaNUJEZiWTydB2+izpkTTdN2/xwx/8D9lsdlZjhUJBvvuv3+P/XvkJly5+Su725K2YDQ5AqgfvqbX+iuzEajBAOOwnsuUV0NCIfWrttMvNSBrSI3grm7GLlmAXL/WPp4fBGOyqp7DLV2Kf3T2lrth8egnCEezyJmx5ObayCltbd8/aYxGRJ03gO3/9N39f6EmISPEJh8NUVJTTduZDADo7u7hy5Sqrm1fld5HwPA/P87DWTvlhjMmvHlvPgoGh4RH2//IAx4+e5PixkyQrK6moLMdxHKy1pNNphlMpanp7CvaaZ8P09mJXNmNudmHaP5k83tEJjYuwy1dANI758DTUNWAufQLptB9kLebmTeyKJmhcBIkE5tN2GBzElpXBwgaIJXDeeRO7sBFz/SpmeAjT14u52YltXgtLlsKCOsyN65jeVIHehfuTdYMML1hILBbTjiQiMqdMqm/AFnoSIlKcxsbG+O8f/pjWU235Y+s3rOXrv/PrALz26ht8/NFF/4SZ/GXPvt2sXdcCwLv7D3Hi2Ckyoxl6eqYmahUV5SxdtpjtO7YSiYS5efETWtovzPnremSM8VeF77WS7jj+Fml3xrnuvbdECwb9GFs8H/VD4Qg3N2ylurqaSCRS6OmIyGNMNcIiMmuu6/Jb3/hNEqUJ3jt0BMcYduzcnj/f19tPZ2fXtOuGh0fyvx/oH6DjRueM46dSvaSO9XL0yAlWP9XEplVLH/6LKCRr750Eg1/SMFNZw+fZF3iW5SoiIk8CJcIi8sC+9OUvsHHTeq5du0HjooaHOnZpWYKvfPVlqmqS9LS3P9SxRUTkyabSCBGZM7e6e8ZXf8c7q43/VFlZQTwRAyCVStHfN0jrqTO8d/B9AKLRCBs3r6dlTXM+sU6lUo9faYTMSKURIvKoaEVYROZMsqqS5D1iKioqKCsr4/VX32BBXS0bN61n+zNbCIUmt1J7bHaREBGReUWJsIgU3NDgEL/x9V+jorIM92E0lJitQGDqvruOA24QMqNzelsbT2CGBovqgbZp75WISBHSPsIiUnCJ0gTVNcmCJsG2vgHbsm7qsSXLsM0tDz6462K37sD70tewS5ZNPec42M3boKZ2+px2PAcVlQ9+/4fNCWC3PTO9kYeISJFRIiwiEolg12/CnD/rf20ciMcxXR2Yc2cn48Jh/0c84a+IOg5M1LAaA1G/7plg0I+JxfyxxsYwRw7BYP9kK2WAUAiiUZxj70N3923jRP3r3SD2s7r1hSMQifr3jMX9sSbunUj4x42BgOvHxhMQKvFjjfHnHk/4XzvO5LWh0GQ8+HO5/fUHAuDlMFcuY5/eOfX1iIgUGZVGiIiUlmOuXYFRvwTCui5myTJsOAqehzn+AQDenpcg1YOJJeBqO+byp3i79+K8+Tq4Lt6mbTgHfoHdtB2GBqG0FG51TybYd7AVlZjqWrzGxTgnjkLHdWzDImzLOsyVdmx5OZ+VZnqbtmCcALa8AnPtGrgOpvUE3u69mI4bUF4JH50FDHbr0zCahvQoVFXh/Ox17MrV2FgcjINJpzFHDmEXNmIbF2Os9V9nWyt283b48Aym+ybe1h1+m+hczp/r5m2YcBhGRj5jliIi85tWhEVEYnHMre78lyabgTOtmEsfg3NbKup5OIcPYE58AMlqSI9AOo1dUI+3bIXf2hgwH7ZCNu13iFv91Gfe1nR2QFsrJn1bItm4GHPhPKbtNCZ1ly56jgMXP8b0pjCtxyGWgNIyKAlDbgyGBrGLlvgdTLJZzLVrmOtXAIMtLcM2LMI5fBDn6GFsXZ1/nXEw8QTm/YOYtlb/Pu2fQNNqiEQxoyOT9dJj/j0IaD1FRIqXEmEReeLZ0TS2tOxzBI43tRjL+omotX5r5IZGaFqNudUFwRDeF76C6ejEtH+CDU7ufmGyYxAITpYizHgLzy9NcJy7xvnBd3w9lsMMD/uJdOtxnGMfjMfdFmgtZuIhN9fFhkLg2XyMHeif0oTDXLkMoRB27Xq4dnVyHGMgGp+50YeISJFQIiwiTzzT14utbwQncP/XdnZg46WYnm6/RMDLYXpu4m17BruyeWrwR2exy5bj7dozWdN753gXzsOSpXjP78OWhO9vMv290NuDt3sfdtceKCufOS43hmk9iff8Pnh6J6bt5N13xrj4MdQ3Yro6Jo8lq8ZXxFUWISLFSw01RGTey+Vyc95Qw65eA1jMubaHM6DrztwCORDAGoO5W3tk4wB29tupue5nt2W+neP4K7t32wYtnsBbugwzksZ8fD5/nbf9WZzTJ2FwYHZzvAs11BCRR0XFXSIigDl3ZuoOCQ/qsxLdXO4zH4DLsw9YbnC3JPt2n6Oswa5uwYyMYD75aMp1zqnjMDw0ywmKiMwPSoRFpCgYYwCDxxzWdA0Pz9XIRcscPTzziTlMgjPGwTDxZy4iMndUIywiRcEYg3Vdsvd6gEyKXqqkBCcQUCIsInNO/6KISFEIBAKYcAl97swPmcnjIWMMXYlyXFeJsIjMPSXCIjLvGWMIBoNEY3E+Lq1g4N5VtlKkPgrHiCZKKQmV4Gj1X0TmmD5lRGTeM8bgui7xeIxYVTUnogkGmb6NrhSvDHDKuPQmqykvK6MkrERYROaeHpYTkXlvIhGORmMkq6rIZLMc6DAk+vtYbj2qAgZX30YvOh4wlPNo9+BqJEqsuoa62loSpaUEgyGVRojInFMiLCJFYaI8oqzM7wBXUhKipyfF0YEBMplRcrmcVoiLjOM4BMNBorEoVWXlJKuSlJdXEIlEcBxHibCIzDklwiJSFIwxBAIBwuEwjuMQiYQpLytnJD1CNpMld7emEDIvGWNwg0HCJSVEYzGi0SglJSUEAgGVRYjII6FEWESKxkQyXFJSguu6RMIRxnI5PM/DWoudbSc2KQhjDI7jEAgEcF03nwBrJVhEHhUlwiJSdCaSJdd1CSn5LXoTia8SYBF51JQIi0hRUvIkIiIPSkVYIiIiIvJEUiIsIiIiIk+k/wfYAKDbzmif/QAAAABJRU5ErkJggg==)
图 7-44 逃逸分析和不变性
我们通过上图展示两条不变性存在的意义,当我们违反了第一条不变性时,堆上的绿色指针指向了栈中的黄色内存,一旦函数返回后函数栈会被回收,该绿色指针指向的值就不再合法;如果我们违反了第二条不变性,因为寄存器 SP 下面的内存由于函数返回已经释放,所以黄色指针指向的内存已经不再合法。
逃逸分析是静态分析的一种,在编译器解析了 Go 语言源文件后,它可以获得整个程序的抽象语法树(Abstract syntax tree,AST),编译器可以根据抽象语法树分析静态的数据流,我们会通过以下几个步骤实现静态分析的全过程:
1.构建带权重的有向图,其中顶点 cmd/compile/internal/gc.EscLocation 表示被分配的变量,边 cmd/compile/internal/gc.EscEdge 表示变量之间的分配关系,权重表示寻址和取地址的次数;
2.遍历对象分配图并查找违反两条不变性的变量分配关系,如果堆上的变量指向了栈上的变量,那么该变量需要分配在堆上;
3.记录从函数的调用参数到堆以及返回值的数据流,增强函数参数的逃逸分析;
决定变量是在栈上还是堆上虽然重要,但是这是一个定义相对清晰的问题,我们可以通过编译器统一作决策。为了保证内存的绝对安全,编译器可能会将一些变量错误地分配到堆上,但是因为堆也会被垃圾收集器扫描,所以不会造成内存泄露以及悬挂指针等安全问题,解放了工程师的生产力。
栈内存空间
Go 语言使用用户态线程 Goroutine 作为执行上下文,它的额外开销和默认栈大小都比线程小很多,然而 Goroutine 的栈内存空间和栈结构也在早期几个版本中发生过一些变化:
v1.0 ~ v1.1 — 最小栈内存空间为 4KB;
v1.2 — 将最小栈内存提升到了 8KB7;
v1.3 — 使用连续栈替换之前版本的分段栈8;
v1.4 — 将最小栈内存降低到了 2KB9;
Goroutine 的初始栈内存在最初的几个版本中多次修改,从 4KB 提升到 8KB 是临时的解决方案,其目的是为了减轻分段栈中的栈分裂对程序的性能影响;在 v1.3 版本引入连续栈之后,Goroutine 的初始栈大小降低到了 2KB,进一步减少了 Goroutine 占用的内存空间。
分段栈
分段栈是 Go 语言在 v1.3 版本之前的实现,所有 Goroutine 在初始化时都会调用 runtime.stackalloc:go1.2 分配一块固定大小的内存空间,这块内存的大小由 runtime.StackMin:go1.2 表示,在 v1.2 版本中为 8KB:
void * runtime· stackalloc(uint32 n) {
uint32 pos;
void * v;
if (n == FixedStack || m - > mallocing || m - > gcing) {
if (m - > stackcachecnt == 0)
stackcacherefill();
pos = m - > stackcachepos;
pos = (pos - 1) % StackCacheSize;
v = m - > stackcache[pos];
m - > stackcachepos = pos;
m - > stackcachecnt--;
m - > stackinuse++;
return v;
}
return runtime· mallocgc(n, 0, FlagNoProfiling | FlagNoGC | FlagNoZero | FlagNoInvokeGC);
}
如果通过该方法申请的内存大小为固定的 8KB 或者满足其他的条件,运行时会在全局的栈缓存链表中找到空闲的内存块并作为新 Goroutine 的栈空间返回;在其余情况下,栈内存空间会从堆上申请一块合适的内存。
当 Goroutine 调用的函数层级或者局部变量需要的越来越多时,运行时会调用 runtime.morestack:go1.2 和 runtime.newstack:go1.2 创建一个新的栈空间,这些栈空间虽然不连续,但是当前 Goroutine 的多个栈空间会以链表的形式串联起来,运行时会通过指针找到连续的栈片段:
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArEAAAENCAYAAAAYOj2+AAAgAElEQVR4nO3dd5gc933n+XdVV+eenpwTwgxyIsEAAiBIMSrLsizJkuW1LMmW5bS29+7Ze/ae526f53b39ny+Xa9vz+ezLTnosS0/ClagKFLMAAmSAJGIHCfnHDp3V90fPdPAcJCJ4aBmPq/nATnTU1397Z7fVH3qV7+qnzE2MeUgIiIiIuIi5mIXICIiIiJyqxRiRURERMR1FGJFRERExHUUYkVERETEdRRiRURERMR1FGJFRERExHUUYkVERETEdRRiRURERMR1FGJFRERExHUUYkVERETEdRRiRURERMR1FGJFRERExHUUYkVERETEdRRiRURERMR1FGJFRERExHUUYkVERETEdRRiRURERMR1rMUuQETcLR6Lc/7CJSYnJmlqaqChsR6PxzNnmWQyyeDA0DXXEQqHqagom/d4Npujo72T7u4eVqxsprGxAdM05izT2dENONQ31M153aGhERLxOMFQkMrKCgDS6TT9fQPXrMMfCFBdXQnA5Pgk4xMTADRc8bq2bdPd1QNAbV0NlmXR3zdAJpO55nrzDJqaGwCIx+MMD41cc8miaBGlpSXAez87g6JohJKSYgzDuObzb1Uul6O9vYOe7n6KS6K0tKwiHA4Vfp5KpRnov/bnVmAYNDU1zHkom83S19uP4ziUlpVSVBS54Wr6+wZob+sgUhShpXUVgUBgzs87O7oxTZO6+hpM83JfzMT4JBMTEximSWNj/ZznpFNpzp+/yPDQCPUNdTQ1N+LzeW/8nkTkrqUQKyK37fnnXuKN198km8kWHguFQzzyyG52PbyjEDC6Onv4m29++5rr2bR5I1/80mcL36fTafa/8TavvLR3TjgsLi7i6Y88yZatmwrr/os//2sAPvmpj7Jj5wOFZf/2m99mbGycDRvW8aVf+2UAhgaH+Ys//+Y161i5agW/8fUvA/DOO0d48YVXAPja17/MqlUrAEgmU4V1/MEf/Q6lZSV855++x9Dg8HU/K8Mw+I//+X8F4MKFS3znH753zWV37X6Ij33iaQC6u3v41l/N/ewCAT919XU88uhuWlpXva9Ae+7sBZ579gX63xNSN23awGNPPEJNbTWD/YPX/dxmmabJf/jf/5c5j508fop//s4PAFizpoUvf/VLV32u4zicOnmG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EqGbYy8vy+n37TiONvzLiJ2zl8VYb7iibS92IfKBWE5t+4OiECsidzWF1+Vm+fy+HU3Ssaw4LJ/Ohw+KQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jkKsiIiIiLiOQqyIiIiIuI5CrIiIiIi4jrXYBcidlcvZZLPZxS5DFpjjLHYFIiIii0shdomxbZtczl7sMmSBOcswxWbSGVKp9GKXIQtsGTZt0qm02rbIbdBwAhERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEda7ELkDvL67Xw+32LXYYsMNM0FruED5zpMfF4dNy95C2/po1HbVvktijEiogreDweLEubrKVuGWZYPJalti1yG3ToJyIiIiKuoxArIiIiIq6jECsiIiIirqMQKyIiIiKuoxArIiIiIq6jECsiIiIirqMQKyKLKhFPLHYJIgsikUgudgkiS5pCrIgsqlMnz/DNv/x72to6SGqnL0vI228e5O//5h/p6uwhlUwtdjkiS47uriwii2rNula+/90f0XapnWhxlE2b1vHIhx4mHAkvdmki78vWezbz8+de4ty5C5QUF7Nl2yb2PLKLQDCw2KWJLAkKsSIu9Mbrb1NRWUlZWRkAr76yj7aL7VcsYYABO3bcx/qN6wA4dPAIx989ecWU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q6+ZOb1rFJazLM+cCQtqaqqwrNkepssrm516FvIzKcWaY3NfjLlTfZYUFxeGKMjS5rMsPv7Jj/CRjz7NieOnOHXiNH19c6dmLSsvxe/3E41eng45HA5dtW1fOQOdP+C/atuurKosfO31eqlvqMexba5s26FQsNBbahgGtXU1hCOzs+ZdXpn/irMFVdVVZLNZ3tu2Q6HLs+2VlpYwcMXwHRG5ecbYxJRz48XkbpdMJhkeHuZnz/yc3p75p29ladn18ANs2baFsrKyQmjs7uzh2Z8+T29PP+l0mvsf3M6nP/OJRa70/UskEgwNDfHD7z/D2Oj4YpcjC+yJp/awdv06SktLC6Gx/VIHzz7zPIODQ6TTGR59bA9PffixRa70/YvH4wwODPDP//QvJBPJxS5HFtjHP/UUK1aupKSkRMNH7hD1xIosEQ1N9Xzt619mbGycs2fO886Bw6SSKfxX9HqKuNGKVc381u9+jdGRMU6fOsvhd47y6Id24/NrjLTIcqYQK7KEmKZJeXkZO3c9yAMPbCedySx2SSJ3hGmaVFSW8/AjO9nx0P1kdUW/yLKnECuyRFleC8urP3FZerw+L140RlpkudOlnyIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4jq6/84Sk8vZZLO6f+JS52iePRERWeYUYpcY27bJ6SbgS56zDFNsJp0hlUovdhmywJZh0yadSqtti9wGDScQEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER11GIFRERERHXUYgVEREREddRiBURERER17EWuwC5s7xeC7/ft9hlyAIzTWOxS/jAmaaJaeq4W5YetW2R26MQKyKu4LE8eL3aZC11xvI7PsPyWnizatsit0qHfiIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxIiIiIuI6CrEiIiIi4joKsSIiIiLiOgqxS4xhGItdgnwQ9HsWEZFlTiF2iTAMA9M08Qd8i12KLDDDMLA8Hkxzefz5zh6YWZZnkSuRhWYYxrI6QJt9v2rbS59hGIV/cucsj73gMjAbYisqyha7FFlgHo+HYDiEaZrLZoNomiaRovBilyELzGN58HqtZXWAZpom0eKixS5FFpjX58Xj8SybbfYHZXlsKZYBwzDweb1U11ZRXBJd7HJkAVXXVlIcLcKylscG0TRNLMtDQ2Pdsgk3y1UoFCQYCuHxLI/fszHTC7tiRaPa9hIXjUbw+XwKsneY/mqWCNM08fp8RKPFrFm3CstrLXZJsgCixRHWrW8hUhTB610eQ0dM08Tn81NeUUZ1TcVilyMLxDRNVrU0Ew6HsDzWstjRm6aJ3+enoqqc8orSxS5HFojpMVmxqpFQKIRlad98JynELhGmaeL3+4lGo9Q31LFxcyvhcHCxy5I7xDCgrKKY9ZvWUFFZQTgcwev1Lovem9m2XVxcQuu61RQVRxa7JFkAK1Y10NhUTyRShOX1Lp8QGwhQUlzC2vWriRSFFrskucMMw2B1azP1DXWEI2Esa3kcoH1QdEiwRBiGgcfjIRKJUFlZheM4hEIhBvoHmZqaJpvJYjvOYpcptyjfC+mlpLSY6poqqqurqSivIBQKLYsACzNDZXw+otEoNTU1bNmWpf1SJ6PD46RSaWxb7dqtLMtDKBygpq6aFSubKJ9p28tlR5//+/YRLS6mpraWzdtytF/qZGxkgnQ6o7btUvn9sUk4EqS2vprmFc2Ul1cQDIY0nOAOU4hdQmZ7rEqKi7Esi1AoTFlZGbFYjEw2g23bi12i3CKPx4Pf5yccCVNSXEK0uJhwOIx3mfRUweUDtHA4TFVlJR6PSTAQZHx8nFg8Rjajtu02hbup+ANEiiKUl5dTUVFJWWkpgUBgWR2gWZZFOBymuqoKj8dDKBhifHyceCKutu1Cs9srn89PUbSIivIKKiorKC0pwe/3L5u2/UExxiamdKi3hDiOg23bZLNZUqkUqWSSVDpNLpfD0cbQXWZ29JaVD7L+QACfz1fopVouIXaWbdtkMhkSiQSx2DTTU9PEEwly2ax29C6U39H7CIVCFEWLCIXC+P3+ZdMLO8txHBzHIZPJEI/HicViTE9NkUgmyWYzOOqNdR2PlW/b4VCYoqIiQuF821Yv7J2nELtEzYbZK/+J+8yGVdM0CxvA5bwRnG3LmUyGTCZDdibAOhoq4zr5Nm1iWV68Xi+WZS2r28ZdaTbIXm7babLZnNq2S822ba/lxVrmbXuhKcSKiOvMHpTN7vzFna68Abx28Hlq20uD2vYHQ2NiRcR1NK5Mliq1bZGbp78WEREREXEdhVgRERERcR2FWBERERFxHYVYEREREXEdhVgRERERcR2FWBERERFxnf8fnK1YpSqksTIAAAAASUVORK5CYII=)
图 7-45 分段栈的内存布局
一旦 Goroutine 申请的栈空间不在被需要,运行时会调用 runtime.lessstack:go1.2 和 runtime.oldstack:go1.2 释放不再使用的内存空间。
分段栈机制虽然能够按需为当前 Goroutine 分配内存并且及时减少内存的占用,但是它也存在两个比较大的问题:
1.如果当前 Goroutine 的栈几乎充满,那么任意的函数调用都会触发栈扩容,当函数返回后又会触发栈的收缩,如果在一个循环中调用函数,栈的分配和释放就会造成巨大的额外开销,这被称为热分裂问题(Hot split);
2.一旦 Goroutine 使用的内存越过了分段栈的扩缩容阈值,运行时会触发栈的扩容和缩容,带来额外的工作量;
连续栈
连续栈可以解决分段栈中存在的两个问题,其核心原理是每当程序的栈空间不足时,初始化一片更大的栈空间并将原栈中的所有值都迁移到新栈中,新的局部变量或者函数调用就有充足的内存空间。使用连续栈机制时,栈空间不足导致的扩容会经历以下几个步骤:
1.在内存空间中分配更大的栈内存空间;
2.将旧栈中的所有内容复制到新栈中;
3.将指向旧栈对应变量的指针重新指向新栈;
4.销毁并回收旧栈的内存空间;
在扩容的过程中,最重要的是调整指针的第三步,这一步能够保证指向栈的指针的正确性,因为栈中的所有变量内存都会发生变化,所以原本指向栈中变量的指针也需要调整。我们在前面提到过经过逃逸分析的 Go 语言程序的遵循以下不变性 —— 指向栈对象的指针不能存在于堆中,所以指向栈中变量的指针只能在栈上,我们只需要调整栈中的所有变量就可以保证内存的安全了。
![](data:image/png;base64,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)
图 7-46 连续栈的内存布局
因为需要拷贝变量和调整指针,连续栈增加了栈扩容时的额外开销,但是通过合理栈缩容机制就能避免热分裂带来的性能问题10,在 GC 期间如果 Goroutine 使用了栈内存的四分之一,那就将其内存减少一半,这样在栈内存几乎充满时也只会扩容一次,不会因为函数调用频繁扩缩容。
7.3.2 栈操作
Go 语言中的执行栈由 runtime.stack 表示,该结构体中只包含两个字段,分别表示栈的顶部和栈的底部,每个栈结构体都表示范围为 [lo, hi) 的内存空间:
type stack struct {
lo uintptr
hi uintptr
}
栈的结构虽然非常简单,但是想要理解 Goroutine 栈的实现原理,还是需要我们从编译期间和运行时两个阶段入手:
1.编译器会在编译阶段会通过 cmd/internal/obj/x86.stacksplit 在调用函数前插入 runtime.morestack 或者 runtime.morestack_noctxt 函数;
2.运行时在创建新的 Goroutine 时会在 runtime.malg 中调用 runtime.stackalloc 申请新的栈内存,并在编译器插入的 runtime.morestack 中检查栈空间是否充足;
需要注意的是,Go 语言的编译器不会为所有的函数插入 runtime.morestack,它只会在必要时插入指令以减少运行时的额外开销,编译指令 nosplit 可以跳过栈溢出的检查,虽然这能降低一些开销,不过固定大小的栈也存在溢出的风险。本节将分别分析栈的初始化、创建 Goroutine 时栈的分配、编译器和运行时协作完成的栈扩容以及当栈空间利用率不足时的缩容过程。
栈初始化
栈空间在运行时中包含两个重要的全局变量,分别是 runtime.stackpool 和 runtime.stackLarge,这两个变量分别表示全局的栈缓存和大栈缓存,前者可以分配小于 32KB 的内存,后者用来分配大于 32KB 的栈空间:
var stackpool[_NumStackOrders] struct {
item stackpoolItem
_[cpu.CacheLinePadSize - unsafe.Sizeof(stackpoolItem {}) % cpu.CacheLinePadSize] byte
}
type stackpoolItem struct {
mu mutex
span mSpanList
}
var stackLarge struct {
lock mutex
free[heapAddrBits - pageShift] mSpanList
}
这两个用于分配空间的全局变量都与内存管理单元 runtime.mspan 有关,我们可以认为 Go 语言的栈内存都是分配在堆上的,运行时初始化会调用 runtime.stackinit 初始化这些全局变量:
func stackinit() {
for i: = range stackpool {
stackpool[i].item.span.init()
}
for i: = range stackLarge.free {
stackLarge.free[i].init()
}
}
从调度器和内存分配的经验来看,如果运行时只使用全局变量来分配内存的话,势必会造成线程之间的锁竞争进而影响程序的执行效率,栈内存由于与线程关系比较密切,所以我们在每一个线程缓存 runtime.mcache 中都加入了栈缓存减少锁竞争影响。
type mcache struct {
stackcache[_NumStackOrders] stackfreelist
}
type stackfreelist struct {
list gclinkptr
size uintptr
}
![](data:image/png;base64,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)
图 7-47 线程栈缓存和全局栈缓存
运行时使用全局的 runtime.stackpool 和线程缓存中的空闲链表分配 32KB 以下的栈内存,使用全局的 runtime.stackLarge 和堆内存分配 32KB 以上的栈内存,提高本地分配栈内存的性能。
栈分配
运行时会在 Goroutine 的初始化函数 runtime.malg 中调用 runtime.stackalloc 分配一个大小足够栈内存空间,根据线程缓存和申请栈的大小,该函数会通过三种不同的方法分配栈空间:
1.如果栈空间较小,使用全局栈缓存或者线程缓存上固定大小的空闲链表分配内存;
2.如果栈空间较大,从全局的大栈缓存 runtime.stackLarge 中获取内存空间;
3.如果栈空间较大并且 runtime.stackLarge 空间不足,在堆上申请一片大小足够内存空间;
我们在这里会按照栈的大小分两部分介绍运行时对栈空间的分配。在 Linux 上,_FixedStack = 2048、_NumStackOrders = 4、_StackCacheSize = 32768,也就是如果申请的栈空间小于 32KB,我们会在全局栈缓存池或者线程的栈缓存中初始化内存:
func stackalloc(n uint32) stack {
thisg: = getg()
var v unsafe.Pointer
if n < _FixedStack << _NumStackOrders && n < _StackCacheSize {
order: = uint8(0)
n2: = n
for n2 > _FixedStack {
order++
n2 >>= 1
}
var x gclinkptr
c: = thisg.m.mcache
if stackNoCache != 0 || c == nil || thisg.m.preemptoff != "" {
x = stackpoolalloc(order)
} else {
x = c.stackcache[order].list
if x.ptr() == nil {
stackcacherefill(c, order)
x = c.stackcache[order].list
}
c.stackcache[order].list = x.ptr().next
c.stackcache[order].size -= uintptr(n)
}
v = unsafe.Pointer(x)
} else {
...
}
...
}
runtime.stackpoolalloc 会在全局的栈缓存池 runtime.stackpool 中获取新的内存,如果栈缓存池中不包含剩余的内存,运行时会从堆上申请一片内存空间;如果线程缓存中包含足够的空间,我们可以从线程本地的缓存中获取内存,一旦发现空间不足就会调用 runtime.stackcacherefill 从堆上获取新的内存。
如果 Goroutine 申请的内存空间过大,运行时会查看 runtime.stackLarge 中是否有剩余的空间,如果不存在剩余空间,它也会从堆上申请新的内存:
func stackalloc(n uint32) stack {
...
if n < _FixedStack << _NumStackOrders && n < _StackCacheSize {
...
} else {
var s * mspan
npage: = uintptr(n) >> _PageShift
log2npage: = stacklog2(npage)
if !stackLarge.free[log2npage].isEmpty() {
s = stackLarge.free[log2npage].first
stackLarge.free[log2npage].remove(s)
}
if s == nil {
s = mheap_.allocManual(npage, & memstats.stacks_inuse)
osStackAlloc(s)
s.elemsize = uintptr(n)
}
v = unsafe.Pointer(s.base())
}
return stack {
uintptr(v), uintptr(v) + uintptr(n)
}
}
需要注意的是,因为 OpenBSD 6.4+ 对栈内存有特殊的需求,所以只要我们从堆上申请栈内存,需要调用 runtime.osStackAlloc 做一些额外处理,然而其他的操作系统就没有这种限制了。
栈扩容
编译器会在 cmd/internal/obj/x86.stacksplit 中为函数调用插入 runtime.morestack 运行时检查,它会在几乎所有的函数调用之前检查当前 Goroutine 的栈内存是否充足,如果当前栈需要扩容,我们会保存一些栈的相关信息并调用 runtime.newstack 创建新的栈:
func newstack() {
thisg: = getg()
gp: = thisg.m.curg
...
preempt: = atomic.Loaduintptr( & gp.stackguard0) == stackPreempt
if preempt {
if !canPreemptM(thisg.m) {
gp.stackguard0 = gp.stack.lo + _StackGuard
gogo( & gp.sched)
}
}
sp: = gp.sched.sp
if preempt {
if gp.preemptShrink {
gp.preemptShrink = false
shrinkstack(gp)
}
if gp.preemptStop {
preemptPark(gp)
}
gopreempt_m(gp)
}
...
}
runtime.newstack 会先做一些准备工作并检查当前 Goroutine 是否发出了抢占请求,如果发出了抢占请求:
1.当前线程可以被抢占时,直接调用 runtime.gogo 触发调度器的调度;
2.如果当前 Goroutine 在垃圾回收被 runtime.scanstack 标记成了需要收缩栈,调用 runtime.shrinkstack;
3.如果当前 Goroutine 被 runtime.suspendG 函数挂起,调用 runtime.preemptPark 被动让出当前处理器的控制权并将 Goroutine 的状态修改至 _Gpreempted;
4.调用 runtime.gopreempt_m 主动让出当前处理器的控制权;
如果当前 Goroutine 不需要被抢占,意味着我们需要新的栈空间来支持函数调用和本地变量的初始化,运行时会先检查目标大小的栈是否会溢出:
func newstack() {
...
oldsize: = gp.stack.hi - gp.stack.lo
newsize: = oldsize * 2
if newsize > maxstacksize {
print("runtime: goroutine stack exceeds ", maxstacksize, "-byte limit\n")
print("runtime: sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n")
throw ("stack overflow")
}
casgstatus(gp, _Grunning, _Gcopystack)
copystack(gp, newsize)
casgstatus(gp, _Gcopystack, _Grunning)
gogo( & gp.sched)
}
如果目标栈的大小没有超出程序的限制,我们会将 Goroutine 切换至 _Gcopystack 状态并调用 runtime.copystack 开始栈拷贝。在拷贝栈内存之前,运行时会通过 runtime.stackalloc 分配新的栈空间:
func copystack(gp * g, newsize uintptr) {
old: = gp.stack
used: = old.hi - gp.sched.sp
new: = stackalloc(uint32(newsize))
...
}
新栈的初始化和数据的复制是一个比较简单的过程,不过这不是整个过程中最复杂的地方,我们还需要将指向源栈中内存指向新的栈,在这期间我们需要分别调整以下的指针:
1.调用 runtime.adjustsudogs 或者 runtime.syncadjustsudogs 调整 runtime.sudog 结构体的指针;
2.调用 runtime.memmove 将源栈中的整片内存拷贝到新的栈中;
3.调用 runtime.adjustctxt、runtime.adjustdefers 和 runtime.adjustpanics 调整剩余 Goroutine 相关数据结构的指针;
func copystack(gp * g, newsize uintptr) {
...
var adjinfo adjustinfo
adjinfo.old = old
adjinfo.delta = new.hi - old.hi // 计算新栈和旧栈之间内存地址差
ncopy: = used
if !gp.activeStackChans {
adjustsudogs(gp, & adjinfo)
} else {
adjinfo.sghi = findsghi(gp, old)
ncopy -= syncadjustsudogs(gp, used, & adjinfo)
}
memmove(unsafe.Pointer(new.hi - ncopy), unsafe.Pointer(old.hi - ncopy), ncopy)
adjustctxt(gp, & adjinfo)
adjustdefers(gp, & adjinfo)
adjustpanics(gp, & adjinfo)
gp.stack = new
gp.stackguard0 = new.lo + _StackGuard
gp.sched.sp = new.hi - used
gp.stktopsp += adjinfo.delta
...
stackfree(old)
}
调整指向栈内存的指针都会调用 runtime.adjustpointer,该函数会利用 runtime.adjustinfo 计算的新栈和旧栈之间的内存地址差来调整指针。所有的指针都被调整后,我们就可以更新 Goroutine 的几个变量并通过 runtime.stackfree 释放原始栈的内存空间了。
栈缩容
runtime.shrinkstack 栈缩容时调用的函数,该函数的实现原理非常简单,其中大部分都是检查是否满足缩容前置条件的代码,核心逻辑只有以下这几行:
func shrinkstack(gp * g) {
...
oldsize: = gp.stack.hi - gp.stack.lo
newsize: = oldsize / 2
if newsize < _FixedStack {
return
}
avail: = gp.stack.hi - gp.stack.lo
if used: = gp.stack.hi - gp.sched.sp + _StackLimit;
used >= avail / 4 {
return
}
copystack(gp, newsize)
}
如果要触发栈的缩容,新栈的大小会是原始栈的一半,不过如果新栈的大小低于程序的最低限制 2KB,那么缩容的过程就会停止。
![](data:image/png;base64,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)
图 7-48 栈的缩容操作
运行时只会在栈内存使用不足 1/4 时进行缩容,缩容也会调用扩容时使用的 runtime.copystack 开辟新的栈空间。
7.3.3 小结
栈内存是应用程序中重要的内存空间,它能够支持本地的局部变量和函数调用,栈空间中的变量会与栈一同创建和销毁,这部分内存空间不需要工程师过多的干预和管理,现代的编程语言通过逃逸分析减少了我们的工作量,理解栈空间的分配对于理解 Go 语言的运行时有很大的帮助。