Netty-Socketio Scala 中的内存提升问题
Memory raising problem in Netty-Socketio Scala
我在我的 Scala 应用程序中使用 netty-socketio 1.7.18,但过了一会儿它关闭了应用程序并出现内存不足错误。
我用 Javascript 创建了一个简单的 socketio 客户端,我不断地在浏览器中将网页刷新到 connect/dissconnect,堆大小增加得非常快(每次重新加载约 100mb)并且永远不会释放。它上升到 130gb。
我尝试手动调用 GC,但它没有释放。从 VisualVM 看,原因似乎是 netty 缓冲区。
起初我怀疑自己的Scala代码。我将 Netty-socketio 项目的 Java demo 转换为 Scala 以创建一个简单的服务器。但是我意识到当我将 netty-socketio 与 Scala 一起使用时会发生这个问题。还有其他人有这个问题吗?我正在寻找解决方案。
package com.wstest
import com.corundumstudio.socketio.{AckRequest, Configuration, SocketIOClient, SocketIOServer}
import com.corundumstudio.socketio.listener.DataListener
object ScalaLauncher {
@throws[InterruptedException]
def main(args: Array[String]): Unit = {
val config = new Configuration
config.setHostname("localhost")
config.setPort(9092)
val server = new SocketIOServer(config)
server.addEventListener("chatevent", classOf[String], new DataListener[String]() {
override def onData(client: SocketIOClient, data: String, ackRequest: AckRequest): Unit = { // broadcast messages to all clients
server.getBroadcastOperations.sendEvent("chatevent", data)
}
})
server.start()
}
我用 Config.setWorkerThreads(1)
解决了
每次刷新页面,都会启动一个新的nioEventLoopGroup线程,旧的并没有关闭。
我在我的 Scala 应用程序中使用 netty-socketio 1.7.18,但过了一会儿它关闭了应用程序并出现内存不足错误。
我用 Javascript 创建了一个简单的 socketio 客户端,我不断地在浏览器中将网页刷新到 connect/dissconnect,堆大小增加得非常快(每次重新加载约 100mb)并且永远不会释放。它上升到 130gb。
我尝试手动调用 GC,但它没有释放。从 VisualVM 看,原因似乎是 netty 缓冲区。
起初我怀疑自己的Scala代码。我将 Netty-socketio 项目的 Java demo 转换为 Scala 以创建一个简单的服务器。但是我意识到当我将 netty-socketio 与 Scala 一起使用时会发生这个问题。还有其他人有这个问题吗?我正在寻找解决方案。
package com.wstest
import com.corundumstudio.socketio.{AckRequest, Configuration, SocketIOClient, SocketIOServer}
import com.corundumstudio.socketio.listener.DataListener
object ScalaLauncher {
@throws[InterruptedException]
def main(args: Array[String]): Unit = {
val config = new Configuration
config.setHostname("localhost")
config.setPort(9092)
val server = new SocketIOServer(config)
server.addEventListener("chatevent", classOf[String], new DataListener[String]() {
override def onData(client: SocketIOClient, data: String, ackRequest: AckRequest): Unit = { // broadcast messages to all clients
server.getBroadcastOperations.sendEvent("chatevent", data)
}
})
server.start()
}
我用 Config.setWorkerThreads(1)
解决了
每次刷新页面,都会启动一个新的nioEventLoopGroup线程,旧的并没有关闭。