首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM能自动使用更多的交换空间来防止内存错误吗?

JVM能自动使用更多的交换空间来防止内存错误吗?
EN

Stack Overflow用户
提问于 2016-06-17 20:51:49
回答 2查看 7.2K关注 0票数 3

正如理解JVM内存分配和Java内存不足:堆空间中所指出的,当分配堆空间时,JVM并不区分物理内存和虚拟内存。当java对象和计算的内存分配开始发生时,JVM开始区分虚拟内存和物理内存。如果有足够的交换空间(在Linux机器上),为什么会出现内存不足的错误?JVM不应该简单地使用交换空间来完成计算,尽管速度很慢。

RAM: 14 Eg,交换空间:10 Eg

如果一个java应用程序需要20 it的空间,那么它不能利用交换空间(虚拟内存)完成应用程序的运行吗?

对于java应用程序来说,堆空间和虚拟内存之间的相互作用是什么?

EN

回答 2

Stack Overflow用户

发布于 2016-06-17 21:07:08

进程永远不知道它们使用的内存的哪些部分在虚拟内存中,哪些部分在物理内存中。

这是由操作系统以透明的方式管理的。通常,内存的最常用或最近使用的“块”(正确的术语是“页”)保存在物理内存中。程序只需要内存,操作系统就是分配内存的操作系统,它决定每个页面的位置(虚拟的还是物理的)。

要使用某些内存块,您必须有该部分位于物理内存中的页面。将一页内存从虚拟移动到物理是非常昂贵的,所以您必须设法避免它。因此,您通常指定堆小于物理内存,以允许OS尝试将其全部保存在物理内存中(请注意,您应该为OS和其他应用程序留出额外的物理内存)。

至于这个问题:

它不能利用交换空间中额外的8GB (虚拟内存)并完成应用程序的运行吗?

您已经告诉JVM最多使用12 GB内存,现在您希望JVM忽略您的订单并扩展到这12 GB之外?JVM是个好人并服从您的要求,您应该决定是否更喜欢内存限制,以确保良好的性能或没有堆限制和风险分页(当然,即使没有明确的限制,也有由于主机操作系统和资源造成的限制)。

此链接提供更多信息。

票数 4
EN

Stack Overflow用户

发布于 2016-06-20 00:15:53

JVM不应该简单地使用交换空间来完成计算,尽管速度很慢。

它不仅是缓慢的,如果你有旋转磁盘,它可以超过50,000倍的慢。当GC执行时,它可以扫描对象的GB/s,但想象一下它只能每秒扫描100多个对象。这意味着不需要花几秒钟,现在大约需要一天的时间。注意:当这种情况发生时,机器就无法使用了。在Windows上,您甚至不能关闭进程,并且必须驱动它以使其停止。

如果我不提供任何-Xmx参数并让java应用程序运行多久,我就能测试它吗?

它不过是主存而已。即使您将最大堆大小设置为大于主内存,这并不意味着它将使用那么多,您还必须设置最小值。

这可能是一个有趣的测试,看看您的过程是否成功完成,考虑到任何时间,但我希望它会接受许多命令的maginutde更长时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37890214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档