Tomcat java.lang.OutOfMemoryError: Direct buffer memory

参考 Tomcat注册成系统服务并修改内存

1、前言

在使用 smartboot.socket 作为socket服务端进行开发时,项目中有多个服务端,在项目启动时,只有前两个服务端启动成功,后几个服务端启动失败,并报以下错误

Exception in thread "Thread-8" java.lang.OutOfMemoryError: Direct buffer memory
	at java.nio.Bits.reserveMemory(Unknown Source)
	at java.nio.DirectByteBuffer.<init>(Unknown Source)
	at java.nio.ByteBuffer.allocateDirect(Unknown Source)
	at org.smartboot.socket.buffer.BufferPage.allocate0(BufferPage.java:54)
	at org.smartboot.socket.buffer.BufferPage.<init>(BufferPage.java:42)
	at org.smartboot.socket.buffer.BufferPagePool.<init>(BufferPagePool.java:24)
	at org.smartboot.socket.transport.AioQuickServer.start0(AioQuickServer.java:151)
	at org.smartboot.socket.transport.AioQuickServer.start(AioQuickServer.java:121)
	at com.ruoyi.project.coal.socket.processor.XXXXXXProcessor.openXXXXXXServer(XXXXXXProcessor.java:109)
	at com.ruoyi.project.coal.socket.processor.socketServer.lambda$start$0(socketServer.java:42)
	at java.lang.Thread.run(Unknown Source)

使用的smartboot的版本如下

	    <dependency>
	        <groupId>org.smartboot.socket</groupId>
	        <artifactId>aio-core</artifactId>
	        <version>1.4.2</version>
	    </dependency>

2、解决

  • 1、在网上多次查找相关解决方案,初步判断是socket的问题,并将aioQuickServer.setReadBufferSize(512);设置小一点,发现并不能解决问题
  • 2、根据报错初步判断是nio的问题,根据搜索结果,修改 catalina.bat 文件,并在头部添加 set JAVA_OPTS= -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M ,并未解决问题

3、结果

根据多次查找,点击 Tomcat8080w.exe tomcat工具,修改Java的相关设置,将Initial memory pool设置为512MB,将Maximum memory pool设置为1024MB,成功解决问题

4、疑问

本次状况,从tomcat官网下载并安装的tomcat9,在开发人员使用的电脑上没有这个问题,在服务器也就是 Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHzIntel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz 的配置下报这个错误,原因真的太魔幻,初步判断是服务器性能奇葩

posted @ 2021-03-10 21:20  一只桔子2233  阅读(571)  评论(0编辑  收藏  举报