java.lang.OutOfMemoryError:具有300MB java.exe上限的java堆空间

java.lang.OutOfMemoryError:具有300MB java.exe上限的java堆空间,java,mysql,apache,tomcat,jvm,Java,Mysql,Apache,Tomcat,Jvm,我有一个基于web的应用程序,运行在tomcat5 mysql上,使用JVM和java等。。。它工作正常,但每次它开始为java.exe windows服务器提供大约300MB的内存时,它都会在执行查询或任何占用ram空间的操作时崩溃。但是机器服务器本身有16GB的ram 如何克服这一问题 我得到的错误如下: 错误结果集 处理请求时出现异常4:java.lang.OutOfMemoryError:java堆空间 如果我杀死任务java.exe并重新启动进程,它会再次工作,直到java.exe碰到

我有一个基于web的应用程序,运行在tomcat5 mysql上,使用JVM和java等。。。它工作正常,但每次它开始为java.exe windows服务器提供大约300MB的内存时,它都会在执行查询或任何占用ram空间的操作时崩溃。但是机器服务器本身有16GB的ram

如何克服这一问题

我得到的错误如下:

错误结果集 处理请求时出现异常4:java.lang.OutOfMemoryError:java堆空间

如果我杀死任务java.exe并重新启动进程,它会再次工作,直到java.exe碰到大约300MB的内存墙。。。。我已经尝试过将xmx设置为1600MB或更大的大小,但没有效果,也没有任何区别

有人知道发生了什么吗?

///////////////

用评论更新

好的,我发现有一点很奇怪,如果我将它设置为1024MB或以下的任何值,它就会工作,并且服务会在Windows server所有版本的services.msc中启动。 但如果我将其设置为更高的值,即使是1025mb,它也不会启动,除非我精确地乘以24,比如1024、1048、1072等等。。。这会一直保持到它达到一个极限

在总共只有4GB的windows server 2008 32位上,限制约为1600位,但令人惊讶的是,在内存为吨级的windows server 2008 r2 64位上,限制仅约为1200位

这是完全相同的tomcat5.exe和tomcat5w.exe,并以完全相同的方式作为服务安装。。。所以这毫无意义

为什么超过1024mb的内存增长需要精确的24MB增量? 为什么会有一个不同的墙,低规格的机器能够达到比高规格的机器更高的1600mb,而高规格的机器有更多的ram~1200


我读过一些关于JVM需要连续内存的文章,但这只是胡说八道,毫无意义。关于你的应用程序,没有太多的信息。但是如果我理解正确,并且你在独立的Tomcat服务器上运行它,你应该通过配置文件为Tomcat设置内存配置。在这里您可以找到一个描述-


如果您使用的是Spring Boot或其他自执行技术,请将其添加到说明中。

因为您只提到tomcat5,而不是5.5:请注意,tomcat5.0的最后一个版本是在2004年发布的,但即使您提到的是tomcat5.5,它也在2012年结束。Tomcat 5基于Java5,这就是我要寻找的罪魁祸首:

请注意,这已经是很久以前的事了,我正在解释我至今还记得的东西。我可能只是找到了正确的方向,但不是每个细节

回到那个时代,32位Java虚拟机比现在更为常见,32位Windows上的32位进程通常会遇到一个问题:它们需要连续的内存块——32位进程可以提供的绝对最大内存块,但只有在内存尚未碎片化的情况下才是1.5G左右——不管机器有多少内存

我的一般建议是将-Xmx和-Xms设置为相同的值。分配您在开始时准备分配的任何内容-您需要随时准备分配,并且无需等待触发OutOfMemory条件的任意事件。也许您的应用程序可以处理300或400 MB的内存,但会尝试分配更多的内存,因为您允许它使用大于系统所能提供的-Xmx值进行分配。您更希望在启动流程时检测到这种情况,例如,当您坐在计算机旁边时,而不是周日凌晨3点服务停止时


如果系统中有任何32位组件,请先修复此问题,然后重试。您可能还希望优先升级到可以获得升级和当前知识的环境,而不是落后十年甚至五年以上,这取决于您正在运行的实际版本。

您是否尝试过。。。你知道的。。。。谷歌搜索?你不知道吗。。。阅读我说的那部分我已经用设置xmx之类的东西测试过了,比如1600MB或者更大,但是没有用,也没有任何区别。。。。这基本上就是google或duckduckgo返回的结果?好吧,我下一个最好的猜测是你尝试了-xmx而不是-xmx。除非你给我们一些具体的东西,比如你的JVM标志,否则我所能做的就是在黑暗中摸索。设置正确,请参见屏幕截图。但是一旦java.exe达到300MB左右,它就会持续崩溃。你能发布你的OOME堆栈跟踪吗?截图没有显示任何OOM的证据。另外,您能否验证JVM进程是否确实获得了1.6GiB堆?从JVM本身内部进行检查,查看其最大堆内存设置,以确保该设置生效
. 环境变量没有影响。FWIW,32位JVM-即使在Windows上:-应该能够在开始失败之前分配~1.6GiB的堆。是的,应该:我看到的较少,以前启动过很多。有了这么多的信息,我就可以在主页上用编辑的方式更新评论了,因为这里的评论被限制在100个字符或更少,等等
set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx2048m -XX:PermSize=265m -XX:MaxPermSize=1024m