Vij*_*han 1 java garbage-collection jvm jvm-arguments
我已将 xms 设置为 32g,将 xmx 设置为 32g
程序启动了,但是当大约25GB的数据加载到内存中时,该进程被Linux杀死,给出了内存问题的原因。
如果由于xms是32g而已经分配了32g给进程,为什么它会内存不足?xms 是否意味着在开始时分配此内存,如果不能,请不要启动该进程?
有人可以解释一下为什么程序失败吗?
“分配内存”实际上意味着“分配虚拟地址空间”。现代操作系统将进程使用的地址空间与物理内存分开。
因此,使用 -Xms32G,您将获得 32G 的地址空间。
实际内存是按页面和按需分配的,这通常意味着在内存“提交”到页面之前,某些东西必须实际“接触”页面。
因此,实际上,内存只是根据需要而被提交。如果操作系统认为它当时面临实际内存压力,那么您很可能会被杀死。
您可以使用 JVM 选项 -XX:+AlwaysPreTouch 强制 JVM 在启动时触摸每个页面。这样做的可能影响是,在程序进入 main() 之前,JVM 进程在初始化期间启动并被终止。你仍然无法获得记忆,只是早点发现而已。
OOM 杀手就是这样,预触摸也可能会正常,您的代码将运行,但在稍后的某个时间,由于其他系统活动,内核将决定它的可用资源严重不足,并且因为您'这可能是周围最大的过程,你的背上有一个目标。
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |