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.50GHz
和Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
的配置下报这个错误,原因真的太魔幻,初步判断是服务器性能奇葩