'Q. netty DefaultChannelGroup memory problem
I'm just a novice at making netty project. i made ChatServer with multi rooms.
i could't resolve memory problems when a few Chatroom were made.
i tried 4 ways to resolve memory problems but i can't solve yet :(
@Sharable
public class PacketHandler extends SimpleChannelInboundHandler<Packet> {
private static final ConcurrentHashMap<String, ChannelGroup> roomsInfo =
new ConcurrentHashMap<>(); // store Chat Rooms
private static final AtomicInteger queueCounter = new AtomicInteger();//count unsend message counter
private static final ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
@Override
protected void channelRead0(ChannelHandlerContext ctx, Packet msg) throws Exception {
if(msg.type == PacketType.APPLY) { // sign in
} else if (msg.type == PacketType.ROOMCREATE) { // create room
*ChannelGroup channelGroup = roomsInfo.putIfAbsent(msg.roomname,
new DefaultChannelGroup(ImmediateEventExecutor.INSTANCE));*
if (channelGroup != null) { // exists room name
// error
} else {
roomsInfo.get(msg.roomname).add(ctx.channel()); // add user in chat room.
}
} else if(msg.type == PacketType.ROOMCHAT) {
ChannelGroup room = roomsInfo.get(msg.roomname);
if(room !=null ) {
queueCounter.incrementAndGet();
//(1)
room.writeAndFlush(msg.msg).addListener(future -> {
logger.info("send unsend message ={}", queueCounter.decrementAndGet();
}
});
//(2)
ctx.channel().eventLoop().execute(() -> {
if (room.size() > 1) {
room.writeAndFlush(msg.msg).addListener(future -> {
logger.info("send unsend message ={}", queueCounter.decrementAndGet();
});
}
});
//(3) Executer
executor.execute(() -> {
if (room.size() > 1) {
room.writeAndFlush(packet).addListener(future -> {
logger.info("send unsend message ={}", queueCounter.decrementAndGet();
});
}
});
//(4) pipeline dedicate executor
//pipeline.addLast(new DefaultEventExecutorGroup(100), new PacketHandler());
}
}
}
}
(1) room.writeAndFlush.addListener
(2) ctx.channel().eventLoop().execute(() -> {room.writeAndFlush..}
(3) ThreadPoolExecutor.execute(()->{room.writeAndFlush...}
(4) pipeline.addLast(new DefaultEventExecutorGroup(100), new PacketHandler());
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
