如Understanding JVM Memory Allocation and Java Out of Memory: Heap Space所示,当分配堆空间时,JVM不区分物理内存和虚拟内存。当Java对象和计算的内存分配开始发生时,JVM开始区分虚拟和物理内存。给定足够的交换空间(在Linux机器上),为什么会发生内存不足错误? JVM不应该只使用交换空间来完成计算,尽管速度很慢。
例如:RAM:14GB,交换空间:10GB
如果java应用程序需要20GB的空间,它是否无法利用交换空间(虚拟内存)并完成运行应用程序?
关于Java应用程序,堆空间和虚拟内存之间的相互作用是什么?
答案 0 :(得分:4)
你不明白它是如何运作的。
进程从不知道他们使用的内存部分在虚拟内存中,哪些部分在物理内存中。
这是由操作系统以透明的方式管理的。通常是最常用或最近使用的"块" (正确的术语是"页面")内存保存在物理内存中。程序只需要内存,操作系统就是分配它并决定它的每个页面所在的位置(虚拟或物理)。
要使用某些内存,您必须拥有该部分位于物理内存中的页面。将一页内存从虚拟移动到物理是非常昂贵的,所以你必须尽量避免它。因此,通常指定堆小于物理内存,以允许操作系统尝试将所有内容保存在物理内存中(请注意,应为操作系统和其他应用程序留出额外的物理内存空间。)
对于这个问题:
无法利用交换空间(虚拟内存)中的额外8GB并完全运行应用程序
您已告诉JVM最多使用12 GB的内存,现在您希望JVM忽略您的订单并扩展到超过12 GB的内容? JVM是一个好人并且服从你,是你应该决定你是否更喜欢内存限制以确保良好的性能或没有堆限制和风险分页(当然,即使没有明确的限制,由于主机有限制机器操作系统和资源)。
答案 1 :(得分:2)
JVM不应该只使用交换空间来完成计算,尽管速度很慢。
这不仅仅是缓慢的,如果你有旋转磁盘,它可能会慢出50,000多倍。执行GC时,它可以扫描GB / s的对象,但想象一下,它每秒只能扫描100个对象。这意味着现在需要大约一天,而不是花几秒钟。注意:发生这种情况时,机器将无法使用。在Windows上,您甚至无法终止该过程,必须重新启动它以使其停止。
如果我不提供任何-Xmx参数并让java应用程序运行只需要
,我是否能够测试这个?
defualt只不过是主要记忆。即使您将最大堆大小设置为大于主内存,也不意味着它将使用那么多,您也必须设置最小堆。
这可能是一个有趣的测试,看看你的过程是否成功完成,给定任何时间,但我希望它可以花费更多的maginutde订单。