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

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

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

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

5222 次点击
所在节点    程序员
53 条回复
BeautifulSoap
2022-06-02 11:49:34 +08:00
内存上限是系统(或虚拟机)控制的不是语言自身
nothingistrue
2022-06-02 12:22:27 +08:00
JVM 的内存上限是由 VM 而不是又运行程序控制的,严格的说它也是由操作系统(只不过是个 VM )而非应用控制的。另外,JVM 能精确控制的只有堆内存,整个 VM 的内存(即 java.exe 进程占用的内存),它也是不精确控制的。
FrankHB
2022-06-02 12:36:45 +08:00
@Building 你好歹讲点别的吧,加法?明显语言的语义上不限制上限的麻烦得多以至于几乎没什么语言不限制。只要你用的数据类型明确限制了最大元素,加法还能绕出去?就是任意精度数值,内部表示也受到空间的限制而不可能表示任意大的数;真正没限制最大数的怕就是只有 lazy list 之类的模拟了,你倒是统计下有几个语言这么做了?

最简单的,C 无符号数直接钦定不溢出,内部表示占用固定大小。只要语言残废到都是类似的玩意儿再在超出实例时禁止翻译就能静态证明不可超出限制了。阉掉了动态分配和递归的 C 类似物也是这样,只不过不方便算出具体上限是多少,一般要凑。
yolee599
2022-06-02 12:46:30 +08:00
C:可以自己实现 malloc ,给你多少就只能用多少
dalabenba
2022-06-02 12:55:01 +08:00
应用->内存分配库->系统调用
从内存分配库的角度看,需要分配库追踪分配的数量,才能做到控制内存上限
从操作系统角度看,ulimit 可以限制分配虚拟地址的大小,实际物理的占用可能要 cgroup 来做
不管是什么语言,最终都会调到这两个来,vm 类的语言可能在内存分配库之上还有自己的限制(比如你说的 jvm)
yazinnnn
2022-06-02 13:06:57 +08:00
graalvm 利用 native-image 构建的二进制文件依然可以用-Xmx 来设置程序运行时的堆内存大小

那么就表示这个二进制文件仍然包含了一层 jvm,由 jvm 来管理实际程序?
yazinnnn
2022-06-02 13:20:50 +08:00
搜了一下看到 go 有 SetMaxHeap 函数来对堆内存进行设置,这是自带 gc 的语言的标准库实现
https://www.jianshu.com/p/4069d1e3d716
https://groups.google.com/g/golang-codereviews/c/brkajcJ0mhI/m/VyXYtel4BgAJ

那么 rust 有没有类似功能呢?
learningman
2022-06-02 13:57:10 +08:00
rust 不带 gc ,运行的时候二进制里面只有你的代码。
你不写一个那就是没有
Building
2022-06-02 14:04:09 +08:00
@FrankHB 你先搞清楚什么是语言,什么是数据类型吧。如果 Int 的最大值为 255 是因为一个 Int 只用了 8 个字节,和语言没关系,就好像你定义了 a[10],语言也不会限制你写 a[100],只是这样写会报错,同理你想访问 a[10^100000],一点问题都没有,语言不会也不应该考虑去帮你考虑内存够不够的问题
timpaik
2022-06-02 16:41:40 +08:00
@yazinnnn #27 jvm 回收的内存也是程序不用的内存,jvm 大部分情况是定时检测有没有可以回收的内存,而 Rust 不需要 GC 就可以释放这些内存,一旦程序不用就会立即释放。你既然创建了变量申请了内存,又不想让它申请内存,为什么会有这种需求呢
haoliang
2022-06-02 20:10:17 +08:00
python 可以使用 resources.setrlimit (为啥大家都不提这个 setrlimit ,不会是我审错题了吧?)
haoliang
2022-06-02 20:13:47 +08:00
当然它实际就是 ulimit ,不过在语言中我们总要对应到方法吧...
my3157
2022-06-02 20:57:38 +08:00
@westoy cgroups +1 ,如果嫌麻烦,可以用 docker 或者 podman
2NUT
2022-06-02 22:56:51 +08:00
不带 gc 的语言 在编译期就确定了 内存占用了
Alphagocc
2022-06-02 23:32:21 +08:00
@2NUT 了解一下 new malloc 是什么?
zeni123
2022-06-03 05:51:28 +08:00
人工控制内存使用上限
FrankHB
2022-06-03 06:47:04 +08:00
@Building 报错不是限制?
没兴趣浪费金币仔细科普什么叫 ill-formedness 了。
8 字节,嗯嗯……
要不是你这典中典回复成了几个群里的乱窜的表情包,我还真差不多忘了我有回复这楼了……
Building
2022-06-03 09:41:24 +08:00
@FrankHB 报错是编译器行为……你不想报错完全可以强行编译,和语言没有关系。计算机理论里内存是无限的就好像数学世界里数是无限的一样。无论用什么语言,本质上都只是再控制指针操作内存,这是计算机的基本原理,如果语言能限制内存使用,就好像说数学坐标轴最大值只能到 1024 一样
FrankHB
2022-06-03 09:50:44 +08:00
@Building ?我甚至还要在这科普什么叫 conformance 和数学常识了吗?
该报错的不报错,不该报错的报错了,那叫 bug ,不管是编译器还是运行时的。决定什么该报错,该报什么错的是 spec 里的规则。写编译器一般没什么能力同时做整个 spec ,所以直接用的语言的 spec ;就算自己写 spec ,不是照抄的,实际上就发明了语言出来。
内存无限和数学如何明显是你 yy 。都玩那种玩具 model ,那早搞体系结构的就破产了。数学不好请自己补课。数无限?抽象代数我实在不想教,要不你还是先搞清楚比如 C 的无符号数折腾的就是数学上的 modular arithmetic 那套这样的入门经验再说吧。
bugu1986
2022-06-03 10:36:18 +08:00
有的语言没有 gc 不需要设置

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

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

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

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

© 2021 V2EX