'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