正如理解JVM内存分配和Java内存不足:堆空间中所指出的,当分配堆空间时,JVM并不区分物理内存和虚拟内存。当java对象和计算的内存分配开始发生时,JVM开始区分虚拟内存和物理内存。如果有足够的交换空间(在Linux机器上),为什么会出现内存不足的错误?JVM不应该简单地使用交换空间来完成计算,尽管速度很慢。
RAM: 14 Eg,交换空间:10 Eg
如果一个java应用程序需要20 it的空间,那么它不能利用交换空间(虚拟内存)完成应用程序的运行吗?
对于java应用程序来说,堆空间和虚拟内存之间的相互作用是什么?
发布于 2016-06-17 21:07:08
进程永远不知道它们使用的内存的哪些部分在虚拟内存中,哪些部分在物理内存中。
这是由操作系统以透明的方式管理的。通常,内存的最常用或最近使用的“块”(正确的术语是“页”)保存在物理内存中。程序只需要内存,操作系统就是分配内存的操作系统,它决定每个页面的位置(虚拟的还是物理的)。
要使用某些内存块,您必须有该部分位于物理内存中的页面。将一页内存从虚拟移动到物理是非常昂贵的,所以您必须设法避免它。因此,您通常指定堆小于物理内存,以允许OS尝试将其全部保存在物理内存中(请注意,您应该为OS和其他应用程序留出额外的物理内存)。
至于这个问题:
它不能利用交换空间中额外的8GB (虚拟内存)并完成应用程序的运行吗?
您已经告诉JVM最多使用12 GB内存,现在您希望JVM忽略您的订单并扩展到这12 GB之外?JVM是个好人并服从您的要求,您应该决定是否更喜欢内存限制,以确保良好的性能或没有堆限制和风险分页(当然,即使没有明确的限制,也有由于主机操作系统和资源造成的限制)。
此链接提供更多信息。
发布于 2016-06-20 00:15:53
JVM不应该简单地使用交换空间来完成计算,尽管速度很慢。
它不仅是缓慢的,如果你有旋转磁盘,它可以超过50,000倍的慢。当GC执行时,它可以扫描对象的GB/s,但想象一下它只能每秒扫描100多个对象。这意味着不需要花几秒钟,现在大约需要一天的时间。注意:当这种情况发生时,机器就无法使用了。在Windows上,您甚至不能关闭进程,并且必须驱动它以使其停止。
如果我不提供任何-Xmx参数并让java应用程序运行多久,我就能测试它吗?
它不过是主存而已。即使您将最大堆大小设置为大于主内存,这并不意味着它将使用那么多,您还必须设置最小值。
这可能是一个有趣的测试,看看您的过程是否成功完成,考虑到任何时间,但我希望它会接受许多命令的maginutde更长时间。
https://stackoverflow.com/questions/37890214
复制相似问题