无论如何,要将更多的最大ram设置为Tomcat 32位吗?为什么有1GB和1.6GB的硬墙限制



有些事情似乎正在发生…我在tomcat上有一个应用程序,它曾经位于物理windows服务器2008标准32位上,我用vmware转换器将其作为虚拟机。我正在将服务器升级到windows server 2008 r2 64位,而不是进行就地操作,我只是构建另一个并并行操作,从一开始就是一个全新的虚拟机,没有p2v的东西。。。。

奇怪的是,我能够在tomcat9w.exe配置工具中将最大内存设置为约1600兆字节,这是对该设置的打击(我对虚拟机的原始物理设置),我可以设置更少的内存,但我不能将其设置为超过1600,否则当我尝试在services.msc中启动tomcat服务时,它只会崩溃。

因此,我的想法是,既然我无论如何都必须使用tomcat的32位和Java JVM的32位(长话短说…),那么最好将其放在64位操作系统(服务器2008r2)中,而不是放在服务器2008的标准32位中。长话短说,从一个新的虚拟机,在这个盒子上,我只能将tomcatw中的最大总内存设置为1000米(1GB)左右,如果我再设置,它将不会启动,因为我无法启动tomcat服务。。。所以墙大约是1GB。。。

作为测试,我将tomcat(zip解压缩,不使用msi或exe安装程序)安装到我自己的客户端工作站笔记本电脑上,运行最新的windows 10 1809等,我再次遇到1GB的问题,甚至无法将其提高到1.6GB,尽管我的笔记本电脑上有16GB的ram。。。

我在谷歌上搜索了很长一段时间,很明显,这与操作系统本身(在本例中是windows,无论是windowsserver2008std、2008r2还是win10等)处理每个进程内存限制和线程内存分配的方式有关,默认情况下,每个进程只允许1.5到2g的ram,而这正是限制tomcatapachejvm而不是程序的原因它本身

但是,如果这确实是操作系统的差异,我检查了我原来的32位server2008 std,我做P2V的那个,它在boot.ini中没有任何特殊设置,也没有任何bcdedit参数,允许它每个进程看到更多的ram,也没有像/3GB标志等任何东西

我唯一能想到的另一件事是,虚拟机和物理原始裸金属盒在分配ram的方式上可能有区别,而且当在物理盒上的32位操作系统上运行时,与虚拟机中的64位操作系统相比,我可以获得tomcat/jvm所需的更多连续内存?

为什么我可以在服务器2008的32位版本中获得完全相同版本的Tomcat(一点一点地相同)来处理高达1600m的数据,但在服务器2008r2 64位甚至服务器2016 64位上,我只能让Tomcat最多处理1GB左右的数据?他们都使用相同的Java版本jvm等

请参阅https://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit:

为什么我不能用32位JVM获得更大的堆

32位JVM的最大理论堆限制是4G。由于各种额外的限制,如可用交换、内核地址空间使用、内存碎片和VM开销,在实践中,限制可能会低得多。在大多数现代32位Windows系统上,最大堆大小将在1.4G到1.6G之间。在32位Solaris内核上,地址空间限制为2G。在运行32位虚拟机的64位操作系统上,最大堆大小可能更高,在许多Solaris系统上接近4G。

从Java SE 6起,不支持Windows/3GB boot.ini功能。

如果您的应用程序需要非常大的堆,则应该在支持64位应用程序的操作系统版本上使用64位VM。有关详细信息,请参阅Java SE支持的系统配置。

最新更新