JVM 战士请教一个问题,各种语言都是怎样控制内存上限的?

2022-06-02 09:58:50 +08:00
 yazinnnn

类似于 java heap(-Xmx1024m)的设置,各种语言都是怎样设置的?

比较想知道 .net go swift rust node php haskell 等等

5207 次点击
所在节点    程序员
53 条回复
timpaik
2022-06-02 10:12:48 +08:00
Rust: 你创建多少变量 /结构体就占用多少内存,变量出了作用域立马释放就不占内存了,没有虚拟机,也不存在 GC ,更没有内存上限的问题
pengtdyd
2022-06-02 10:21:13 +08:00
C : 内存上限?老子说什么是上限什么就是上限!
andyhuzhill
2022-06-02 10:30:49 +08:00
C C++的内存上限只和操作系统和硬件有关吧
westoy
2022-06-02 10:36:45 +08:00
cgroups 大法好
kkocdko
2022-06-02 10:37:16 +08:00
楼上几位能不能看清题再答。题主是“主观需要上限功能”而不是“被上限所困扰”。

远古时代可以用 ulimit ,现在主要是在内存分配器上动手脚,比如可以 hook 一下 malloc 啥的。
agagega
2022-06-02 10:38:36 +08:00
如果 Java 里面已占用内存超过这个最大值但是又不能 GC 怎么办?
CodeCodeStudy
2022-06-02 10:43:52 +08:00
PHP 如果是 FPM 的话,脚本执行完毕就释放全部内存了。可以在 php.ini 中设置 memory_limit ,如果不限制,将 memory_limit 设置为-1 ,也可以在代码里使用 ini_set('memory_limit', '1G') 来设置
qwq11
2022-06-02 10:46:03 +08:00
据我所知,好像这些语言写的 90%的东西都不需要限制内存,简单搜了下 CLR 好像没有限制内存的选项,剩下 10%可能就是上 cgroups 了吧
Building
2022-06-02 10:48:40 +08:00
语言没有办法控制内存上限,就好像加法不能限制最大数一样,能限制内存上限的是 runtime
yazinnnn
2022-06-02 10:54:48 +08:00
就是说非 vm 语言都需要在系统中控制吗?
像 dart 这种就可以通过虚拟机控制?


假如说用 rust 或者 go 开发了一个 web 服务,想控制他的内存上限在 200m,只能用系统限制,二进制文件是无法限制的

这样?

clr 也不能限制么?
JYii
2022-06-02 11:01:55 +08:00
@agagega jvm 会根据 score ,kill 掉占用内存最大的,👴的服务刚被系统干掉
laowudxf
2022-06-02 11:09:56 +08:00
Swift 貌似没有参数可以控制内存上限,本来就是指针引用计数来控制内存,该用多少就用多少。我的 Swift 后台服务长时间在 32m 以内。
SMGdcAt4kPPQ
2022-06-02 11:10:29 +08:00
CLR 可以限制内存
docs.microsoft .com/en-us/dotnet/core/runtime-config/garbage-collector#heap-limit
arischow
2022-06-02 11:11:37 +08:00
丢进 Docker 然后 limit ?

或者使用本身 Docker 所利用的 cgroups ?
DOLLOR
2022-06-02 11:21:06 +08:00
node 的 [--max-old-space-size=] 应该能起到类似功能,比如
node --max-old-space-size=5120 app.js # Increase limit to 5GB
cheng6563
2022-06-02 11:25:06 +08:00
@agagega 会在分配内存的时候(如 new XXX)弹出 OOM 异常。
这里有个巨坑,A 线程分配占用大内存并保持不动,然后可能会 B 线程分配新内存弹出 OOM 异常,然后 B 线程捕获异常打日志,然后打日志的代码也 OOM ,最后整个线程挂掉并且日志文件没日志。完全失去控制。

生产环境一般会加-XX:+ExitOnOutOfMemoryError 使其 OOM 就直接干掉整个进程直接重启完事。
jiangwei2222
2022-06-02 11:27:32 +08:00
@kkocdko #5 比起 hook malloc 啥的,直接启一个 docker ,然后限制 docker 容器的内存更合适一点吧。自己 hook 稍不注意就出问题了
LeegoYih
2022-06-02 11:30:55 +08:00
语言层面本身没法限制吧,如果要实现的话可以用虚拟机或者容器,不过如果 OOM 会被 KILL 。
hbdh5
2022-06-02 11:39:35 +08:00
@Building 其实如果一定要从语言层面限制也是可以的,比如 rust 或 c++可以自己实现一个超过指定内存就 panic 的内存分配器然后指定为全局内存分配器
northernlights0
2022-06-02 11:45:34 +08:00
有虚拟机的语言在虚拟机层面控制,其它的在操作系统层面

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX