Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 32位RHEL PAE系统上的32位jvm_Java_Heap_Heap Memory - Fatal编程技术网

Java 32位RHEL PAE系统上的32位jvm

Java 32位RHEL PAE系统上的32位jvm,java,heap,heap-memory,Java,Heap,Heap Memory,我在64位硬件中安装了RHEL 6 32位系统。内核版本是 2.6.32-431.17.1.el6.i686 我发布了一个非常详细的问题和答案。现在,我有了JVM,它也是32位的。我相信,即使我安装了64位JVM,我也只能使用高达3 GB的内存,因为我只有32位操作系统 所以,我的问题是,单个进程可以有超过4GB的内存,并且仍然可以在32位系统中使用。以类似的方式,如果我在32位操作系统中将最大堆大小设置为2GB,我仍然能够使用内存吗 例如,如果我的java应用程序需要10GB内存,并且我将最

我在64位硬件中安装了RHEL 6 32位系统。内核版本是

2.6.32-431.17.1.el6.i686
我发布了一个非常详细的问题和答案。现在,我有了JVM,它也是32位的。我相信,即使我安装了64位JVM,我也只能使用高达3 GB的内存,因为我只有32位操作系统

所以,我的问题是,单个进程可以有超过4GB的内存,并且仍然可以在32位系统中使用。以类似的方式,如果我在32位操作系统中将最大堆大小设置为2GB,我仍然能够使用内存吗

例如,如果我的java应用程序需要10GB内存,并且我将最大堆大小设置为2GB,那么我的问题是,一旦2GB耗尽,我的应用程序是否会终止或交换地址空间并继续工作

我还想知道最大堆内存限制的合理限制

我相信,即使我安装了64位JVM,我也只能使用高达3 GB的内存,因为我只有32位操作系统

您可以安装它,但它不会运行。无论是JVM还是任何其他程序,只有64位操作系统可以运行64位应用程序

所以,我的问题是,单个进程可以有超过4GB的内存,并且仍然可以在32位系统中使用

不直接。根据操作系统的不同,32位程序只能直接使用大约1.5到3 GB。程序可以使用更大的磁盘缓存。它也可以使用其他本身占用更多内存的程序(总计)

以类似的方式,如果我在32位操作系统中将最大堆大小设置为2GB,我仍然能够使用内存吗

如果您有一个2GB的堆,只要进程不超过整个进程可以使用的内存量,这就可以了。堆当然不是所有使用的内存

如果我的java应用程序需要10GB内存,并且我将最大堆大小设置为2GB,那么我的问题是,一旦2GB耗尽,我的应用程序会终止还是交换地址空间并继续工作

如果需要10 GB以上的内存,则应确保至少有12 GB的主内存和64位操作系统。如果没有足够的资源,将会发生的情况包括程序运行非常慢,或者程序崩溃,或者在极端情况下,整个机器实际上会停止运行

Java应用程序一旦开始交换,运行就会非常糟糕。它们要么爬行停止,要么几乎可以停止机器

我还想知道最大堆内存限制的合理限制


一个好的限制是小于主内存大小。服务器JVM的默认限制是主内存的1/4。如果没有更多信息,我会保持原样。

>我相信即使我安装了64位JVM,

不,你不能这样做。您只能在32位linux操作系统上运行32位应用程序,即使底层硬件是64位

>单个进程的内存可以超过4 GB,并且仍可在32位系统中使用。

不,32位linux安装仅支持32位应用程序,这意味着您的地址空间限制为最大4GB。对于linux,内核需要1GB的空间。本机库、堆栈空间和其他东西也需要一块地址空间,为堆留下大约2-2.5GB的可用内存

该功能使操作系统能够总共使用超过4GB的内存,但单个进程的地址空间仍然限制在4GB以内

>如果我的java应用程序需要10 GB内存,并且我将最大堆大小设置为2 GB,那么我的问题是,一旦2 GB内存耗尽,我的应用程序是否会终止

是的,如果应用程序需要更多内存,它将以

>我还想知道最大堆内存限制的合理限制。


没有通用的答案-这取决于应用程序以及您希望在系统上运行的任何其他内容。

感谢您提供答案。因此,在我的例子中,这里的单个进程是
java-XMX2G
?假设,如果这个java进程超过2GB,应用程序会失败吗?多线程的概念在这里不适用吗?是的,它将被终止(添加到答案中)。这里与多线程相关的唯一一件事是,每个线程都需要一个堆栈,在Oracle JVM中默认为256kB,堆栈空间意味着堆可用内存更少,堆可能会更碎片化,这意味着大内存分配可能没有任何空间可供分配,即使总可用内存超过单个大内存分配所需的空间。谢谢。因此,实际上,即使PAE允许我在RHEL系统中使用整个32GB的RAM,我的
java
应用程序也无法运行,如果它的大小超过4GB。这是正确的吗?另外,如果我使用java打开了一个10 GB的文件,这意味着文件读取也会失败?1。对2.如果以较小的块读取和处理10GB的大文件,则可以读取该文件。当然,你不能把整个10GB的文件都保存在内存中。劳里,谢谢你给我一个详细的答案。因此,最大java堆大小的设置如下所示
java
请求主内存保留一块内存用于程序执行。@Ramesh一个常见的错误是假设堆大小就是所使用的所有内存。事实并非如此。它只是Java程序可用的堆的大小,但不包括JVM可能使用的其他区域,如堆栈、代码缓存、共享库、直接内存缓冲区。因此,是的,JVM会将主内存作为一个连续的区域来请求,但这不是它请求的唯一内容。