【发布时间】:2019-05-30 15:02:21
【问题描述】:
似乎发生了一些奇怪的事情...我在 tomcat 上有一个应用程序,它曾经位于物理 Windows Server 2008 标准 32 位上,我将它与 vmware 转换器作为 VM 进行 p2v'd。我正在将服务器升级到 windows server 2008 r2 64bit,而不是就地进行,我只是构建另一个并并排并行,它从一开始就是一个全新的 VM,没有 p2v 的东西....
奇怪的部分是我能够在 tomcat9w.exe 配置工具中将最大内存设置为大约 1600 兆字节,这就是该设置的撞墙(我 p2v'd 到 VM 的原始物理内存) ),我可以设置更少的内存,但我不能设置超过 1600,否则当我尝试在 services.msc 中启动 tomcat 服务时,它只会废话。
所以我的想法是,因为无论如何我都必须使用 32 位的 tomcat 和 32 位的 Java JVM(长话短说……),所以最好将它放在 64 位操作系统中(服务器 2008r2 ) 而不是服务器 2008 的标准 32 位。长话短说,从一个新的虚拟机开始,在这个盒子上,我只能将 tomcatw 中的最大总 ram 设置为大约 1000 m (1GB),如果我再设置它就不会了开始,因为我无法启动 tomcat 服务...所以墙大约是 1GB...
作为测试,我将 tomcat(zip 解压缩,不使用 msi 或 exe 安装程序)安装到我自己的客户端工作站笔记本电脑上,运行最新的 windows 10 1809 等,我再次碰到 1GB 的墙,甚至无法启动它高达 1.6GB,即使我的笔记本电脑上有 16GB 内存...
我已经用谷歌搜索了很长时间,显然它与操作系统本身(在本例中为 windows,无论是 windows server 2008 std、2008 r2 或 win10 等)处理每个进程内存限制的方式和线程内存分配默认情况下每个进程只允许大约 1.5 到 2 g ram,这是限制 tomcat apache jvm 而不是程序本身的原因....
但如果这确实是操作系统的差异,我检查了我原来的 32 位 server2008 std,我做 P2V 的那个,它在 boot.ini 或任何允许它的 bcdedit 参数中没有任何特殊设置查看每个进程更多的内存,也没有像 /3GB 标志等这样的东西
我唯一能想到的另一件事是,VM 和物理裸机之间在分配 ram 的方式上可能存在差异,并且我可以获得 tomcat/jvm 运行时所需的更多连续内存物理机上的 32 位操作系统与 VM 中的 64 位操作系统对比?
为什么我可以得到完全相同版本的 Tomcat(一点一点相同)在 32 位版本的服务器 2008 中处理高达 1600m 但在服务器 2008r2 64 位甚至服务器 2016 64 位上我只能让 tomcat 做最大总容量约为 1GB?他们都使用相同的Java版本jvm等等等
【问题讨论】:
-
不知道。由于您无论如何都在虚拟机上,因此请使用 Linux。此外,如果您必须使用 32 位 JVM,那么使用 64 位操作系统会有零点。
-
这是 Windows 和 32 位 x86 架构的限制,与 Java 无关。如果您需要更多,请使用 64 位 java。这些天没有人使用 32 位 Java 是有原因的。
标签: java apache tomcat tomcat8 heap-memory