我在64位硬件中安装了RHEL 6 32位系统。内核版本是,
2.6.32-431.17.1.el6.i686
我发布了非常详细的问答here。现在,我的JVM也是32位。我相信即使我安装了64位JVM,我也只能使用3 GB,因为我只有32位操作系统。
所以,我的问题是,一个进程可以拥有超过4 GB的内存,仍然可以在32位系统中使用。以类似的方式,如果我在32位操作系统中将最大堆大小设置为2 GB,我仍然可以使用内存吗?
例如,如果我的java应用程序需要10 GB内存,并且我将最大堆大小设置为2 GB,那么我的问题是,一旦2 GB耗尽,我的应用程序是否会终止或交换地址空间并继续工作?
我也有兴趣了解最大堆内存限制的良好限制。
答案 0 :(得分:2)
我相信即使我安装了64位JVM,我也只能使用3 GB,因为我只有32位操作系统。
您可以安装它,但它不会运行。只有64位操作系统才能运行64位应用程序,无论是JVM还是任何其他程序。
所以,我的问题是,一个进程可以拥有超过4 GB的内存,仍然可以在32位系统中使用。
不直接。 32位程序只能使用大约1.5到3 GB的直接操作,具体取决于操作系统。程序可以使用更大的磁盘缓存。它也可以使用其他程序本身使用更多内存(总计)
以类似的方式,如果我在32位操作系统中将最大堆大小设置为2 GB,我仍然可以使用内存吗?
如果你有2 GB的堆,这个应该没问题,只要这个过程不会超过整个过程可以使用的内存量。堆当然不是所有使用的内存。
如果我的java应用程序需要10 GB内存,并且我将最大堆大小设置为2 GB,我的问题是,一旦2 GB耗尽,我的应用程序将终止或交换地址空间并继续工作吗?
如果需要10 GB以上,则应确保至少有12 GB的主内存和64位操作系统。如果你没有足够的工作范围,程序运行速度很慢,或者你的程序崩溃,或者在极端情况下整个机器几乎停止运行,会发生什么。
Java应用程序一旦开始交换就会运行得非常糟糕。他们要么爬到停止位置,要么实际上可以停止机器。
我也有兴趣了解最大堆内存限制的良好限制。
好的限制小于主内存大小。服务器JVM的默认限制是主内存的1/4。如果没有更多信息,我会保持原样。
答案 1 :(得分:2)
<强>&GT;我相信即使我安装了64位JVM,
不,你不能这样做。您只能在32位Linux操作系统上运行32位应用程序 - 即使底层硬件是64位。
<强>&GT;单个进程可以拥有4 GB以上的内存,并且仍然可以在32位系统中使用。
不,32位Linux安装仅支持32位应用程序,这意味着您只能使用最大4GB的地址空间。对于linux,内核需要1 GB的空间。本机库,堆栈空间和其他东西也需要一块地址空间,剩下的内存可用于大约2-2.5GB的堆。
PAE功能使操作系统总共可以使用4GB以上的内存,但单个进程仍然限制为4 GB的地址空间。
<强>&GT;如果我的java应用程序需要10 GB内存,并且我将最大堆大小设置为2 GB,我的问题是,一旦2 GB耗尽,我的应用程序将终止
是的,如果应用程序需要更多内存,它将以OutOfMemoryError
终止<强>&GT;我也有兴趣了解最大堆内存限制的良好限制。
没有通用答案 - 这取决于应用程序以及您希望在系统上运行的任何其他内容。